Author Topic: Sample Of a Quitbox  (Read 8937 times)

0 Members and 1 Guest are viewing this topic.

Offline eoredson

  • Newbie
  • Posts: 55
  • Let the Farce be with you!
    • View Profile
    • Oredson QB45 Files At Filegate
Sample Of a Quitbox
« on: July 25, 2017, 08:52:37 pm »
I am working on a project (can't tell you what it is yet) and have decided to draw my own boxes (MessageBox, InputBox, etc.)

So, here is a sample of a QuitBox:

Code: QB64: [Select]
  1. REM Sample of QuitBox.
  2.  
  3. ' declare screen save arrays
  4. DIM SHARED TempArrayY(1 TO 2000) AS INTEGER
  5. DIM SHARED TempArrayZ(1 TO 2000) AS INTEGER
  6.  
  7. ' declare box coordinates
  8. DIM SHARED Xcoor3 AS INTEGER, Ycoor3 AS INTEGER
  9.  
  10. ' declare mouse variables
  11. DIM SHARED MouseX AS INTEGER, MouseY AS INTEGER
  12. DIM SHARED MouseButton1 AS INTEGER, MouseButton2 AS INTEGER
  13. DIM SHARED MouseButton3 AS INTEGER, MouseWheel AS INTEGER
  14. DIM SHARED MousePressed AS INTEGER
  15.  
  16. ' declare box settings
  17. CONST QuitBoxText$ = "Quit. Are you sure?"
  18. DIM SHARED QuitBoxBorderColor AS INTEGER
  19. DIM SHARED QuitBoxTitleColor AS INTEGER
  20. DIM SHARED QuitBoxTextColor AS INTEGER
  21. DIM SHARED QuitBoxButton1Color AS INTEGER
  22. DIM SHARED QuitBoxButton2Color AS INTEGER
  23. DIM SHARED QuitBoxBackGround AS INTEGER
  24. DIM SHARED QuitBoxButtonBackGround AS INTEGER
  25.  
  26. ' declare ascii variables
  27. DIM SHARED Hline AS INTEGER, Vline AS INTEGER
  28. DIM SHARED ULcorner AS INTEGER, URcorner AS INTEGER
  29. DIM SHARED LLcorner AS INTEGER, LRcorner AS INTEGER
  30.  
  31. ' declare color constants
  32. CONST Black = 0
  33. CONST Blue = 1
  34. CONST Green = 2
  35. CONST Cyan = 3
  36. CONST Red = 4
  37. CONST Magenta = 5
  38. CONST Brown = 6
  39. CONST White = 7
  40. CONST Gray = 8
  41. CONST LightBlue = 9
  42. CONST LightGreen = 10
  43. CONST LightCyan = 11
  44. CONST LightRed = 12
  45. CONST LightMagenta = 13
  46. CONST Yellow = 14
  47. CONST HighWhite = 15
  48.  
  49. ' set box colors
  50. QuitBoxBorderColor = Yellow
  51. QuitBoxTitleColor = HighWhite
  52. QuitBoxTextColor = HighWhite
  53. QuitBoxButton1Color = HighWhite
  54. QuitBoxButton2Color = White
  55. QuitBoxBackGround = Blue
  56. QuitBoxButtonBackGround = Black
  57.  
  58. ' set ascii characters
  59. Hline = 205
  60. Vline = 186
  61. ULcorner = 201
  62. URcorner = 187
  63. LLcorner = 200
  64. LRcorner = 188
  65.  
  66. ' declare box coordinates.
  67. Xcoor3 = 10
  68. Ycoor3 = 10
  69.  
  70. ' start input loop
  71. PRINT "Quitbox:"
  72.     COLOR Yellow, Black
  73.     PRINT "Enter HELP or QUIT or TEST";
  74.     COLOR HighWhite, Black
  75.     INPUT X$
  76.     X$ = UCASE$(X$)
  77.     IF X$ = "QUIT" THEN END
  78.     IF X$ = "HELP" THEN
  79.         COLOR HighWhite, Black
  80.         PRINT "Mouse: Click on <OK> or <Cancel>"
  81.         PRINT "       Click on title, drag box."
  82.         PRINT "Keyboard: Enter for OK/Cancel, Escape to cancel,"
  83.         PRINT "          Cursor left/right, tab/shift-tab to select button,"
  84.         PRINT "          Control-<cursor> to move box."
  85.         PRINT "          Alt-<cursor> to move box 4 chars."
  86.         PRINT "Colors: Ctrl-A Cycle box background, Ctrl-B Cycle button background,"
  87.         PRINT "        Ctrl-D Cycle border, Ctrl-E Cycle title, Ctrl-F Cycle text,"
  88.         PRINT "        Ctrl-G Cycle OK button, Ctrl-H Cycle Cancel button."
  89.     END IF
  90.     IF X$ = "TEST" THEN
  91.         X = QuitBox
  92.         IF X THEN
  93.             PRINT "Entered OK"
  94.         ELSE
  95.             PRINT "Entered Cancel"
  96.         END IF
  97.     END IF
  98.  
  99. FUNCTION QuitBox
  100. ' store screen area.
  101. CurrentX = CSRLIN
  102. CurrentY = POS(0)
  103. CALL SaveScreen
  104.  
  105. ' draw box
  106. BoxButton = 1
  107. GOSUB DrawQuitBox
  108.  
  109. ' wait for keypress or mouse
  110.     _LIMIT 30
  111.     X$ = INKEY$
  112.     IF LEN(X$) THEN
  113.         SELECT CASE LEN(X$)
  114.             CASE 1
  115.                 SELECT CASE UCASE$(X$)
  116.                     CASE "O"
  117.                         BoxButton = 1
  118.                         EXIT DO
  119.                     CASE "C"
  120.                         BoxButton = 2
  121.                         EXIT DO
  122.                     CASE CHR$(13)
  123.                         EXIT DO
  124.                     CASE CHR$(27)
  125.                         BoxButton = 2
  126.                         EXIT DO
  127.                     CASE CHR$(9) ' tab
  128.                         IF BoxButton = 1 THEN
  129.                             BoxButton = 2
  130.                         ELSE
  131.                             BoxButton = 1
  132.                         END IF
  133.                         GOSUB DrawQuitBoxButtons
  134.                     CASE CHR$(1) ' ctrl-a
  135.                         QuitBoxBackGround = QuitBoxBackGround + 1
  136.                         IF QuitBoxBackGround = 8 THEN
  137.                             QuitBoxBackGround = 0
  138.                         END IF
  139.                         GOSUB DrawQuitBox
  140.                     CASE CHR$(2) ' ctrl-b
  141.                         QuitBoxButtonBackGround = QuitBoxButtonBackGround + 1
  142.                         IF QuitBoxButtonBackGround = 8 THEN
  143.                             QuitBoxButtonBackGround = 0
  144.                         END IF
  145.                         GOSUB DrawQuitBox
  146.                     CASE CHR$(4) ' ctrl-d
  147.                         QuitBoxBorderColor = QuitBoxBorderColor + 1
  148.                         IF QuitBoxBorderColor = 16 THEN
  149.                             QuitBoxBorderColor = 0
  150.                         END IF
  151.                         GOSUB DrawQuitBox
  152.                     CASE CHR$(5) ' ctrl-e
  153.                         QuitBoxTitleColor = QuitBoxTitleColor + 1
  154.                         IF QuitBoxTitleColor = 16 THEN
  155.                             QuitBoxTitleColor = 0
  156.                         END IF
  157.                         GOSUB DrawQuitBox
  158.                     CASE CHR$(6) ' ctrl-f
  159.                         QuitBoxTextColor = QuitBoxTextColor + 1
  160.                         IF QuitBoxTextColor = 16 THEN
  161.                             QuitBoxTextColor = 0
  162.                         END IF
  163.                         GOSUB DrawQuitBox
  164.                     CASE CHR$(7) ' ctrl-g
  165.                         QuitBoxButton1Color = QuitBoxButton1Color + 1
  166.                         IF QuitBoxButton1Color = 16 THEN
  167.                             QuitBoxButton1Color = 0
  168.                         END IF
  169.                         GOSUB DrawQuitBox
  170.                     CASE CHR$(8) ' ctrl-h
  171.                         QuitBoxButton2Color = QuitBoxButton2Color + 1
  172.                         IF QuitBoxButton2Color = 16 THEN
  173.                             QuitBoxButton2Color = 0
  174.                         END IF
  175.                         GOSUB DrawQuitBox
  176.                 END SELECT
  177.             CASE 2
  178.                 SELECT CASE ASC(RIGHT$(X$, 1))
  179.                     CASE 75, 15 ' left/shift-tab
  180.                         IF BoxButton = 2 THEN
  181.                             BoxButton = 1
  182.                         ELSE
  183.                             BoxButton = 2
  184.                         END IF
  185.                         GOSUB DrawQuitBoxButtons
  186.                     CASE 77 ' right
  187.                         IF BoxButton = 1 THEN
  188.                             BoxButton = 2
  189.                         ELSE
  190.                             BoxButton = 1
  191.                         END IF
  192.                         GOSUB DrawQuitBoxButtons
  193.                     CASE 141 ' ctrl-up
  194.                         IF Xcoor3 > 1 THEN
  195.                             Xcoor3 = Xcoor3 - 1
  196.                             CALL RestoreScreen
  197.                             GOSUB DrawQuitBox
  198.                         END IF
  199.                         _KEYCLEAR
  200.                     CASE 145 ' ctrl-down
  201.                         IF Xcoor3 < 18 THEN
  202.                             Xcoor3 = Xcoor3 + 1
  203.                             CALL RestoreScreen
  204.                             GOSUB DrawQuitBox
  205.                         END IF
  206.                         _KEYCLEAR
  207.                     CASE 115 ' ctrl-left
  208.                         IF Ycoor3 > 1 THEN
  209.                             Ycoor3 = Ycoor3 - 1
  210.                             CALL RestoreScreen
  211.                             GOSUB DrawQuitBox
  212.                         END IF
  213.                         _KEYCLEAR
  214.                     CASE 116 ' ctrl-right
  215.                         IF Ycoor3 < 48 THEN
  216.                             Ycoor3 = Ycoor3 + 1
  217.                             CALL RestoreScreen
  218.                             GOSUB DrawQuitBox
  219.                         END IF
  220.                         _KEYCLEAR
  221.                     CASE 152 ' alt-up
  222.                         IF Xcoor3 > 4 THEN
  223.                             Xcoor3 = Xcoor3 - 4
  224.                             CALL RestoreScreen
  225.                             GOSUB DrawQuitBox
  226.                         ELSE
  227.                             IF Xcoor3 > 1 THEN
  228.                                 Xcoor3 = 1
  229.                                 CALL RestoreScreen
  230.                                 GOSUB DrawQuitBox
  231.                             END IF
  232.                         END IF
  233.                         _KEYCLEAR
  234.                     CASE 160 ' alt-dn
  235.                         IF Xcoor3 < 14 THEN
  236.                             Xcoor3 = Xcoor3 + 4
  237.                             CALL RestoreScreen
  238.                             GOSUB DrawQuitBox
  239.                         ELSE
  240.                             IF Xcoor3 < 18 THEN
  241.                                 Xcoor3 = 18
  242.                                 CALL RestoreScreen
  243.                                 GOSUB DrawQuitBox
  244.                             END IF
  245.                         END IF
  246.                         _KEYCLEAR
  247.                     CASE 155 ' alt-left
  248.                         IF Ycoor3 > 4 THEN
  249.                             Ycoor3 = Ycoor3 - 4
  250.                             CALL RestoreScreen
  251.                             GOSUB DrawQuitBox
  252.                         ELSE
  253.                             IF Ycoor3 > 1 THEN
  254.                                 Ycoor3 = 1
  255.                                 CALL RestoreScreen
  256.                                 GOSUB DrawQuitBox
  257.                             END IF
  258.                         END IF
  259.                         _KEYCLEAR
  260.                     CASE 157 ' alt-right
  261.                         IF Ycoor3 < 44 THEN
  262.                             Ycoor3 = Ycoor3 + 4
  263.                             CALL RestoreScreen
  264.                             GOSUB DrawQuitBox
  265.                         ELSE
  266.                             IF Ycoor3 < 48 THEN
  267.                                 Ycoor3 = 48
  268.                                 CALL RestoreScreen
  269.                                 GOSUB DrawQuitBox
  270.                             END IF
  271.                         END IF
  272.                         _KEYCLEAR
  273.                 END SELECT
  274.         END SELECT
  275.     END IF
  276.     X = MouseDriver
  277.     IF MouseButton1 THEN
  278.         ' hover over titlebar
  279.         IF MouseX = Xcoor3 THEN
  280.             IF MouseY >= Ycoor3 AND MouseY <= Ycoor3 + 31 THEN
  281.                 ' store mouse XY during click
  282.                 MouseTempX = MouseX
  283.                 MouseTempY = MouseY
  284.                 DO
  285.                     X = MouseDriver
  286.                     IF MouseX OR MouseY THEN ' drag
  287.                         MoveBox = 0
  288.                         ' difference in mouse X
  289.                         IF MouseX <> MouseTempX THEN
  290.                             IF MouseX >= 1 AND MouseX <= 18 THEN
  291.                                 Xcoor3 = MouseX
  292.                                 MouseTempX = MouseX
  293.                                 MoveBox = -1
  294.                             END IF
  295.                         END IF
  296.                         ' difference in mouse Y
  297.                         IF MouseY <> MouseTempY THEN
  298.                             MoveY = Ycoor3 + (MouseY - MouseTempY)
  299.                             IF MoveY >= 1 AND MoveY <= 48 THEN
  300.                                 Ycoor3 = MoveY
  301.                                 MouseTempY = MouseY
  302.                                 MoveBox = -1
  303.                             END IF
  304.                         END IF
  305.                         ' move box
  306.                         IF MoveBox THEN
  307.                             CALL RestoreScreen
  308.                             GOSUB DrawQuitBox
  309.                         END IF
  310.                     END IF
  311.                 LOOP UNTIL MouseButton1 = 0
  312.             END IF
  313.         ELSE
  314.             IF MouseX = Xcoor3 + 4 THEN ' click on button
  315.                 IF MouseY >= Ycoor3 + 2 AND MouseY <= Ycoor3 + 5 THEN
  316.                     BoxButton = 1
  317.                     EXIT DO
  318.                 END IF
  319.                 IF MouseY >= Ycoor3 + 8 AND MouseY <= Ycoor3 + 15 THEN
  320.                     BoxButton = 2
  321.                     EXIT DO
  322.                 END IF
  323.             END IF
  324.         END IF
  325.     ELSE
  326.         IF MouseX = Xcoor3 + 4 THEN ' mouseover button
  327.             IF MouseY >= Ycoor3 + 2 AND MouseY <= Ycoor3 + 5 THEN
  328.                 IF BoxButton = 2 THEN
  329.                     BoxButton = 1
  330.                     GOSUB DrawQuitBoxButtons
  331.                 END IF
  332.             END IF
  333.             IF MouseY >= Ycoor3 + 8 AND MouseY <= Ycoor3 + 15 THEN
  334.                 IF BoxButton = 1 THEN
  335.                     BoxButton = 2
  336.                     GOSUB DrawQuitBoxButtons
  337.                 END IF
  338.             END IF
  339.         END IF
  340.     END IF
  341.  
  342. ' restore screen area.
  343. CALL RestoreScreen
  344. COLOR White, Black
  345. LOCATE CurrentX, CurrentY, 1
  346. IF BoxButton = 1 THEN
  347.     QuitBox = -1
  348.     QuitBox = 0
  349.  
  350. ' draw box
  351. DrawQuitBox:
  352. COLOR QuitBoxBorderColor, QuitBoxBackGround
  353. LOCATE Xcoor3, Ycoor3, 0
  354. PRINT CHR$(ULcorner) + STRING$(30, Hline) + CHR$(URcorner);
  355. FOR RowX1 = Xcoor3 + 1 TO Xcoor3 + 6
  356.     LOCATE RowX1, Ycoor3, 0
  357.     PRINT CHR$(Vline) + SPACE$(30) + CHR$(Vline);
  358. LOCATE Xcoor3 + 7, Ycoor3, 0
  359. PRINT CHR$(LLcorner) + STRING$(30, Hline) + CHR$(LRcorner);
  360. COLOR QuitBoxTitleColor
  361. LOCATE Xcoor3, Ycoor3 + 12, 0
  362. PRINT " Quit ";
  363.  
  364. ' display quit text
  365. COLOR QuitBoxTextColor
  366. LOCATE Xcoor3 + 2, Ycoor3 + 2, 0
  367. PRINT QuitBoxText$
  368. GOSUB DrawQuitBoxButtons
  369.  
  370. ' display buttuns
  371. DrawQuitBoxButtons:
  372. IF BoxButton = 1 THEN
  373.     LOCATE Xcoor3 + 4, Ycoor3 + 2, 0
  374.     COLOR QuitBoxButton1Color, QuitBoxButtonBackGround
  375.     PRINT "<OK>";
  376.     LOCATE Xcoor3 + 4, Ycoor3 + 8, 0
  377.     COLOR QuitBoxButton2Color, QuitBoxButtonBackGround
  378.     PRINT "<Cancel>";
  379.     LOCATE Xcoor3 + 4, Ycoor3 + 2, 0
  380.     COLOR QuitBoxButton2Color, QuitBoxButtonBackGround
  381.     PRINT "<OK>";
  382.     LOCATE Xcoor3 + 4, Ycoor3 + 8, 0
  383.     COLOR QuitBoxButton1Color, QuitBoxButtonBackGround
  384.     PRINT "<Cancel>";
  385. COLOR White, Black
  386.  
  387. ' screen save
  388. SUB SaveScreen
  389. FOR Var1 = 1 TO 25
  390.     FOR Var2 = 1 TO 80
  391.         TempZ1 = SCREEN(Var1, Var2) ' screen char
  392.         TempZ2 = SCREEN(Var1, Var2, 1) ' char color
  393.         TempArrayY((Var1 - 1) * 80 + Var2) = TempZ1
  394.         TempArrayZ((Var1 - 1) * 80 + Var2) = TempZ2
  395.     NEXT
  396.  
  397. ' screen restore
  398. SUB RestoreScreen
  399. FOR Var1 = 1 TO 25
  400.     FOR Var2 = 1 TO 80
  401.         VarB = INT(TempArrayZ((Var1 - 1) * 80 + Var2) / 16)
  402.         VarF = TempArrayZ((Var1 - 1) * 80 + Var2) MOD 16
  403.         TempZ1 = TempArrayY((Var1 - 1) * 80 + Var2)
  404.         LOCATE Var1, Var2, 1
  405.         COLOR VarF, VarB
  406.         _CONTROLCHR OFF
  407.         PRINT CHR$(TempZ1);
  408.         _CONTROLCHR ON
  409.     NEXT
  410.  
  411. REM processes mouse activity.
  412. FUNCTION MouseDriver
  413. STATIC X1 AS INTEGER, Y1 AS INTEGER ' store old values
  414. MouseX = 0: MouseY = 0
  415.     X = CINT(_MOUSEX): Y = CINT(_MOUSEY) ' X,Y return single
  416.     IF X <> X1 OR Y <> Y1 THEN
  417.         X1 = X: Y1 = Y
  418.         MouseX = Y: MouseY = X ' X,Y are reversed
  419.         WHILE _MOUSEINPUT: WEND ' empty buffer
  420.         MousePressed = -1
  421.     END IF
  422.     MouseButton1 = _MOUSEBUTTON(1)
  423.     IF MouseButton1 THEN
  424.         MouseX = Y1
  425.         MouseY = X1
  426.         MousePressed = -1
  427.     END IF
  428.     MouseButton2 = _MOUSEBUTTON(2)
  429.     IF MouseButton2 THEN
  430.         MouseX = Y1
  431.         MouseY = X1
  432.         MousePressed = -1
  433.     END IF
  434.     MouseButton3 = _MOUSEBUTTON(3)
  435.     IF MouseButton3 THEN
  436.         MousePressed = -1
  437.     END IF
  438.     MouseWheel = _MOUSEWHEEL
  439.  

Tell me what you think.

Thanks, Erik.

Offline Ashish

  • Forum Resident
  • Posts: 630
  • Never Give Up!
    • View Profile
Re: Sample Of a Quitbox
« Reply #1 on: July 25, 2017, 11:51:51 pm »
Nice Work! I like it! :D
if (Me.success) {Me.improve()} else {Me.tryAgain()}


My Projects - https://github.com/AshishKingdom?tab=repositories
OpenGL tutorials - https://ashishkingdom.github.io/OpenGL-Tutorials

Offline STxAxTIC

  • Library Staff
  • Forum Resident
  • Posts: 1091
  • he lives
    • View Profile
Re: Sample Of a Quitbox
« Reply #2 on: July 26, 2017, 09:01:03 am »
Howdy,

I like it. I was pleasantly surprised to type HELP and see that the mouse was enabled - that's not always obvious in screen 0 programs. I've always liked the screen 0 gui because it has that automatic "snap to grid" feeling about it.

If you hadn't noticed yet, it looks like one cannot drag the window all the way to the right; there is a one-character-wide gap left over.

Cant wait to see what you're using this for!
You're not done when it works, you're done when it's right.

Offline eoredson

  • Newbie
  • Posts: 55
  • Let the Farce be with you!
    • View Profile
    • Oredson QB45 Files At Filegate
Re: Sample Of a Quitbox
« Reply #3 on: July 27, 2017, 12:03:38 am »
Ok, here is the QuitBox with:

  Scrolls to right edge,
  Allows button overrides,
  Adds and centers title text.

Code: QB64: [Select]
  1. REM Sample of a QuitBox. v1.1a PD 2017. -ejo
  2.  
  3. ' declare screen save arrays
  4. DIM SHARED TempArrayY(1 TO 2000) AS INTEGER
  5. DIM SHARED TempArrayZ(1 TO 2000) AS INTEGER
  6.  
  7. ' declare box coordinates
  8. DIM SHARED Xcoor3 AS INTEGER, Ycoor3 AS INTEGER
  9.  
  10. ' declare mouse variables
  11. DIM SHARED MouseX AS INTEGER, MouseY AS INTEGER
  12. DIM SHARED MouseButton1 AS INTEGER, MouseButton2 AS INTEGER
  13. DIM SHARED MouseButton3 AS INTEGER, MouseWheel AS INTEGER
  14. DIM SHARED MousePressed AS INTEGER
  15.  
  16. ' declare box settings
  17. CONST QuitBoxTitle$ = " Quit "
  18. CONST QuitBoxText$ = "Quit. Are you sure?"
  19.  
  20. ' declare box colors
  21. DIM SHARED QuitBoxBorderColor AS INTEGER
  22. DIM SHARED QuitBoxTitleColor AS INTEGER
  23. DIM SHARED QuitBoxTextColor AS INTEGER
  24. DIM SHARED QuitBoxButton1Color AS INTEGER
  25. DIM SHARED QuitBoxButton2Color AS INTEGER
  26. DIM SHARED QuitBoxBackGround AS INTEGER
  27. DIM SHARED QuitBoxButtonBackGround AS INTEGER
  28.  
  29. ' declare ascii variables
  30. DIM SHARED Hline AS INTEGER, Vline AS INTEGER
  31. DIM SHARED ULcorner AS INTEGER, URcorner AS INTEGER
  32. DIM SHARED LLcorner AS INTEGER, LRcorner AS INTEGER
  33.  
  34. ' declare color constants
  35. CONST Black = 0
  36. CONST Blue = 1
  37. CONST Green = 2
  38. CONST Cyan = 3
  39. CONST Red = 4
  40. CONST Magenta = 5
  41. CONST Brown = 6
  42. CONST White = 7
  43. CONST Gray = 8
  44. CONST LightBlue = 9
  45. CONST LightGreen = 10
  46. CONST LightCyan = 11
  47. CONST LightRed = 12
  48. CONST LightMagenta = 13
  49. CONST Yellow = 14
  50. CONST HighWhite = 15
  51.  
  52. ' set box colors
  53. QuitBoxBorderColor = Yellow
  54. QuitBoxTitleColor = HighWhite
  55. QuitBoxTextColor = HighWhite
  56. QuitBoxButton1Color = HighWhite
  57. QuitBoxButton2Color = White
  58. QuitBoxBackGround = Blue
  59. QuitBoxButtonBackGround = Black
  60.  
  61. ' set ascii characters
  62. Hline = 205
  63. Vline = 186
  64. ULcorner = 201
  65. URcorner = 187
  66. LLcorner = 200
  67. LRcorner = 188
  68.  
  69. ' declare box coordinates.
  70. Xcoor3 = 10
  71. Ycoor3 = 10
  72.  
  73. ' set box button constants
  74. CONST OKcancel = 1
  75. CONST OK = 2
  76. CONST cancel = 3
  77.  
  78. ' start input loop
  79. PRINT "Quitbox:"
  80.     COLOR Yellow, Black
  81.     PRINT "Enter HELP or QUIT or TEST";
  82.     COLOR HighWhite, Black
  83.     INPUT X$
  84.     X$ = UCASE$(X$)
  85.     IF X$ = "QUIT" THEN END
  86.     IF X$ = "HELP" THEN
  87.         COLOR HighWhite, Black
  88.         PRINT "Mouse: Click on <OK> or <Cancel>"
  89.         PRINT "       Click on title, drag box."
  90.         PRINT "Keyboard: Enter for OK/Cancel, Escape to cancel,"
  91.         PRINT "          Cursor left/right, tab/shift-tab to select button,"
  92.         PRINT "          Control-<cursor> to move box."
  93.         PRINT "          Alt-<cursor> to move box 4 chars."
  94.         PRINT "Colors: Ctrl-A Cycle box background, Ctrl-B Cycle button background,"
  95.         PRINT "        Ctrl-D Cycle border, Ctrl-E Cycle title, Ctrl-F Cycle text,"
  96.         PRINT "        Ctrl-G Cycle OK button, Ctrl-H Cycle Cancel button."
  97.     END IF
  98.     IF X$ = "TEST" THEN
  99.         X = QuitBox(OKcancel)
  100.         IF X THEN
  101.             PRINT "Entered OK"
  102.         ELSE
  103.             PRINT "Entered Cancel"
  104.         END IF
  105.     END IF
  106.  
  107. ' Input: Var
  108. '    1 = both buttons, 2 = ok, 3 = cancel
  109. FUNCTION QuitBox (Var)
  110. ' store screen area.
  111. CurrentX = CSRLIN
  112. CurrentY = POS(0)
  113. CALL SaveScreen
  114.  
  115. ' draw box
  116. IF Var = 1 OR Var = 2 THEN
  117.     BoxButton = 1
  118.     BoxButton = 2
  119. GOSUB DrawQuitBox
  120.  
  121. ' wait for keypress or mouse
  122.     _LIMIT 30
  123.     X$ = INKEY$
  124.     IF LEN(X$) THEN
  125.         SELECT CASE LEN(X$)
  126.             CASE 1
  127.                 SELECT CASE UCASE$(X$)
  128.                     CASE "O"
  129.                         IF Var = 1 OR Var = 2 THEN
  130.                             BoxButton = 1
  131.                             EXIT DO
  132.                         END IF
  133.                     CASE "C"
  134.                         IF Var = 1 OR Var = 3 THEN
  135.                             BoxButton = 2
  136.                             EXIT DO
  137.                         END IF
  138.                     CASE CHR$(13)
  139.                         EXIT DO
  140.                     CASE CHR$(27)
  141.                         BoxButton = 2
  142.                         EXIT DO
  143.                     CASE CHR$(9) ' tab
  144.                         IF BoxButton = 1 THEN
  145.                             IF Var = 1 THEN
  146.                                 BoxButton = 2
  147.                                 GOSUB DrawQuitBoxButtons
  148.                             END IF
  149.                         ELSE
  150.                             IF Var = 1 THEN
  151.                                 BoxButton = 1
  152.                                 GOSUB DrawQuitBoxButtons
  153.                             END IF
  154.                         END IF
  155.                     CASE CHR$(1) ' ctrl-a
  156.                         QuitBoxBackGround = QuitBoxBackGround + 1
  157.                         IF QuitBoxBackGround = 8 THEN
  158.                             QuitBoxBackGround = 0
  159.                         END IF
  160.                         GOSUB DrawQuitBox
  161.                     CASE CHR$(2) ' ctrl-b
  162.                         QuitBoxButtonBackGround = QuitBoxButtonBackGround + 1
  163.                         IF QuitBoxButtonBackGround = 8 THEN
  164.                             QuitBoxButtonBackGround = 0
  165.                         END IF
  166.                         GOSUB DrawQuitBox
  167.                     CASE CHR$(4) ' ctrl-d
  168.                         QuitBoxBorderColor = QuitBoxBorderColor + 1
  169.                         IF QuitBoxBorderColor = 16 THEN
  170.                             QuitBoxBorderColor = 0
  171.                         END IF
  172.                         GOSUB DrawQuitBox
  173.                     CASE CHR$(5) ' ctrl-e
  174.                         QuitBoxTitleColor = QuitBoxTitleColor + 1
  175.                         IF QuitBoxTitleColor = 16 THEN
  176.                             QuitBoxTitleColor = 0
  177.                         END IF
  178.                         GOSUB DrawQuitBox
  179.                     CASE CHR$(6) ' ctrl-f
  180.                         QuitBoxTextColor = QuitBoxTextColor + 1
  181.                         IF QuitBoxTextColor = 16 THEN
  182.                             QuitBoxTextColor = 0
  183.                         END IF
  184.                         GOSUB DrawQuitBox
  185.                     CASE CHR$(7) ' ctrl-g
  186.                         QuitBoxButton1Color = QuitBoxButton1Color + 1
  187.                         IF QuitBoxButton1Color = 16 THEN
  188.                             QuitBoxButton1Color = 0
  189.                         END IF
  190.                         GOSUB DrawQuitBox
  191.                     CASE CHR$(8) ' ctrl-h
  192.                         QuitBoxButton2Color = QuitBoxButton2Color + 1
  193.                         IF QuitBoxButton2Color = 16 THEN
  194.                             QuitBoxButton2Color = 0
  195.                         END IF
  196.                         GOSUB DrawQuitBox
  197.                 END SELECT
  198.             CASE 2
  199.                 SELECT CASE ASC(RIGHT$(X$, 1))
  200.                     CASE 75, 15 ' left/shift-tab
  201.                         IF BoxButton = 2 THEN
  202.                             IF Var = 1 THEN
  203.                                 BoxButton = 1
  204.                                 GOSUB DrawQuitBoxButtons
  205.                             END IF
  206.                         ELSE
  207.                             IF Var = 1 THEN
  208.                                 BoxButton = 2
  209.                                 GOSUB DrawQuitBoxButtons
  210.                             END IF
  211.                         END IF
  212.                     CASE 77 ' right
  213.                         IF BoxButton = 1 THEN
  214.                             IF Var = 1 THEN
  215.                                 BoxButton = 2
  216.                                 GOSUB DrawQuitBoxButtons
  217.                             END IF
  218.                         ELSE
  219.                             IF Var = 1 THEN
  220.                                 BoxButton = 1
  221.                                 GOSUB DrawQuitBoxButtons
  222.                             END IF
  223.                         END IF
  224.                     CASE 141 ' ctrl-up
  225.                         IF Xcoor3 > 1 THEN
  226.                             Xcoor3 = Xcoor3 - 1
  227.                             CALL RestoreScreen
  228.                             GOSUB DrawQuitBox
  229.                         END IF
  230.                         _KEYCLEAR
  231.                     CASE 145 ' ctrl-down
  232.                         IF Xcoor3 < 18 THEN
  233.                             Xcoor3 = Xcoor3 + 1
  234.                             CALL RestoreScreen
  235.                             GOSUB DrawQuitBox
  236.                         END IF
  237.                         _KEYCLEAR
  238.                     CASE 115 ' ctrl-left
  239.                         IF Ycoor3 > 1 THEN
  240.                             Ycoor3 = Ycoor3 - 1
  241.                             CALL RestoreScreen
  242.                             GOSUB DrawQuitBox
  243.                         END IF
  244.                         _KEYCLEAR
  245.                     CASE 116 ' ctrl-right
  246.                         IF Ycoor3 < 49 THEN
  247.                             Ycoor3 = Ycoor3 + 1
  248.                             CALL RestoreScreen
  249.                             GOSUB DrawQuitBox
  250.                         END IF
  251.                         _KEYCLEAR
  252.                     CASE 152 ' alt-up
  253.                         IF Xcoor3 > 4 THEN
  254.                             Xcoor3 = Xcoor3 - 4
  255.                             CALL RestoreScreen
  256.                             GOSUB DrawQuitBox
  257.                         ELSE
  258.                             IF Xcoor3 > 1 THEN
  259.                                 Xcoor3 = 1
  260.                                 CALL RestoreScreen
  261.                                 GOSUB DrawQuitBox
  262.                             END IF
  263.                         END IF
  264.                         _KEYCLEAR
  265.                     CASE 160 ' alt-dn
  266.                         IF Xcoor3 < 14 THEN
  267.                             Xcoor3 = Xcoor3 + 4
  268.                             CALL RestoreScreen
  269.                             GOSUB DrawQuitBox
  270.                         ELSE
  271.                             IF Xcoor3 < 18 THEN
  272.                                 Xcoor3 = 18
  273.                                 CALL RestoreScreen
  274.                                 GOSUB DrawQuitBox
  275.                             END IF
  276.                         END IF
  277.                         _KEYCLEAR
  278.                     CASE 155 ' alt-left
  279.                         IF Ycoor3 > 4 THEN
  280.                             Ycoor3 = Ycoor3 - 4
  281.                             CALL RestoreScreen
  282.                             GOSUB DrawQuitBox
  283.                         ELSE
  284.                             IF Ycoor3 > 1 THEN
  285.                                 Ycoor3 = 1
  286.                                 CALL RestoreScreen
  287.                                 GOSUB DrawQuitBox
  288.                             END IF
  289.                         END IF
  290.                         _KEYCLEAR
  291.                     CASE 157 ' alt-right
  292.                         IF Ycoor3 < 45 THEN
  293.                             Ycoor3 = Ycoor3 + 4
  294.                             CALL RestoreScreen
  295.                             GOSUB DrawQuitBox
  296.                         ELSE
  297.                             IF Ycoor3 < 49 THEN
  298.                                 Ycoor3 = 49
  299.                                 CALL RestoreScreen
  300.                                 GOSUB DrawQuitBox
  301.                             END IF
  302.                         END IF
  303.                         _KEYCLEAR
  304.                 END SELECT
  305.         END SELECT
  306.     END IF
  307.     X = MouseDriver
  308.     IF MouseButton1 THEN
  309.         ' hover over titlebar
  310.         IF MouseX = Xcoor3 THEN
  311.             IF MouseY >= Ycoor3 AND MouseY <= Ycoor3 + 31 THEN
  312.                 ' store mouse XY during click
  313.                 MouseTempX = MouseX
  314.                 MouseTempY = MouseY
  315.                 DO
  316.                     X = MouseDriver
  317.                     IF MouseX OR MouseY THEN ' drag
  318.                         MoveBox = 0
  319.                         ' difference in mouse X
  320.                         IF MouseX <> MouseTempX THEN
  321.                             IF MouseX >= 1 AND MouseX <= 18 THEN
  322.                                 Xcoor3 = MouseX
  323.                                 MouseTempX = MouseX
  324.                                 MoveBox = -1
  325.                             END IF
  326.                         END IF
  327.                         ' difference in mouse Y
  328.                         IF MouseY <> MouseTempY THEN
  329.                             MoveY = Ycoor3 + (MouseY - MouseTempY)
  330.                             IF MoveY >= 1 AND MoveY <= 49 THEN
  331.                                 Ycoor3 = MoveY
  332.                                 MouseTempY = MouseY
  333.                                 MoveBox = -1
  334.                             END IF
  335.                         END IF
  336.                         ' move box
  337.                         IF MoveBox THEN
  338.                             CALL RestoreScreen
  339.                             GOSUB DrawQuitBox
  340.                         END IF
  341.                     END IF
  342.                 LOOP UNTIL MouseButton1 = 0
  343.             END IF
  344.         ELSE
  345.             IF MouseX = Xcoor3 + 4 THEN ' click on button
  346.                 IF MouseY >= Ycoor3 + 2 AND MouseY <= Ycoor3 + 5 THEN
  347.                     IF Var = 1 OR Var = 2 THEN
  348.                         BoxButton = 1
  349.                         EXIT DO
  350.                     END IF
  351.                 END IF
  352.                 IF MouseY >= Ycoor3 + 8 AND MouseY <= Ycoor3 + 15 THEN
  353.                     IF Var = 1 OR Var = 3 THEN
  354.                         BoxButton = 2
  355.                         EXIT DO
  356.                     END IF
  357.                 END IF
  358.             END IF
  359.         END IF
  360.     ELSE
  361.         IF MouseX = Xcoor3 + 4 THEN ' mouseover button
  362.             IF MouseY >= Ycoor3 + 2 AND MouseY <= Ycoor3 + 5 THEN
  363.                 IF BoxButton = 2 THEN
  364.                     IF Var = 1 THEN
  365.                         BoxButton = 1
  366.                         GOSUB DrawQuitBoxButtons
  367.                     END IF
  368.                 END IF
  369.             END IF
  370.             IF MouseY >= Ycoor3 + 8 AND MouseY <= Ycoor3 + 15 THEN
  371.                 IF BoxButton = 1 THEN
  372.                     IF Var = 1 THEN
  373.                         BoxButton = 2
  374.                         GOSUB DrawQuitBoxButtons
  375.                     END IF
  376.                 END IF
  377.             END IF
  378.         END IF
  379.     END IF
  380.  
  381. ' restore screen area.
  382. CALL RestoreScreen
  383. COLOR White, Black
  384. LOCATE CurrentX, CurrentY, 1
  385. IF BoxButton = 1 THEN
  386.     QuitBox = -1
  387.     QuitBox = 0
  388.  
  389. ' draw box
  390. DrawQuitBox:
  391. COLOR QuitBoxBorderColor, QuitBoxBackGround
  392. LOCATE Xcoor3, Ycoor3, 0
  393. PRINT CHR$(ULcorner) + STRING$(30, Hline) + CHR$(URcorner);
  394. FOR RowX1 = Xcoor3 + 1 TO Xcoor3 + 6
  395.     LOCATE RowX1, Ycoor3, 0
  396.     PRINT CHR$(Vline) + SPACE$(30) + CHR$(Vline);
  397. LOCATE Xcoor3 + 7, Ycoor3, 0
  398. PRINT CHR$(LLcorner) + STRING$(30, Hline) + CHR$(LRcorner);
  399.  
  400. ' display box title
  401. COLOR QuitBoxTitleColor
  402. XC = 16 - LEN(QuitBoxTitle$) / 2 ' center of titlebar
  403. LOCATE Xcoor3, Ycoor3 + XC, 0
  404. PRINT QuitBoxTitle$;
  405.  
  406. ' display quit text
  407. COLOR QuitBoxTextColor
  408. LOCATE Xcoor3 + 2, Ycoor3 + 2, 0
  409. PRINT QuitBoxText$
  410. GOSUB DrawQuitBoxButtons
  411.  
  412. ' display buttuns
  413. DrawQuitBoxButtons:
  414. IF BoxButton = 1 THEN
  415.     LOCATE Xcoor3 + 4, Ycoor3 + 2, 0
  416.     COLOR QuitBoxButton1Color, QuitBoxButtonBackGround
  417.     PRINT "<OK>";
  418.     IF Var = 1 THEN
  419.         LOCATE Xcoor3 + 4, Ycoor3 + 8, 0
  420.         COLOR QuitBoxButton2Color, QuitBoxButtonBackGround
  421.         PRINT "<Cancel>";
  422.     END IF
  423.     LOCATE Xcoor3 + 4, Ycoor3 + 8, 0
  424.     COLOR QuitBoxButton1Color, QuitBoxButtonBackGround
  425.     PRINT "<Cancel>";
  426.     IF Var = 1 THEN
  427.         LOCATE Xcoor3 + 4, Ycoor3 + 2, 0
  428.         COLOR QuitBoxButton2Color, QuitBoxButtonBackGround
  429.         PRINT "<OK>";
  430.     END IF
  431. COLOR White, Black
  432.  
  433. ' screen save
  434. SUB SaveScreen
  435. FOR Var1 = 1 TO 25
  436.     FOR Var2 = 1 TO 80
  437.         TempZ1 = SCREEN(Var1, Var2) ' screen char
  438.         TempZ2 = SCREEN(Var1, Var2, 1) ' char color
  439.         TempArrayY((Var1 - 1) * 80 + Var2) = TempZ1
  440.         TempArrayZ((Var1 - 1) * 80 + Var2) = TempZ2
  441.     NEXT
  442.  
  443. ' screen restore
  444. SUB RestoreScreen
  445. FOR Var1 = 1 TO 25
  446.     FOR Var2 = 1 TO 80
  447.         VarB = INT(TempArrayZ((Var1 - 1) * 80 + Var2) / 16)
  448.         VarF = TempArrayZ((Var1 - 1) * 80 + Var2) MOD 16
  449.         TempZ1 = TempArrayY((Var1 - 1) * 80 + Var2)
  450.         LOCATE Var1, Var2, 1
  451.         COLOR VarF, VarB
  452.         _CONTROLCHR OFF
  453.         PRINT CHR$(TempZ1);
  454.         _CONTROLCHR ON
  455.     NEXT
  456.  
  457. REM processes mouse activity.
  458. FUNCTION MouseDriver
  459. STATIC X1 AS INTEGER, Y1 AS INTEGER ' store old values
  460. MouseX = 0: MouseY = 0
  461.     X = CINT(_MOUSEX): Y = CINT(_MOUSEY) ' X,Y return single
  462.     IF X <> X1 OR Y <> Y1 THEN
  463.         X1 = X: Y1 = Y
  464.         MouseX = Y: MouseY = X ' X,Y are reversed
  465.         WHILE _MOUSEINPUT: WEND ' empty buffer
  466.         MousePressed = -1
  467.     END IF
  468.     MouseButton1 = _MOUSEBUTTON(1)
  469.     IF MouseButton1 THEN
  470.         MouseX = Y1
  471.         MouseY = X1
  472.         MousePressed = -1
  473.     END IF
  474.     MouseButton2 = _MOUSEBUTTON(2)
  475.     IF MouseButton2 THEN
  476.         MouseX = Y1
  477.         MouseY = X1
  478.         MousePressed = -1
  479.     END IF
  480.     MouseButton3 = _MOUSEBUTTON(3)
  481.     IF MouseButton3 THEN
  482.         MousePressed = -1
  483.     END IF
  484.     MouseWheel = _MOUSEWHEEL
  485.  

FellippeHeitor

  • Guest
Re: Sample Of a Quitbox
« Reply #4 on: July 27, 2017, 12:08:26 am »
Hi, eoredson,

Good job on this one.

Minor bug report: Clicked ok, didn't move mouse, then entered TEST again. Ok was automatically clicked just because the mouse cursor was hovering it.

Do you plan on modularizing it to be used as a library, detached from your secret project?

Offline eoredson

  • Newbie
  • Posts: 55
  • Let the Farce be with you!
    • View Profile
    • Oredson QB45 Files At Filegate
Re: Sample Of a Quitbox
« Reply #5 on: July 27, 2017, 12:27:30 am »
Hi,

Mouse needs to hover over <OK> to click it as far as I can tell.

This QuitBox is going to be internal to my project.

Erik.

Hint: I am going to write my own InputBox as well..

FellippeHeitor

  • Guest
Re: Sample Of a Quitbox
« Reply #6 on: July 27, 2017, 12:30:39 am »
I may not have reported it clearly enough. Steps are:

  • Entered TEST
  • Hovered AND clicked OK. - box closed.
  • Without moving my mouse pointer, entered TEST again - box showed up
  • Box closed WITHOUT me clicking OK, just because the mouse pointer was still in the same position as before, still hovering the OK button when the dialog came up again.

Offline eoredson

  • Newbie
  • Posts: 55
  • Let the Farce be with you!
    • View Profile
    • Oredson QB45 Files At Filegate
Re: Sample Of a Quitbox
« Reply #7 on: July 27, 2017, 01:00:38 am »
Hmm, odd.. I can't seem to duplicate the bug.

Perhaps the mouse button is getting stuck.

Try this:

Code: QB64: [Select]
  1. REM Sample of a QuitBox. v1.1a PD 2017. -ejo
  2.  
  3. ' declare screen save arrays
  4. DIM SHARED TempArrayY(1 TO 2000) AS INTEGER
  5. DIM SHARED TempArrayZ(1 TO 2000) AS INTEGER
  6.  
  7. ' declare box coordinates
  8. DIM SHARED Xcoor3 AS INTEGER, Ycoor3 AS INTEGER
  9.  
  10. ' declare mouse variables
  11. DIM SHARED MouseX AS INTEGER, MouseY AS INTEGER
  12. DIM SHARED MouseButton1 AS INTEGER, MouseButton2 AS INTEGER
  13. DIM SHARED MouseButton3 AS INTEGER, MouseWheel AS INTEGER
  14. DIM SHARED MousePressed AS INTEGER
  15.  
  16. ' declare box settings
  17. CONST QuitBoxTitle$ = " Quit "
  18. CONST QuitBoxText$ = "Quit. Are you sure?"
  19.  
  20. ' declare box colors
  21. DIM SHARED QuitBoxBorderColor AS INTEGER
  22. DIM SHARED QuitBoxTitleColor AS INTEGER
  23. DIM SHARED QuitBoxTextColor AS INTEGER
  24. DIM SHARED QuitBoxButton1Color AS INTEGER
  25. DIM SHARED QuitBoxButton2Color AS INTEGER
  26. DIM SHARED QuitBoxBackGround AS INTEGER
  27. DIM SHARED QuitBoxButtonBackGround AS INTEGER
  28.  
  29. ' declare ascii variables
  30. DIM SHARED Hline AS INTEGER, Vline AS INTEGER
  31. DIM SHARED ULcorner AS INTEGER, URcorner AS INTEGER
  32. DIM SHARED LLcorner AS INTEGER, LRcorner AS INTEGER
  33.  
  34. ' declare color constants
  35. CONST Black = 0
  36. CONST Blue = 1
  37. CONST Green = 2
  38. CONST Cyan = 3
  39. CONST Red = 4
  40. CONST Magenta = 5
  41. CONST Brown = 6
  42. CONST White = 7
  43. CONST Gray = 8
  44. CONST LightBlue = 9
  45. CONST LightGreen = 10
  46. CONST LightCyan = 11
  47. CONST LightRed = 12
  48. CONST LightMagenta = 13
  49. CONST Yellow = 14
  50. CONST HighWhite = 15
  51.  
  52. ' set box colors
  53. QuitBoxBorderColor = Yellow
  54. QuitBoxTitleColor = HighWhite
  55. QuitBoxTextColor = HighWhite
  56. QuitBoxButton1Color = HighWhite
  57. QuitBoxButton2Color = White
  58. QuitBoxBackGround = Blue
  59. QuitBoxButtonBackGround = Black
  60.  
  61. ' set ascii characters
  62. Hline = 205
  63. Vline = 186
  64. ULcorner = 201
  65. URcorner = 187
  66. LLcorner = 200
  67. LRcorner = 188
  68.  
  69. ' declare box coordinates.
  70. Xcoor3 = 10
  71. Ycoor3 = 10
  72.  
  73. ' set box button constants
  74. CONST OKcancel = 1
  75. CONST OK = 2
  76. CONST cancel = 3
  77.  
  78. ' start input loop
  79. PRINT "Quitbox:"
  80.     COLOR Yellow, Black
  81.     PRINT "Enter HELP or QUIT or TEST";
  82.     COLOR HighWhite, Black
  83.     INPUT X$
  84.     X$ = UCASE$(X$)
  85.     IF X$ = "QUIT" THEN END
  86.     IF X$ = "HELP" THEN
  87.         COLOR HighWhite, Black
  88.         PRINT "Mouse: Click on <OK> or <Cancel>"
  89.         PRINT "       Click on title, drag box."
  90.         PRINT "Keyboard: Enter for OK/Cancel, Escape to cancel,"
  91.         PRINT "          Cursor left/right, tab/shift-tab to select button,"
  92.         PRINT "          Control-<cursor> to move box."
  93.         PRINT "          Alt-<cursor> to move box 4 chars."
  94.         PRINT "Colors: Ctrl-A Cycle box background, Ctrl-B Cycle button background,"
  95.         PRINT "        Ctrl-D Cycle border, Ctrl-E Cycle title, Ctrl-F Cycle text,"
  96.         PRINT "        Ctrl-G Cycle OK button, Ctrl-H Cycle Cancel button."
  97.     END IF
  98.     IF X$ = "TEST" THEN
  99.         X = QuitBox(OKcancel)
  100.         IF X THEN
  101.             PRINT "Entered OK"
  102.         ELSE
  103.             PRINT "Entered Cancel"
  104.         END IF
  105.     END IF
  106.  
  107. ' Input: Var
  108. '    1 = both buttons, 2 = ok, 3 = cancel
  109. FUNCTION QuitBox (Var)
  110. ' store screen area.
  111. CurrentX = CSRLIN
  112. CurrentY = POS(0)
  113. CALL SaveScreen
  114.  
  115. ' reset mouse buttons
  116. MouseButton1 = 0
  117. MouseButton2 = 0
  118. MouseButton3 = 0
  119. X = ClearMouse
  120.  
  121. ' draw box
  122. IF Var = 1 OR Var = 2 THEN
  123.     BoxButton = 1
  124.     BoxButton = 2
  125. GOSUB DrawQuitBox
  126.  
  127. ' wait for keypress or mouse
  128.     _LIMIT 30
  129.     X$ = INKEY$
  130.     IF LEN(X$) THEN
  131.         SELECT CASE LEN(X$)
  132.             CASE 1
  133.                 SELECT CASE UCASE$(X$)
  134.                     CASE "O"
  135.                         IF Var = 1 OR Var = 2 THEN
  136.                             BoxButton = 1
  137.                             EXIT DO
  138.                         END IF
  139.                     CASE "C"
  140.                         IF Var = 1 OR Var = 3 THEN
  141.                             BoxButton = 2
  142.                             EXIT DO
  143.                         END IF
  144.                     CASE CHR$(13)
  145.                         EXIT DO
  146.                     CASE CHR$(27)
  147.                         BoxButton = 2
  148.                         EXIT DO
  149.                     CASE CHR$(9) ' tab
  150.                         IF BoxButton = 1 THEN
  151.                             IF Var = 1 THEN
  152.                                 BoxButton = 2
  153.                                 GOSUB DrawQuitBoxButtons
  154.                             END IF
  155.                         ELSE
  156.                             IF Var = 1 THEN
  157.                                 BoxButton = 1
  158.                                 GOSUB DrawQuitBoxButtons
  159.                             END IF
  160.                         END IF
  161.                     CASE CHR$(1) ' ctrl-a
  162.                         QuitBoxBackGround = QuitBoxBackGround + 1
  163.                         IF QuitBoxBackGround = 8 THEN
  164.                             QuitBoxBackGround = 0
  165.                         END IF
  166.                         GOSUB DrawQuitBox
  167.                     CASE CHR$(2) ' ctrl-b
  168.                         QuitBoxButtonBackGround = QuitBoxButtonBackGround + 1
  169.                         IF QuitBoxButtonBackGround = 8 THEN
  170.                             QuitBoxButtonBackGround = 0
  171.                         END IF
  172.                         GOSUB DrawQuitBox
  173.                     CASE CHR$(4) ' ctrl-d
  174.                         QuitBoxBorderColor = QuitBoxBorderColor + 1
  175.                         IF QuitBoxBorderColor = 16 THEN
  176.                             QuitBoxBorderColor = 0
  177.                         END IF
  178.                         GOSUB DrawQuitBox
  179.                     CASE CHR$(5) ' ctrl-e
  180.                         QuitBoxTitleColor = QuitBoxTitleColor + 1
  181.                         IF QuitBoxTitleColor = 16 THEN
  182.                             QuitBoxTitleColor = 0
  183.                         END IF
  184.                         GOSUB DrawQuitBox
  185.                     CASE CHR$(6) ' ctrl-f
  186.                         QuitBoxTextColor = QuitBoxTextColor + 1
  187.                         IF QuitBoxTextColor = 16 THEN
  188.                             QuitBoxTextColor = 0
  189.                         END IF
  190.                         GOSUB DrawQuitBox
  191.                     CASE CHR$(7) ' ctrl-g
  192.                         QuitBoxButton1Color = QuitBoxButton1Color + 1
  193.                         IF QuitBoxButton1Color = 16 THEN
  194.                             QuitBoxButton1Color = 0
  195.                         END IF
  196.                         GOSUB DrawQuitBox
  197.                     CASE CHR$(8) ' ctrl-h
  198.                         QuitBoxButton2Color = QuitBoxButton2Color + 1
  199.                         IF QuitBoxButton2Color = 16 THEN
  200.                             QuitBoxButton2Color = 0
  201.                         END IF
  202.                         GOSUB DrawQuitBox
  203.                 END SELECT
  204.             CASE 2
  205.                 SELECT CASE ASC(RIGHT$(X$, 1))
  206.                     CASE 75, 15 ' left/shift-tab
  207.                         IF BoxButton = 2 THEN
  208.                             IF Var = 1 THEN
  209.                                 BoxButton = 1
  210.                                 GOSUB DrawQuitBoxButtons
  211.                             END IF
  212.                         ELSE
  213.                             IF Var = 1 THEN
  214.                                 BoxButton = 2
  215.                                 GOSUB DrawQuitBoxButtons
  216.                             END IF
  217.                         END IF
  218.                     CASE 77 ' right
  219.                         IF BoxButton = 1 THEN
  220.                             IF Var = 1 THEN
  221.                                 BoxButton = 2
  222.                                 GOSUB DrawQuitBoxButtons
  223.                             END IF
  224.                         ELSE
  225.                             IF Var = 1 THEN
  226.                                 BoxButton = 1
  227.                                 GOSUB DrawQuitBoxButtons
  228.                             END IF
  229.                         END IF
  230.                     CASE 141 ' ctrl-up
  231.                         IF Xcoor3 > 1 THEN
  232.                             Xcoor3 = Xcoor3 - 1
  233.                             CALL RestoreScreen
  234.                             GOSUB DrawQuitBox
  235.                         END IF
  236.                         _KEYCLEAR
  237.                     CASE 145 ' ctrl-down
  238.                         IF Xcoor3 < 18 THEN
  239.                             Xcoor3 = Xcoor3 + 1
  240.                             CALL RestoreScreen
  241.                             GOSUB DrawQuitBox
  242.                         END IF
  243.                         _KEYCLEAR
  244.                     CASE 115 ' ctrl-left
  245.                         IF Ycoor3 > 1 THEN
  246.                             Ycoor3 = Ycoor3 - 1
  247.                             CALL RestoreScreen
  248.                             GOSUB DrawQuitBox
  249.                         END IF
  250.                         _KEYCLEAR
  251.                     CASE 116 ' ctrl-right
  252.                         IF Ycoor3 < 49 THEN
  253.                             Ycoor3 = Ycoor3 + 1
  254.                             CALL RestoreScreen
  255.                             GOSUB DrawQuitBox
  256.                         END IF
  257.                         _KEYCLEAR
  258.                     CASE 152 ' alt-up
  259.                         IF Xcoor3 > 4 THEN
  260.                             Xcoor3 = Xcoor3 - 4
  261.                             CALL RestoreScreen
  262.                             GOSUB DrawQuitBox
  263.                         ELSE
  264.                             IF Xcoor3 > 1 THEN
  265.                                 Xcoor3 = 1
  266.                                 CALL RestoreScreen
  267.                                 GOSUB DrawQuitBox
  268.                             END IF
  269.                         END IF
  270.                         _KEYCLEAR
  271.                     CASE 160 ' alt-dn
  272.                         IF Xcoor3 < 14 THEN
  273.                             Xcoor3 = Xcoor3 + 4
  274.                             CALL RestoreScreen
  275.                             GOSUB DrawQuitBox
  276.                         ELSE
  277.                             IF Xcoor3 < 18 THEN
  278.                                 Xcoor3 = 18
  279.                                 CALL RestoreScreen
  280.                                 GOSUB DrawQuitBox
  281.                             END IF
  282.                         END IF
  283.                         _KEYCLEAR
  284.                     CASE 155 ' alt-left
  285.                         IF Ycoor3 > 4 THEN
  286.                             Ycoor3 = Ycoor3 - 4
  287.                             CALL RestoreScreen
  288.                             GOSUB DrawQuitBox
  289.                         ELSE
  290.                             IF Ycoor3 > 1 THEN
  291.                                 Ycoor3 = 1
  292.                                 CALL RestoreScreen
  293.                                 GOSUB DrawQuitBox
  294.                             END IF
  295.                         END IF
  296.                         _KEYCLEAR
  297.                     CASE 157 ' alt-right
  298.                         IF Ycoor3 < 45 THEN
  299.                             Ycoor3 = Ycoor3 + 4
  300.                             CALL RestoreScreen
  301.                             GOSUB DrawQuitBox
  302.                         ELSE
  303.                             IF Ycoor3 < 49 THEN
  304.                                 Ycoor3 = 49
  305.                                 CALL RestoreScreen
  306.                                 GOSUB DrawQuitBox
  307.                             END IF
  308.                         END IF
  309.                         _KEYCLEAR
  310.                 END SELECT
  311.         END SELECT
  312.     END IF
  313.     X = MouseDriver
  314.     IF MouseButton1 THEN
  315.         ' hover over titlebar
  316.         IF MouseX = Xcoor3 THEN
  317.             IF MouseY >= Ycoor3 AND MouseY <= Ycoor3 + 31 THEN
  318.                 ' store mouse XY during click
  319.                 MouseTempX = MouseX
  320.                 MouseTempY = MouseY
  321.                 DO
  322.                     X = MouseDriver
  323.                     IF MouseX OR MouseY THEN ' drag
  324.                         MoveBox = 0
  325.                         ' difference in mouse X
  326.                         IF MouseX <> MouseTempX THEN
  327.                             IF MouseX >= 1 AND MouseX <= 18 THEN
  328.                                 Xcoor3 = MouseX
  329.                                 MouseTempX = MouseX
  330.                                 MoveBox = -1
  331.                             END IF
  332.                         END IF
  333.                         ' difference in mouse Y
  334.                         IF MouseY <> MouseTempY THEN
  335.                             MoveY = Ycoor3 + (MouseY - MouseTempY)
  336.                             IF MoveY >= 1 AND MoveY <= 49 THEN
  337.                                 Ycoor3 = MoveY
  338.                                 MouseTempY = MouseY
  339.                                 MoveBox = -1
  340.                             END IF
  341.                         END IF
  342.                         ' move box
  343.                         IF MoveBox THEN
  344.                             CALL RestoreScreen
  345.                             GOSUB DrawQuitBox
  346.                         END IF
  347.                     END IF
  348.                 LOOP UNTIL MouseButton1 = 0
  349.             END IF
  350.         ELSE
  351.             IF MouseX = Xcoor3 + 4 THEN ' click on button
  352.                 IF MouseY >= Ycoor3 + 2 AND MouseY <= Ycoor3 + 5 THEN
  353.                     IF Var = 1 OR Var = 2 THEN
  354.                         BoxButton = 1
  355.                         EXIT DO
  356.                     END IF
  357.                 END IF
  358.                 IF MouseY >= Ycoor3 + 8 AND MouseY <= Ycoor3 + 15 THEN
  359.                     IF Var = 1 OR Var = 3 THEN
  360.                         BoxButton = 2
  361.                         EXIT DO
  362.                     END IF
  363.                 END IF
  364.             END IF
  365.         END IF
  366.     ELSE
  367.         IF MouseX = Xcoor3 + 4 THEN ' mouseover button
  368.             IF MouseY >= Ycoor3 + 2 AND MouseY <= Ycoor3 + 5 THEN
  369.                 IF BoxButton = 2 THEN
  370.                     IF Var = 1 THEN
  371.                         BoxButton = 1
  372.                         GOSUB DrawQuitBoxButtons
  373.                     END IF
  374.                 END IF
  375.             END IF
  376.             IF MouseY >= Ycoor3 + 8 AND MouseY <= Ycoor3 + 15 THEN
  377.                 IF BoxButton = 1 THEN
  378.                     IF Var = 1 THEN
  379.                         BoxButton = 2
  380.                         GOSUB DrawQuitBoxButtons
  381.                     END IF
  382.                 END IF
  383.             END IF
  384.         END IF
  385.     END IF
  386.  
  387. ' restore screen area.
  388. CALL RestoreScreen
  389. COLOR White, Black
  390. LOCATE CurrentX, CurrentY, 1
  391. IF BoxButton = 1 THEN
  392.     QuitBox = -1
  393.     QuitBox = 0
  394.  
  395. ' draw box
  396. DrawQuitBox:
  397. COLOR QuitBoxBorderColor, QuitBoxBackGround
  398. LOCATE Xcoor3, Ycoor3, 0
  399. PRINT CHR$(ULcorner) + STRING$(30, Hline) + CHR$(URcorner);
  400. FOR RowX1 = Xcoor3 + 1 TO Xcoor3 + 6
  401.     LOCATE RowX1, Ycoor3, 0
  402.     PRINT CHR$(Vline) + SPACE$(30) + CHR$(Vline);
  403. LOCATE Xcoor3 + 7, Ycoor3, 0
  404. PRINT CHR$(LLcorner) + STRING$(30, Hline) + CHR$(LRcorner);
  405.  
  406. ' display box title
  407. XC = 16 - LEN(QuitBoxTitle$) / 2 ' center of titlebar
  408. XC = Ycoor3 + XC
  409. IF XC < 1 THEN XC = 1
  410. COLOR QuitBoxTitleColor
  411. LOCATE Xcoor3, XC, 0
  412. PRINT QuitBoxTitle$;
  413.  
  414. ' display quit text
  415. COLOR QuitBoxTextColor
  416. LOCATE Xcoor3 + 2, Ycoor3 + 2, 0
  417. PRINT QuitBoxText$
  418. GOSUB DrawQuitBoxButtons
  419.  
  420. ' display buttuns
  421. DrawQuitBoxButtons:
  422. IF BoxButton = 1 THEN
  423.     LOCATE Xcoor3 + 4, Ycoor3 + 2, 0
  424.     COLOR QuitBoxButton1Color, QuitBoxButtonBackGround
  425.     PRINT "<OK>";
  426.     IF Var = 1 THEN
  427.         LOCATE Xcoor3 + 4, Ycoor3 + 8, 0
  428.         COLOR QuitBoxButton2Color, QuitBoxButtonBackGround
  429.         PRINT "<Cancel>";
  430.     END IF
  431.     LOCATE Xcoor3 + 4, Ycoor3 + 8, 0
  432.     COLOR QuitBoxButton1Color, QuitBoxButtonBackGround
  433.     PRINT "<Cancel>";
  434.     IF Var = 1 THEN
  435.         LOCATE Xcoor3 + 4, Ycoor3 + 2, 0
  436.         COLOR QuitBoxButton2Color, QuitBoxButtonBackGround
  437.         PRINT "<OK>";
  438.     END IF
  439. COLOR White, Black
  440.  
  441. ' screen save
  442. SUB SaveScreen
  443. FOR Var1 = 1 TO 25
  444.     FOR Var2 = 1 TO 80
  445.         TempZ1 = SCREEN(Var1, Var2) ' screen char
  446.         TempZ2 = SCREEN(Var1, Var2, 1) ' char color
  447.         TempArrayY((Var1 - 1) * 80 + Var2) = TempZ1
  448.         TempArrayZ((Var1 - 1) * 80 + Var2) = TempZ2
  449.     NEXT
  450.  
  451. ' screen restore
  452. SUB RestoreScreen
  453. FOR Var1 = 1 TO 25
  454.     FOR Var2 = 1 TO 80
  455.         VarB = INT(TempArrayZ((Var1 - 1) * 80 + Var2) / 16)
  456.         VarF = TempArrayZ((Var1 - 1) * 80 + Var2) MOD 16
  457.         TempZ1 = TempArrayY((Var1 - 1) * 80 + Var2)
  458.         LOCATE Var1, Var2, 1
  459.         COLOR VarF, VarB
  460.         _CONTROLCHR OFF
  461.         PRINT CHR$(TempZ1);
  462.         _CONTROLCHR ON
  463.     NEXT
  464.  
  465. REM clears mouse buffer.
  466. FUNCTION ClearMouse
  467. WHILE _MOUSEINPUT: WEND ' empty buffer
  468.  
  469. REM processes mouse activity.
  470. FUNCTION MouseDriver
  471. STATIC X1 AS INTEGER, Y1 AS INTEGER ' store old values
  472. MouseX = 0: MouseY = 0
  473.     X = CINT(_MOUSEX): Y = CINT(_MOUSEY) ' X,Y return single
  474.     IF X <> X1 OR Y <> Y1 THEN
  475.         X1 = X: Y1 = Y
  476.         MouseX = Y: MouseY = X ' X,Y are reversed
  477.         WHILE _MOUSEINPUT: WEND ' empty buffer
  478.         MousePressed = -1
  479.     END IF
  480.     MouseButton1 = _MOUSEBUTTON(1)
  481.     IF MouseButton1 THEN
  482.         MouseX = Y1
  483.         MouseY = X1
  484.         MousePressed = -1
  485.     END IF
  486.     MouseButton2 = _MOUSEBUTTON(2)
  487.     IF MouseButton2 THEN
  488.         MouseX = Y1
  489.         MouseY = X1
  490.         MousePressed = -1
  491.     END IF
  492.     MouseButton3 = _MOUSEBUTTON(3)
  493.     IF MouseButton3 THEN
  494.         MousePressed = -1
  495.     END IF
  496.     MouseWheel = _MOUSEWHEEL
  497.  

FellippeHeitor

  • Guest
Re: Sample Of a Quitbox
« Reply #8 on: July 27, 2017, 01:37:46 am »
That seems to have fixed it.

Offline eoredson

  • Newbie
  • Posts: 55
  • Let the Farce be with you!
    • View Profile
    • Oredson QB45 Files At Filegate
Re: Sample Of a Quitbox
« Reply #9 on: July 27, 2017, 01:54:25 am »
Ok, excellent. Thanks for working on this with me.

One last hack and I'm finished with it.

Now allows title/text in function call:

Code: QB64: [Select]
  1. REM Sample of a QuitBox. v1.1a PD 2017. -ejo
  2.  
  3. ' declare screen save arrays
  4. DIM SHARED TempArrayY(1 TO 2000) AS INTEGER
  5. DIM SHARED TempArrayZ(1 TO 2000) AS INTEGER
  6.  
  7. ' declare box coordinates
  8. DIM SHARED Xcoor3 AS INTEGER, Ycoor3 AS INTEGER
  9.  
  10. ' declare mouse variables
  11. DIM SHARED MouseX AS INTEGER, MouseY AS INTEGER
  12. DIM SHARED MouseButton1 AS INTEGER, MouseButton2 AS INTEGER
  13. DIM SHARED MouseButton3 AS INTEGER, MouseWheel AS INTEGER
  14. DIM SHARED MousePressed AS INTEGER
  15.  
  16. ' declare box colors
  17. DIM SHARED QuitBoxBorderColor AS INTEGER
  18. DIM SHARED QuitBoxTitleColor AS INTEGER
  19. DIM SHARED QuitBoxTextColor AS INTEGER
  20. DIM SHARED QuitBoxButton1Color AS INTEGER
  21. DIM SHARED QuitBoxButton2Color AS INTEGER
  22. DIM SHARED QuitBoxBackGround AS INTEGER
  23. DIM SHARED QuitBoxButtonBackGround AS INTEGER
  24.  
  25. ' declare ascii variables
  26. DIM SHARED Hline AS INTEGER, Vline AS INTEGER
  27. DIM SHARED ULcorner AS INTEGER, URcorner AS INTEGER
  28. DIM SHARED LLcorner AS INTEGER, LRcorner AS INTEGER
  29.  
  30. ' declare color constants
  31. CONST Black = 0
  32. CONST Blue = 1
  33. CONST Green = 2
  34. CONST Cyan = 3
  35. CONST Red = 4
  36. CONST Magenta = 5
  37. CONST Brown = 6
  38. CONST White = 7
  39. CONST Gray = 8
  40. CONST LightBlue = 9
  41. CONST LightGreen = 10
  42. CONST LightCyan = 11
  43. CONST LightRed = 12
  44. CONST LightMagenta = 13
  45. CONST Yellow = 14
  46. CONST HighWhite = 15
  47.  
  48. ' set box colors
  49. QuitBoxBorderColor = Yellow
  50. QuitBoxTitleColor = HighWhite
  51. QuitBoxTextColor = HighWhite
  52. QuitBoxButton1Color = HighWhite
  53. QuitBoxButton2Color = White
  54. QuitBoxBackGround = Blue
  55. QuitBoxButtonBackGround = Black
  56.  
  57. ' set ascii characters
  58. Hline = 205
  59. Vline = 186
  60. ULcorner = 201
  61. URcorner = 187
  62. LLcorner = 200
  63. LRcorner = 188
  64.  
  65. ' declare box coordinates.
  66. Xcoor3 = 10
  67. Ycoor3 = 10
  68.  
  69. ' set box button constants
  70. CONST OKcancel = 1
  71. CONST OK = 2
  72. CONST cancel = 3
  73.  
  74. ' start input loop
  75. PRINT "Quitbox:"
  76.     COLOR Yellow, Black
  77.     PRINT "Enter HELP or QUIT or TEST";
  78.     COLOR HighWhite, Black
  79.     INPUT X$
  80.     X$ = UCASE$(X$)
  81.     IF X$ = "QUIT" THEN END
  82.     IF X$ = "HELP" THEN
  83.         COLOR HighWhite, Black
  84.         PRINT "Mouse: Click on <OK> or <Cancel>"
  85.         PRINT "       Click on title, drag box."
  86.         PRINT "Keyboard: Enter for OK/Cancel, Escape to cancel,"
  87.         PRINT "          Cursor left/right, tab/shift-tab to select button,"
  88.         PRINT "          Control-<cursor> to move box."
  89.         PRINT "          Alt-<cursor> to move box 4 chars."
  90.         PRINT "Colors: Ctrl-A Cycle box background, Ctrl-B Cycle button background,"
  91.         PRINT "        Ctrl-D Cycle border, Ctrl-E Cycle title, Ctrl-F Cycle text,"
  92.         PRINT "        Ctrl-G Cycle OK button, Ctrl-H Cycle Cancel button."
  93.     END IF
  94.     IF X$ = "TEST" THEN
  95.         X = QuitBox(OKcancel, " Quit ", "Quit. Are you sure?")
  96.         IF X THEN
  97.             PRINT "Entered OK"
  98.         ELSE
  99.             PRINT "Entered Cancel"
  100.         END IF
  101.     END IF
  102.  
  103. ' Input: Buttons
  104. '    1 = both buttons, 2 = ok, 3 = cancel
  105. FUNCTION QuitBox (Buttons, QuitBoxTitle$, QuitBoxText$)
  106. ' store screen area.
  107. CurrentX = CSRLIN
  108. CurrentY = POS(0)
  109. CALL SaveScreen
  110.  
  111. ' reset mouse buttons
  112. MouseButton1 = 0
  113. MouseButton2 = 0
  114. MouseButton3 = 0
  115. X = ClearMouse
  116.  
  117. ' draw box
  118. IF Buttons = 1 OR Buttons = 2 THEN
  119.     BoxButton = 1
  120.     BoxButton = 2
  121. GOSUB DrawQuitBox
  122.  
  123. ' wait for keypress or mouse
  124.     _LIMIT 30
  125.     X$ = INKEY$
  126.     IF LEN(X$) THEN
  127.         SELECT CASE LEN(X$)
  128.             CASE 1
  129.                 SELECT CASE UCASE$(X$)
  130.                     CASE "O"
  131.                         IF Buttons = 1 OR Buttons = 2 THEN
  132.                             BoxButton = 1
  133.                             EXIT DO
  134.                         END IF
  135.                     CASE "C"
  136.                         IF Buttons = 1 OR Buttons = 3 THEN
  137.                             BoxButton = 2
  138.                             EXIT DO
  139.                         END IF
  140.                     CASE CHR$(13)
  141.                         EXIT DO
  142.                     CASE CHR$(27)
  143.                         BoxButton = 2
  144.                         EXIT DO
  145.                     CASE CHR$(9) ' tab
  146.                         IF BoxButton = 1 THEN
  147.                             IF Buttons = 1 THEN
  148.                                 BoxButton = 2
  149.                                 GOSUB DrawQuitBoxButtons
  150.                             END IF
  151.                         ELSE
  152.                             IF Buttons = 1 THEN
  153.                                 BoxButton = 1
  154.                                 GOSUB DrawQuitBoxButtons
  155.                             END IF
  156.                         END IF
  157.                     CASE CHR$(1) ' ctrl-a
  158.                         QuitBoxBackGround = QuitBoxBackGround + 1
  159.                         IF QuitBoxBackGround = 8 THEN
  160.                             QuitBoxBackGround = 0
  161.                         END IF
  162.                         GOSUB DrawQuitBox
  163.                     CASE CHR$(2) ' ctrl-b
  164.                         QuitBoxButtonBackGround = QuitBoxButtonBackGround + 1
  165.                         IF QuitBoxButtonBackGround = 8 THEN
  166.                             QuitBoxButtonBackGround = 0
  167.                         END IF
  168.                         GOSUB DrawQuitBox
  169.                     CASE CHR$(4) ' ctrl-d
  170.                         QuitBoxBorderColor = QuitBoxBorderColor + 1
  171.                         IF QuitBoxBorderColor = 16 THEN
  172.                             QuitBoxBorderColor = 0
  173.                         END IF
  174.                         GOSUB DrawQuitBox
  175.                     CASE CHR$(5) ' ctrl-e
  176.                         QuitBoxTitleColor = QuitBoxTitleColor + 1
  177.                         IF QuitBoxTitleColor = 16 THEN
  178.                             QuitBoxTitleColor = 0
  179.                         END IF
  180.                         GOSUB DrawQuitBox
  181.                     CASE CHR$(6) ' ctrl-f
  182.                         QuitBoxTextColor = QuitBoxTextColor + 1
  183.                         IF QuitBoxTextColor = 16 THEN
  184.                             QuitBoxTextColor = 0
  185.                         END IF
  186.                         GOSUB DrawQuitBox
  187.                     CASE CHR$(7) ' ctrl-g
  188.                         QuitBoxButton1Color = QuitBoxButton1Color + 1
  189.                         IF QuitBoxButton1Color = 16 THEN
  190.                             QuitBoxButton1Color = 0
  191.                         END IF
  192.                         GOSUB DrawQuitBox
  193.                     CASE CHR$(8) ' ctrl-h
  194.                         QuitBoxButton2Color = QuitBoxButton2Color + 1
  195.                         IF QuitBoxButton2Color = 16 THEN
  196.                             QuitBoxButton2Color = 0
  197.                         END IF
  198.                         GOSUB DrawQuitBox
  199.                 END SELECT
  200.             CASE 2
  201.                 SELECT CASE ASC(RIGHT$(X$, 1))
  202.                     CASE 75, 15 ' left/shift-tab
  203.                         IF BoxButton = 2 THEN
  204.                             IF Buttons = 1 THEN
  205.                                 BoxButton = 1
  206.                                 GOSUB DrawQuitBoxButtons
  207.                             END IF
  208.                         ELSE
  209.                             IF Buttons = 1 THEN
  210.                                 BoxButton = 2
  211.                                 GOSUB DrawQuitBoxButtons
  212.                             END IF
  213.                         END IF
  214.                     CASE 77 ' right
  215.                         IF BoxButton = 1 THEN
  216.                             IF Buttons = 1 THEN
  217.                                 BoxButton = 2
  218.                                 GOSUB DrawQuitBoxButtons
  219.                             END IF
  220.                         ELSE
  221.                             IF Buttons = 1 THEN
  222.                                 BoxButton = 1
  223.                                 GOSUB DrawQuitBoxButtons
  224.                             END IF
  225.                         END IF
  226.                     CASE 141 ' ctrl-up
  227.                         IF Xcoor3 > 1 THEN
  228.                             Xcoor3 = Xcoor3 - 1
  229.                             CALL RestoreScreen
  230.                             GOSUB DrawQuitBox
  231.                         END IF
  232.                         _KEYCLEAR
  233.                     CASE 145 ' ctrl-down
  234.                         IF Xcoor3 < 18 THEN
  235.                             Xcoor3 = Xcoor3 + 1
  236.                             CALL RestoreScreen
  237.                             GOSUB DrawQuitBox
  238.                         END IF
  239.                         _KEYCLEAR
  240.                     CASE 115 ' ctrl-left
  241.                         IF Ycoor3 > 1 THEN
  242.                             Ycoor3 = Ycoor3 - 1
  243.                             CALL RestoreScreen
  244.                             GOSUB DrawQuitBox
  245.                         END IF
  246.                         _KEYCLEAR
  247.                     CASE 116 ' ctrl-right
  248.                         IF Ycoor3 < 49 THEN
  249.                             Ycoor3 = Ycoor3 + 1
  250.                             CALL RestoreScreen
  251.                             GOSUB DrawQuitBox
  252.                         END IF
  253.                         _KEYCLEAR
  254.                     CASE 152 ' alt-up
  255.                         IF Xcoor3 > 4 THEN
  256.                             Xcoor3 = Xcoor3 - 4
  257.                             CALL RestoreScreen
  258.                             GOSUB DrawQuitBox
  259.                         ELSE
  260.                             IF Xcoor3 > 1 THEN
  261.                                 Xcoor3 = 1
  262.                                 CALL RestoreScreen
  263.                                 GOSUB DrawQuitBox
  264.                             END IF
  265.                         END IF
  266.                         _KEYCLEAR
  267.                     CASE 160 ' alt-dn
  268.                         IF Xcoor3 < 14 THEN
  269.                             Xcoor3 = Xcoor3 + 4
  270.                             CALL RestoreScreen
  271.                             GOSUB DrawQuitBox
  272.                         ELSE
  273.                             IF Xcoor3 < 18 THEN
  274.                                 Xcoor3 = 18
  275.                                 CALL RestoreScreen
  276.                                 GOSUB DrawQuitBox
  277.                             END IF
  278.                         END IF
  279.                         _KEYCLEAR
  280.                     CASE 155 ' alt-left
  281.                         IF Ycoor3 > 4 THEN
  282.                             Ycoor3 = Ycoor3 - 4
  283.                             CALL RestoreScreen
  284.                             GOSUB DrawQuitBox
  285.                         ELSE
  286.                             IF Ycoor3 > 1 THEN
  287.                                 Ycoor3 = 1
  288.                                 CALL RestoreScreen
  289.                                 GOSUB DrawQuitBox
  290.                             END IF
  291.                         END IF
  292.                         _KEYCLEAR
  293.                     CASE 157 ' alt-right
  294.                         IF Ycoor3 < 45 THEN
  295.                             Ycoor3 = Ycoor3 + 4
  296.                             CALL RestoreScreen
  297.                             GOSUB DrawQuitBox
  298.                         ELSE
  299.                             IF Ycoor3 < 49 THEN
  300.                                 Ycoor3 = 49
  301.                                 CALL RestoreScreen
  302.                                 GOSUB DrawQuitBox
  303.                             END IF
  304.                         END IF
  305.                         _KEYCLEAR
  306.                 END SELECT
  307.         END SELECT
  308.     END IF
  309.     X = MouseDriver
  310.     IF MouseButton1 THEN
  311.         ' hover over titlebar
  312.         IF MouseX = Xcoor3 THEN
  313.             IF MouseY >= Ycoor3 AND MouseY <= Ycoor3 + 31 THEN
  314.                 ' store mouse XY during click
  315.                 MouseTempX = MouseX
  316.                 MouseTempY = MouseY
  317.                 DO
  318.                     X = MouseDriver
  319.                     IF MouseX OR MouseY THEN ' drag
  320.                         MoveBox = 0
  321.                         ' difference in mouse X
  322.                         IF MouseX <> MouseTempX THEN
  323.                             IF MouseX >= 1 AND MouseX <= 18 THEN
  324.                                 Xcoor3 = MouseX
  325.                                 MouseTempX = MouseX
  326.                                 MoveBox = -1
  327.                             END IF
  328.                         END IF
  329.                         ' difference in mouse Y
  330.                         IF MouseY <> MouseTempY THEN
  331.                             MoveY = Ycoor3 + (MouseY - MouseTempY)
  332.                             IF MoveY >= 1 AND MoveY <= 49 THEN
  333.                                 Ycoor3 = MoveY
  334.                                 MouseTempY = MouseY
  335.                                 MoveBox = -1
  336.                             END IF
  337.                         END IF
  338.                         ' move box
  339.                         IF MoveBox THEN
  340.                             CALL RestoreScreen
  341.                             GOSUB DrawQuitBox
  342.                         END IF
  343.                     END IF
  344.                 LOOP UNTIL MouseButton1 = 0
  345.             END IF
  346.         ELSE
  347.             IF MouseX = Xcoor3 + 4 THEN ' click on button
  348.                 IF MouseY >= Ycoor3 + 2 AND MouseY <= Ycoor3 + 5 THEN
  349.                     IF Buttons = 1 OR Buttons = 2 THEN
  350.                         BoxButton = 1
  351.                         EXIT DO
  352.                     END IF
  353.                 END IF
  354.                 IF MouseY >= Ycoor3 + 8 AND MouseY <= Ycoor3 + 15 THEN
  355.                     IF Buttons = 1 OR Buttons = 3 THEN
  356.                         BoxButton = 2
  357.                         EXIT DO
  358.                     END IF
  359.                 END IF
  360.             END IF
  361.         END IF
  362.     ELSE
  363.         IF MouseX = Xcoor3 + 4 THEN ' mouseover button
  364.             IF MouseY >= Ycoor3 + 2 AND MouseY <= Ycoor3 + 5 THEN
  365.                 IF BoxButton = 2 THEN
  366.                     IF Buttons = 1 THEN
  367.                         BoxButton = 1
  368.                         GOSUB DrawQuitBoxButtons
  369.                     END IF
  370.                 END IF
  371.             END IF
  372.             IF MouseY >= Ycoor3 + 8 AND MouseY <= Ycoor3 + 15 THEN
  373.                 IF BoxButton = 1 THEN
  374.                     IF Buttons = 1 THEN
  375.                         BoxButton = 2
  376.                         GOSUB DrawQuitBoxButtons
  377.                     END IF
  378.                 END IF
  379.             END IF
  380.         END IF
  381.     END IF
  382.  
  383. ' restore screen area.
  384. CALL RestoreScreen
  385. COLOR White, Black
  386. LOCATE CurrentX, CurrentY, 1
  387. IF BoxButton = 1 THEN
  388.     QuitBox = -1
  389.     QuitBox = 0
  390.  
  391. ' draw box
  392. DrawQuitBox:
  393. COLOR QuitBoxBorderColor, QuitBoxBackGround
  394. LOCATE Xcoor3, Ycoor3, 0
  395. PRINT CHR$(ULcorner) + STRING$(30, Hline) + CHR$(URcorner);
  396. FOR RowX1 = Xcoor3 + 1 TO Xcoor3 + 6
  397.     LOCATE RowX1, Ycoor3, 0
  398.     PRINT CHR$(Vline) + SPACE$(30) + CHR$(Vline);
  399. LOCATE Xcoor3 + 7, Ycoor3, 0
  400. PRINT CHR$(LLcorner) + STRING$(30, Hline) + CHR$(LRcorner);
  401.  
  402. ' display box title
  403. XC = 16 - LEN(QuitBoxTitle$) / 2 ' center of titlebar
  404. XC = Ycoor3 + XC
  405. IF XC < 1 THEN XC = 1
  406. COLOR QuitBoxTitleColor
  407. LOCATE Xcoor3, XC, 0
  408. PRINT QuitBoxTitle$;
  409.  
  410. ' display quit text
  411. COLOR QuitBoxTextColor
  412. LOCATE Xcoor3 + 2, Ycoor3 + 2, 0
  413. PRINT QuitBoxText$
  414. GOSUB DrawQuitBoxButtons
  415.  
  416. ' display buttuns
  417. DrawQuitBoxButtons:
  418. IF BoxButton = 1 THEN
  419.     LOCATE Xcoor3 + 4, Ycoor3 + 2, 0
  420.     COLOR QuitBoxButton1Color, QuitBoxButtonBackGround
  421.     PRINT "<OK>";
  422.     IF Buttons = 1 THEN
  423.         LOCATE Xcoor3 + 4, Ycoor3 + 8, 0
  424.         COLOR QuitBoxButton2Color, QuitBoxButtonBackGround
  425.         PRINT "<Cancel>";
  426.     END IF
  427.     LOCATE Xcoor3 + 4, Ycoor3 + 8, 0
  428.     COLOR QuitBoxButton1Color, QuitBoxButtonBackGround
  429.     PRINT "<Cancel>";
  430.     IF Buttons = 1 THEN
  431.         LOCATE Xcoor3 + 4, Ycoor3 + 2, 0
  432.         COLOR QuitBoxButton2Color, QuitBoxButtonBackGround
  433.         PRINT "<OK>";
  434.     END IF
  435. COLOR White, Black
  436.  
  437. ' screen save
  438. SUB SaveScreen
  439. FOR Var1 = 1 TO 25
  440.     FOR Var2 = 1 TO 80
  441.         TempZ1 = SCREEN(Var1, Var2) ' screen char
  442.         TempZ2 = SCREEN(Var1, Var2, 1) ' char color
  443.         TempArrayY((Var1 - 1) * 80 + Var2) = TempZ1
  444.         TempArrayZ((Var1 - 1) * 80 + Var2) = TempZ2
  445.     NEXT
  446.  
  447. ' screen restore
  448. SUB RestoreScreen
  449. FOR Var1 = 1 TO 25
  450.     FOR Var2 = 1 TO 80
  451.         VarB = INT(TempArrayZ((Var1 - 1) * 80 + Var2) / 16)
  452.         VarF = TempArrayZ((Var1 - 1) * 80 + Var2) MOD 16
  453.         TempZ1 = TempArrayY((Var1 - 1) * 80 + Var2)
  454.         LOCATE Var1, Var2, 1
  455.         COLOR VarF, VarB
  456.         _CONTROLCHR OFF
  457.         PRINT CHR$(TempZ1);
  458.         _CONTROLCHR ON
  459.     NEXT
  460.  
  461. REM clears mouse buffer.
  462. FUNCTION ClearMouse
  463. WHILE _MOUSEINPUT: WEND ' empty buffer
  464.  
  465. REM processes mouse activity.
  466. FUNCTION MouseDriver
  467. STATIC X1 AS INTEGER, Y1 AS INTEGER ' store old values
  468. MouseX = 0: MouseY = 0
  469.     X = CINT(_MOUSEX): Y = CINT(_MOUSEY) ' X,Y return single
  470.     IF X <> X1 OR Y <> Y1 THEN
  471.         X1 = X: Y1 = Y
  472.         MouseX = Y: MouseY = X ' X,Y are reversed
  473.         WHILE _MOUSEINPUT: WEND ' empty buffer
  474.         MousePressed = -1
  475.     END IF
  476.     MouseButton1 = _MOUSEBUTTON(1)
  477.     IF MouseButton1 THEN
  478.         MouseX = Y1
  479.         MouseY = X1
  480.         MousePressed = -1
  481.     END IF
  482.     MouseButton2 = _MOUSEBUTTON(2)
  483.     IF MouseButton2 THEN
  484.         MouseX = Y1
  485.         MouseY = X1
  486.         MousePressed = -1
  487.     END IF
  488.     MouseButton3 = _MOUSEBUTTON(3)
  489.     IF MouseButton3 THEN
  490.         MousePressed = -1
  491.     END IF
  492.     MouseWheel = _MOUSEWHEEL
  493.