06-15-2024, 03:36 AM
This makes using _RESIZE related statements a real PITA.
In my opinion the SCREEN statement should not trigger a _RESIZE event. The SCREEN statement is given exact dimensions to use that _WIDTH and _HEIGHT will inherit. Dragging the borders should trigger a _RESIZE event since _RESIZEWIDTH and _RESIZEHIGHT will be needed because exact dimensions can't be resolved while the user is resizing the borders.
I've got code I'm trying to write that auto-adjusts the the client area as the user resizes the borders. This double triggering of _RESIZE and the need to wait for _RESIZE to catch up after a SCREEN statement does not seem right to me.
This code from the $RESIZE page in the Wiki shows this perfectly. If you drag the right border back and forth enough you can eventually get the border stuck in a jitter (you can tell because circles will be drawn while not dragging the border and if you look really closely you'll see the right border jittering slightly).
I'm dealing with this same jitter problem because of SCREEN triggering _RESIZE events.
In my opinion the SCREEN statement should not trigger a _RESIZE event. The SCREEN statement is given exact dimensions to use that _WIDTH and _HEIGHT will inherit. Dragging the borders should trigger a _RESIZE event since _RESIZEWIDTH and _RESIZEHIGHT will be needed because exact dimensions can't be resolved while the user is resizing the borders.
I've got code I'm trying to write that auto-adjusts the the client area as the user resizes the borders. This double triggering of _RESIZE and the need to wait for _RESIZE to catch up after a SCREEN statement does not seem right to me.
This code from the $RESIZE page in the Wiki shows this perfectly. If you drag the right border back and forth enough you can eventually get the border stuck in a jitter (you can tell because circles will be drawn while not dragging the border and if you look really closely you'll see the right border jittering slightly).
I'm dealing with this same jitter problem because of SCREEN triggering _RESIZE events.
Code: (Select All)
$RESIZE:ON
SCREEN _NEWIMAGE(160, 140, 32)
_DELAY 0.1
_SCREENMOVE 20, 20
_DISPLAY
' CLEAR _RESIZE FLAG BY READING IT ONCE
temp& = _RESIZE
DO
_LIMIT 60
IF CheckResize(_SOURCE) = -1 THEN
FOR i = 1 TO 10
CIRCLE (RND * _WIDTH(0) - 1, RND * _HEIGHT(0) - 1), RND * 100 + 5, _RGB32(RND * 255, RND * 255, RND * 255)
NEXT
ELSE
FOR i = 1 TO 200
PSET (RND * _WIDTH(0) - 1, RND * _HEIGHT(0) - 1), _RGB32(RND * 255, RND * 255, RND * 255)
NEXT
END IF
_DISPLAY
k& = _KEYHIT
LOOP UNTIL k& = 27 OR k& = 32
SYSTEM
' *************************************************************************************************
' * *
' * CheckResize: This FUNCTION checks if the user resized the window, and if so, recreates the *
' * ORIGINAL SCREEN image to the new window size. *
' * *
' * Developer Note: You must use $RESIZE:ON, $RESIZE:SMOOTH, or $RESIZE:SMOOTH at *
' * the beginning of your project for this to work. *
' * This FUNCTION only works in QB64 version 1.000 and up. *
' * *
' *************************************************************************************************
FUNCTION CheckResize (CurrentScreen AS _UNSIGNED LONG)
' *** Define local variable for temporary screen
DIM TempScreen AS _UNSIGNED LONG
CheckResize = 0
' *** Check to see if the user resized the window. If so, change the SCREEN image to the correct size.
IF _RESIZE THEN
' *** First, create a copy of the current SCREEN image.
TempScreen = _COPYIMAGE(CurrentScreen, 32)
' *** Set the SCREEN to the copied image, releasing the current SCREEN image.
SCREEN TempScreen
' *** Remove (FREE) the original SCREEN image.
_FREEIMAGE CurrentScreen
' *** Create a new "original" SCREEN image.
CurrentScreen = _NEWIMAGE(_RESIZEWIDTH, _RESIZEHEIGHT, 32)
' *** Set the SCREEN to the new "original" image, releasing the copied SCREEN image.
SCREEN CurrentScreen
' DRAW PREVIOUS SCREEN ON THE NEW ONE
_PUTIMAGE (0, 0), TempScreen, CurrentScreen
_DISPLAY
' *** Remove (FREE) the copied SCREEN image.
_FREEIMAGE TempScreen
' *** Tell the caller there was a resize
CheckResize = -1
END IF
END FUNCTION