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.