Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Line 1 disappears
#1
I have a question.
My program starts with the command $RESIZE:SMOOTH in SCREEN 0 (text mode).
Everything works perfectly but if you want to maximize the screen the first row disappears. What can I do about it?
I know there is a command _FULLSCREEN _SQUAREPIXELS , _SMOOTH but I don't want it.

Here's a demo:

Code: (Select All)
$RESIZE:SMOOTH
FOR a = 1 TO 10
  LOCATE a, 1: PRINT "This is line"; a;
NEXT


PRINT: PRINT "Now maximize this Window and then return to a regular Window."
PRINT "As you can see, the first two rows disappear. How to solve?"
PRINT "Press any key to quit this program"
x$ = INPUT$(1)
SYSTEM
Reply
#2
Hi @BDS107,

This works on my system Win 10 Laptop:
Code: (Select All)
$Resize:On
For a = 1 To 10
    Locate a, 1: Print "This is line"; a;
Next


Print: Print "Now maximize this Window and then return to a regular Window."
Print "As you can see, the first two rows disappear. How to solve?"
Print "Press any key to quit this program"
x$ = Input$(1)
System

There is not a loss of clarity of image. It appears to increase rows and cols as opposed to expanding the image.
b = b + ...
Reply
#3
When I maximize, the first 4 rows disappear on my display, but when I minimize, they come back as normal.

Something is off with the scaling factor when $RESIZE:SMOOTH and $RESIZE:STRETCH is used, and this needs to be recorded as a bug so it can be fixed when one of the developers have time to look into the issue.

Right now, the only solution would be to use $RESIZE:ON and then check for size changes and scale your display manually to adjust for them, and that's a lot more work than just adding a simple $RESIZE:SMOOTH to the top of your code.
Reply
#4
The issue here can be easily diagnosed and explained.

Take the code you wrote and run it. Now, manually grab the corner of the screen and drag the window until it'd be full screen. As soon as you let go of the mouse button, the screen then will "snap" back to where it can display as much as possible with maintaining the original aspect ration.

When you click the maximize button, it doesn't center the screen and place black bars along the edges to maintain your aspect ratio (like you see with many older movies and tv shows when they play on todays modern television sets). Instead, it scales the image so that it fills the screen completely, even if it has to clip off part of the screen when it does so.

The choices here, for this type of fix, would be to:

1) Either stretch the image to fit the whole screen and not pay any attention to the aspect ratio. (Some shows do this, which can lead to distorted faces and elongated circles and such being prominent.)

or

2) Maximize the image so that it fits the screen as much as possible, and then center it and add those black border bars along the edges to maintain the proper ratio.

I don't know which of these solutions would be easiest to implement, or even if OpenGL allows for easily making such adjustments, so the fix for this might be a while before it comes. For now, I'd suggest just grabbing the corner of the window and resizing it to the size you want with the mouse, without making use of that maximize button at all.
Reply
#5
Issue reported and logged in the repo. I don't know when someone will sort out where it's at and get around to fixing it, but at least it's a known issue now. https://github.com/QB64-Phoenix-Edition/...issues/128
Reply
#6
Hi, thanks for looking and reporting this as a bug.
When I'm home I'll take a look at this.
Now, I'm on vacation in London.
Reply
#7
Here's another and better example.
When $RESIZE:SMOOTH is used, the first 2 lines disappear during maximization. Resize Window is then OK.
With $RESIZE:ON maximizing and resize doesn't work for me.
Code: (Select All)
$RESIZE:ON
SCREEN 0, 1, 0, 0: COLOR 15, 1: CLS
DEFINT A-Z
LOCATE 1, 1: PRINT CHR$(219); CHR$(223); CHR$(221); "......"; CHR$(222); STRING$(69, 223); CHR$(219);
FOR a = 2 TO 24: LOCATE a, 1: PRINT CHR$(219); SPACE$(78); CHR$(219);: NEXT
LOCATE 25, 1: PRINT CHR$(219); STRING$(25, 220); CHR$(221); "......."; CHR$(222); STRING$(44, 220); CHR$(219);
COLOR 14
FOR a = 1 TO 25
  LOCATE a, a + 3: PRINT "Line"; STR$(a);
NEXT
COLOR 7: LOCATE 7, 25: PRINT "Now maximize or resize this Window";
LOCATE 8, 25: PRINT "Change the first line in the code from";
LOCATE 9, 25: PRINT "'$RESIZE:ON' to '$RESIZE:SMOOTH'"
LOCATE 11, 25: PRINT "Press ANY key to end";
DO: LOOP UNTIL INKEY$ <> ""
SYSTEM

Here the result:
   
Reply
#8
With $RESIZE:ON, you have to manually handle resize events yourself. They screen doesn't auto-scale. (Think of how the IDE adds rows and columns but doesn't adjust font size, when you expand it.)
Reply
#9
Here's a quick demo of manually using $RESIZE:ON to change the number of rows and columns which are available on screen, without scaling the display image itself:

Code: (Select All)
$Resize:On
activeScreen = _NewImage(80, 25, 0) 'standard screen 0
Screen activeScreen

DrawBorder
_Delay .25
clearInitialResize = _Resize 'clear thr size change from where QB64 first starts up

Do
    If _Resize Then
        tempScreen = _NewImage(_ResizeWidth \ _FontWidth, _ResizeHeight \ _FontHeight, 0)
        Screen tempScreen
        _FreeImage activeScreen
        activeScreen = tempScreen
        DrawBorder
    End If
Loop Until _KeyHit
System

Sub DrawBorder
    Color 4
    For x = 1 To _Width
        Locate 1, x: Print Chr$(219);
        Locate _Height, x: Print Chr$(219);
    Next
    For y = 1 To _Height
        Locate y, 1: Print Chr$(219);
        Locate y, _Width: Print Chr$(219);
    Next
    Color 15
    Locate _Height \ 2, _Width \ 2 - 12: Print "Resize On, Non-Scale Demo"
    Locate _Height \ 2 + 2, 3: Print "Width:"; _Width
    Locate _Height \ 2 + 3, 3: Print "Height:"; _Height
End Sub
Reply
#10
And here's a demo of using $RESIZE:ON to scale the screen, like you were originally intending:

Code: (Select All)
$Resize:On
activeScreen = _NewImage(640, 400, 256) '256 color screen so we can use _PUTIMAGE for scaling
viewScreen = _NewImage(640, 400, 256) 'a second screen to scale to
Screen viewScreen
_Dest activeScreen: _Source activeScreen

DrawBorder
_Delay .25
clearInitialResize = _Resize 'clear thr size change from where QB64 first starts up

Do
    If _Resize Then
        tempScreen = _NewImage(_ResizeWidth, _ResizeHeight, 256)
        Screen tempScreen
        _FreeImage viewScreen
        viewScreen = tempScreen
    End If
    _PutImage , activeScreen, viewScreen
    _Limit 30
Loop Until _KeyHit
System

Sub DrawBorder
    Color 4
    For x = 1 To _Width \ _FontWidth
        Locate 1, x: Print Chr$(219);
        Locate _Height \ _FontHeight, x: Print Chr$(219);
    Next
    For y = 1 To _Height \ _FontHeight
        Locate y, 1: Print Chr$(219);
        Locate y, _Width \ _FontWidth: Print Chr$(219);
    Next
    Color 15
    Locate 3, 3: Print "Resize On, Scale-Size Demo"
    Locate 5, 3: Print "Width:"; _Width
    Locate 6, 3: Print "Height:"; _Height
End Sub

Note that it's up to you to maintain the same aspect ratio, which I didn't do here to illustrate how things can "stretch" and distort if you don't do so when manually resizing like this.  Wink
Reply




Users browsing this thread: 2 Guest(s)