if NOT (csDesigning in ComponentState) then
begin
SetWindowLong((Owner as TForm).Handle, GWL_STYLE, WS_DLGFRAME+WS_SIZEBOX+WS_SYSMENU);
end;
Az ablak üzeneteit is kezelnünk kell, ezért a Form WindowProc eljárását felül kell írnunk. Az eredetire is szükségünk lesz, ezért azt eltároljuk az FOldWndProc változóban.
FDestroying:=false;
FOldWndProc:=(AOwner as TForm).WindowProc;
FMsgNum:=MessageNum;
inc(messagenum);
(Owner as TForm).WindowProc:=NewWndProc;
Az üzeneteket tehát a NewWndProc eljárásban kell feldolgoznunk. Ebben először meghívjuk az eredeti üzenetkezelő eljárást, amit az FOldWndProc változóban tároltunk el. A WM_ACTIVATE üzenetet akkor kapja az ablak, amikor aktiválták, illetve amikor inaktívvá vált. Ekkor újrarajzoljuk a komponenst, majd frissítjük a ráhelyezett komponenseket is. A WM_SIZE üzenet akkor jön létre, amikor az ablakot átméretezték. Ezt azért kell vizsgálnunk, mert a Maximize/Normalize gomb képe attól függ, hogy az ablak teljes képernyős, vagy normál nézetben van-e.
procedure TCaptionBar.NewWndProc(var Msg: TMessage);
var i:integer;
begin
FOldWndProc(MSG);
case Msg.Msg of
WM_ACTIVATE: begin
Paint;
for I:=0 to ControlCount -1 do begin
if Controls[I].Visible then Controls[I].Repaint;
end;
end;
WM_SIZE: begin
case msg.WParam of
SIZE_RESTORED: FButtons[1].Caption:=capt_maximize;
SIZE_MAXIMIZED: FButtons[1].Caption:=capt_restore;
end;
ResetButtons;
end;
end;
end;