=====Changing the MDI background colour=====
// by Richard Russell, March 2007//\\ \\ If your program uses a **Multiple Document Interface**, by means of the [[http://www.bbcbasic.co.uk/bbcwin/manual/bbcwing.html#mdilib|MDILIB library]], the background of the **MDI client** area is filled with the **COLOR_APPWORKSPACE** system colour, which by default is a mid-grey. Although you can change this colour in Windows Control Panel that will affect all applications, which you probably don't want to do.\\ \\ It is possible to change the **MDI client** background colour just for your program by //subclassing// its window procedure. To do that you can use the following procedure:
DEF PROCsubclassmdiclient
LOCAL E%, M%, O%, P%
DIM P% 99
SYS "GetWindowLong", @hmdi%, -4 TO O%
[OPT 2
.E% ; WM_ERASEBKGND
push [^MDIBkgdCol%]
call "CreateSolidBrush"
mov edx,[esp+12] ; hDC = wParam
sub esp,16 ; Room for RECT
mov ecx,esp
push eax ; for DeleteObject
push eax ; for FillRect
push ecx ; for FillRect
push edx ; for FillRect
push ecx ; for GetClientRect
push @hmdi%
call "GetClientRect"
call "FillRect"
call "DeleteObject"
add esp,16
mov eax,1
ret 16
.M% cmp dword [esp+8],20 : jz E% : jmp O%
]
SYS "SetWindowLong", @hmdi%, -4, M%
ENDPROC
You should call this procedure immediately after initialising the Multiple Document Interface, as follows:
PROC_initmdi(hWindowMenu%)
MDIBkgdCol% = &800000
PROCsubclassmdiclient
The MDI background colour will be set to whatever RGB value you load into **MDIBkgdCol%**, which in the above example is a dark blue.\\ \\ If you want to change the **MDI client** colour whilst your program is running, you will need to use code similar to the following to force the background to be refreshed:
MDIBkgdCol% = &008000
SYS "InvalidateRect", @hmdi%, 0, 1