1,183
社区成员
发帖
与我相关
我的任务
分享
procedure TForm1.OnHitTest(var msg: TMEssage);
const
CORNER_WIDTH = 12;
htvalues: array [0..2, 0..2] of THitWindow =
(
(HTTOPLEFT, HTTOP, HTTOPRIGHT),
(HTLEFT, HTCLIENT, HTRIGHT),
(HTBOTTOMLEFT, HTBOTTOM, HTBOTTOMRIGHT)
);
var
P: TPoint;
ctrl: TControl;
idx: integer;
idy: integer;
begin
p.x := msg.LParamLo - Left;
p.y := msg.LParamHi - Top;
ctrl := ControlAtPos(p, True, False);
if (ctrl = nil) and (Align <> alClient) then
begin
if (p.x < CORNER_WIDTH) and (p.y < CORNER_WIDTH) then
begin
idx := 0;
idy := 0;
end
else if (p.x < CORNER_WIDTH) and (p.y > Height - CORNER_WIDTH) then
begin
idx := 0;
idy := 2;
end
else if (p.x > Width - CORNER_WIDTH) and (p.y < CORNER_WIDTH) then
begin
idx := 2;
idy := 0;
end
else if (p.x > Width - CORNER_WIDTH) and (p.y > Height - CORNER_WIDTH) then
begin
idx := 2;
idy := 2;
end
else
begin
if p.x < 4 then
idx := 0
else if p.x > Width - 4 then
idx := 2
else
idx := 1;
if p.y < 4 then
idy := 0
else if p.y > Height - 4 then
idy := 2
else
idy := 1;
end;
msg.Result := integer(htvalues[idy, idx]);
end
else
inherited;
end;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
OldWndProc: TWndMethod;
function CheckMouseInBorder(X, Y: Integer;
var AResult: Integer): Boolean;
procedure NewWndProc(var AMsg: TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure RoundRgn(frm: TCustomForm);
var
hRgn1: HRGN;
begin
BeginPath(frm.Canvas.Handle);
RoundRect(frm.Canvas.Handle, 1, 1, frm.Width, frm.Height, 50, 50);
EndPath(frm.Canvas.Handle);
hRgn1 := PathToRegion(frm.Canvas.Handle);
SetWindowRgn(frm.Handle, hRgn1, True);
end;
function TForm1.CheckMouseInBorder(X, Y: Integer;
var AResult: Integer): Boolean;
begin
Result := False;
//判断当前鼠标的位置,是否在边界上,以改变鼠标并进行拖拉
//并返回所处的位置。
X := X - Left;
Y := Y - Top;
//最大化时不处理。
if (WindowState = wsMaximized) then
begin
Exit;
end;
if (X<=10) and (Y<=10) then
aResult := HTTOPLEFT //左上角
else if (X<=10) and (Y>=ClientHeight-10) then
aResult := HTBOTTOMLEFT //左下角
else if (X<=2) then
aResult := HTLEFT //左边
else if(X>=ClientWidth-10) and (Y<=10) then
aResult := HTTOPRIGHT //右上角
else if(X>=ClientWidth-10) and (Y>=ClientHeight-10) then
aResult := HTBOTTOMRIGHT //右下角
else if(X>=ClientWidth-2) then
aResult := HTRIGHT //右边
else if(Y>=ClientHeight-2) then
aResult := HTBOTTOM //下边
else if(Y<=2) then
aResult := HTTOP //上边
else
Exit;
Result := True;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
RoundRgn(Self);
end;
procedure TForm1.NewWndProc(var AMsg: TMessage);
var
ret: Integer;
begin
OldWndProc(AMsg);
if (AMsg.Msg = WM_NCHITTEST) and
CheckMouseInBorder(aMsg.LParamLo, aMsg.LParamHi, ret) then
AMsg.Result := ret;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldWndProc := WindowProc;
WindowProc := NewWndProc;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WindowProc := OldWndProc;
end;
end.
void __fastcall TDocBookMainForm::WndProc(Messages::TMessage &Msg)
{
TForm::WndProc(Msg);
switch(Msg.Msg)
{
case WM_NCHITTEST:
{
Msg.Result = CheckMouseInBorder(Msg.LParamLo,Msg.LParamHi);
break;
}
}
}
int __fastcall TDocBookMainForm::CheckMouseInBorder(int X,int Y)
{
//判断当前鼠标的位置,是否在边界上,以改变鼠标并进行拖拉
//并返回所处的位置。
X = X - Left;
Y = Y - Top;
//最大化时不处理。
if(WindowState == wsMaximized) return HTCLIENT;
if(X<=10 && Y<=10) return HTTOPLEFT; //左上角
if(X<=10 && Y>=ClientHeight-10) return HTBOTTOMLEFT;//左下角
if(X<=2) return HTLEFT; //左边
if(X>=ClientWidth-10 && Y<=10) return HTTOPRIGHT; //右上角
if(X>=ClientWidth-10 && Y>=ClientHeight-10)
return HTBOTTOMRIGHT;//右下角
if(X>=ClientWidth-2) return HTRIGHT; //右边
if(Y>=ClientHeight-2) return HTBOTTOM; //下边
if(Y<=2) return HTTOP; //上边
return HTCLIENT;
}
//---------------------------------------------------------------------------