[Delphi] bsNone 인 폼에서 드래그 및 크기조절

- 07-11
- 3,362 회
- 0 건
[code] unit Area; interface uses<br /> Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,<br /> Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask, Vcl.ExtCtrls,<br /> JvExControls, JvButton, JvNavigationPane, Vcl.Buttons; type<br /> TFrmArea = class(TForm)<br /> Panel1: TPanel;<br /> Panel2: TPanel;<br /> Label1: TLabel;<br /> Memo1: TMemo;<br /> JvNavIconButton1: TJvNavIconButton;<br /> Button1: TButton;<br /> BitBtn1: TBitBtn;<br /> SpeedButton1: TSpeedButton;<br /> procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;<br /> Shift: TShiftState; X, Y: Integer);<br /> procedure FormResize(Sender: TObject);<br /> procedure FormCreate(Sender: TObject);<br /> protected<br /> procedure CreateParams(var Params: TCreateParams); override;<br /> procedure WMNCHitTest(var message: TWMNCHitTest); message WM_NCHITTEST;<br /> private<br /> public<br /> { Public declarations }<br /> end; const<br /> Edge = 5; var<br /> FrmArea: TFrmArea; implementation {$R *.dfm} { TFrmArea } procedure TFrmArea.CreateParams(var Params: TCreateParams);<br /> begin<br /> BorderStyle := bsNone; inherited; Params.WndParent := 0;<br /> Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;<br /> end; procedure TFrmArea.FormCreate(Sender: TObject);<br /> begin<br /> FormResize(Sender);<br /> end; procedure TFrmArea.FormResize(Sender: TObject);<br /> var<br /> WindowRgn, HoleRgn : HRgn;<br /> begin<br /> WindowRgn := 0;<br /> GetWindowRgn(Handle, WindowRgn);<br /> DeleteObject(WindowRgn);<br /> WindowRgn := CreateRectRgn(0, 0, Width, Height);<br /> HoleRgn := CreateRectRgn(Edge, Edge+Panel1.Height+Edge, Width-Edge, Height-Edge);<br /> CombineRgn(WindowRgn, WindowRgn, HoleRgn, RGN_DIFF);<br /> SetWindowRgn(Handle, WindowRgn, TRUE);<br /> DeleteObject(HoleRgn);<br /> end; procedure TFrmArea.Panel1MouseDown(Sender: TObject; Button: TMouseButton;<br /> Shift: TShiftState; X, Y: Integer);<br /> begin<br /> ReleaseCapture;<br /> SendMessage(Handle, WM_NCLBUTTONDOWN, htCaption, 0);<br /> end; procedure TFrmArea.WMNCHitTest(var Message: TWMNCHitTest);<br /> var<br /> P: TPoint;<br /> begin<br /> inherited; P := ScreenToClient(Message.Pos); with Message do<br /> begin<br /> if Result = htClient then Exit; Result := htCaption; if P.Y < Edge then<br /> begin<br /> if P.X < Edge then<br /> Result := htTopLeft<br /> else if P.X > ClientWidth - Edge then<br /> Result := htTopRight<br /> else<br /> Result := htTop;<br /> end<br /> else if P.Y > ClientHeight - Edge then<br /> begin<br /> if P.X < Edge then<br /> Result := htBottomLeft<br /> else if P.X > ClientWidth - Edge then<br /> Result := htBottomRight<br /> else<br /> Result := htBottom;<br /> end<br /> else<br /> begin<br /> if P.X < Edge then<br /> Result := htLeft<br /> else if P.X > ClientWidth - Edge then<br /> Result := htRight<br /> end;<br /> end;<br /> end; end.<br /> [/code]
로그인 후 댓글내용을 입력해주세요