User Tools

Site Tools


limiting_20the_20size_20of_20a_20window

Limiting the size of a window

by Richard Russell, October 2007

Normally windows are either fully resizable by the user (by dragging a corner or edge), which is the default, or are a fixed size (see the Help documentation under Fixing the window size). However, occasionally you may want to allow the user to resize the window, but only within certain limits. You can do that by handling the WM_SIZING Windows message, which you can do using the SUBCLASS library.

The code below illustrates how to restrict the maximum size of the window to 800 x 600 pixels. Firstly some initialisation:

        INSTALL @lib$+"SUBCLASS"
        INSTALL @lib$+"NOWAIT"
        MAXW% = 800
        MAXH% = 600
        WM_SIZING = 532
 
        PROC_subclass(WM_SIZING, FN_wmsizing())
        ON ERROR PROC_unsubclass : SYS "MessageBox", @hwnd%, REPORT$, 0, 48 : QUIT

You should ensure that you are using version 1.3 or later of SUBCLASS.BBC.

Now the program can perform whatever task it is designed for; for the purposes of the example this is just an empty loop:

        PRINT "Window size is limited to ";MAXW%;" by ";MAXH%
        REPEAT
          PROCwait(1)
        UNTIL FALSE
        END

Note that while subclassing is in effect you must avoid statements which may take a long time to execute, such as GET, INKEY, INPUT and WAIT (WAIT should be avoided even if the delay is short). You should also be careful not to use SOUND when the sound queue is already full. You can find suitable replacements for these functions in the NOWAIT library.

Finally here is the routine for handling the WM_SIZING messages:

        DEF FN_wmsizing(msg%, side%, lprc%)
        LOCAL rc{}
        DIM rc{l%,t%,r%,b%}
        !(^rc{}+4) = lprc%
        IF rc.r%-rc.l% > MAXW% THEN
          CASE side% OF
            WHEN 1,4,7: rc.l% = rc.r%-MAXW%
            WHEN 2,5,8: rc.r% = rc.l%+MAXW%
          ENDCASE
        ENDIF
        IF rc.b%-rc.t% > MAXH% THEN
          CASE side% OF
            WHEN 3,4,5: rc.t% = rc.b%-MAXH%
            WHEN 6,7,8: rc.b% = rc.t%+MAXH%
          ENDCASE
        ENDIF
        = 1

If you want to limit the minimum size of the window instead the maximum size the routine would be:

        DEF FN_wmsizing(msg%, side%, lprc%)
        LOCAL rc{}
        DIM rc{l%,t%,r%,b%}
        !(^rc{}+4) = lprc%
        IF rc.r%-rc.l% < MINW% THEN
          CASE side% OF
            WHEN 1,4,7: rc.l% = rc.r%-MINW%
            WHEN 2,5,8: rc.r% = rc.l%+MINW%
          ENDCASE
        ENDIF
        IF rc.b%-rc.t% < MINH% THEN
          CASE side% OF
            WHEN 3,4,5: rc.t% = rc.b%-MINH%
            WHEN 6,7,8: rc.b% = rc.t%+MINH%
          ENDCASE
        ENDIF
        = 1

I'm sure you can see how to limit both the minimum and maximum sizes, if desired.

This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information
limiting_20the_20size_20of_20a_20window.txt · Last modified: 2018/04/16 14:51 by richardrussell