Note that there are some explanatory texts on larger screens.

plurals
  1. POCan overriding the CreateParams procedure allow me to still have full access to the WS_SYSMENU?
    text
    copied!<p>Complete source code can be found here: <a href="http://www.eyeClaxton.com/download/delphi/SkinProject.zip" rel="nofollow">http://www.eyeClaxton.com/download/delphi/SkinProject.zip</a></p> <p>I'm trying to create a skinned form with no "Caption or Borders", but still leaving me with the full access to System Menu (I.E: Move, Minimize, Maximize, Restore and Size). I can achieve all of the menu items by overriding the CreateParams procedure by using WS_SYSMENU, WS_MAXIMIZEBOX, WS_MINIMIZEBOX. Using the WS_SIZEBOX gives me access to the menu "Size" command but paints a border I do not want. I have included a complete (Delphi 7) example in the link above. If more information is needed, please feel free to ask.</p> <pre><code>procedure TMainFrm.CreateParams(var Params: TCreateParams); begin FormStyle := fsNormal; try if (BorderIcons &lt;&gt; []) then BorderIcons := []; if (BorderStyle &lt;&gt; bsNone) then BorderStyle := bsNone; inherited CreateParams(Params); Params.ExStyle := (Params.ExStyle and (not WS_EX_WINDOWEDGE) and (not WS_EX_STATICEDGE) and (not WS_EX_DLGMODALFRAME) and (not WS_EX_CLIENTEDGE)); Params.Style := (Params.Style and (not WS_CAPTION) and (not DS_MODALFRAME) and (not WS_DLGFRAME) and (not WS_THICKFRAME)); Params.Style := (Params.Style or WS_SYSMENU or WS_MAXIMIZEBOX or WS_MINIMIZEBOX or WS_SIZEBOX); finally Position := poScreenCenter; end; end; </code></pre> <p>SOLUTION:</p> <pre><code>unit WndProcUnit; interface uses Windows, Messages, Classes, Controls, Forms, SysUtils; type EWndProc = class(Exception); TWndProcMessages = class(TComponent) private { Private declarations } FOwnerWndProc: TFarProc; FNewWndProc: TFarProc; protected { Protected declarations } procedure WndProc(var theMessage: TMessage); virtual; public { Public declarations } constructor Create(theOwner: TComponent); override; destructor Destroy(); override; procedure DefaultHandler(var theMessage); override; end; TWndProc = class(TWndProcMessages) private { Private declarations } protected { Protected declarations } procedure Loaded(); override; public { Public declarations } constructor Create(theOwner: TComponent); override; destructor Destroy(); override; published { Published declarations } end; implementation { TWndProcMessages } constructor TWndProcMessages.Create(theOwner: TComponent); var X, I: Integer; begin inherited Create(theOwner); if (not (Owner is TForm)) then raise EWndProc.Create('TWndProc parent must be a form!'); I := 0; for X := 0 to (Owner.ComponentCount - 1) do begin if (Owner.Components[X] is TWndProc) then Inc(I); if (I &gt; 1) then Break; end; if (I &gt; 1) then begin raise EWndProc.Create('The form already contains a TWndProc!'); end else begin FOwnerWndProc := TFarProc(GetWindowLong((Owner as TForm).Handle, GWL_WNDPROC)); FNewWndProc := Classes.MakeObjectInstance(WndProc); if (not (csDesigning in ComponentState)) then SetWindowLong((Owner as TForm).Handle, GWL_WNDPROC, LongInt(FNewWndProc)); end; end; destructor TWndProcMessages.Destroy(); begin if Assigned(FNewWndProc) then try Classes.FreeObjectInstance(FNewWndProc); finally if (Pointer(FNewWndProc) &lt;&gt; nil) then Pointer(FNewWndProc) := nil; end; if Assigned(FOwnerWndProc) then Pointer(FOwnerWndProc) := nil; inherited Destroy(); end; procedure TWndProcMessages.DefaultHandler(var theMessage); begin if ((Owner as TForm).Handle &lt;&gt; 0) then begin case TMessage(theMessage).Msg of WM_DESTROY: SetWindowLong((Owner as TForm).Handle, GWL_WNDPROC, LongInt(FOwnerWndProc)); WM_INITMENU: EnableMenuItem(TMessage(theMessage).WParam, SC_SIZE, MF_BYCOMMAND or MF_ENABLED); else with TMessage(theMessage) do Result := CallWindowProc(FOwnerWndProc, (Owner as TForm).Handle, Msg, WParam, LParam); end; end else inherited DefaultHandler(theMessage); end; procedure TWndProcMessages.WndProc(var theMessage: TMessage); begin Dispatch(theMessage); end; { TWndProc } constructor TWndProc.Create(theOwner: TComponent); begin inherited Create(theOwner); end; destructor TWndProc.Destroy(); begin inherited Destroy(); end; procedure TWndProc.Loaded(); begin inherited Loaded(); if (not (csDesigning in ComponentState)) then GetSystemMenu((Owner as TForm).Handle, False); end; end. </code></pre> <p>Complete "updated" source code can be found here: <a href="http://www.eyeClaxton.com/download/delphi/SkinProject.zip" rel="nofollow">http://www.eyeClaxton.com/download/delphi/SkinProject.zip</a></p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload