以下是我想用自己的窗口过程替换窗体本身的,但在MyCallWindowProc中只有当鼠标在标题栏上按下并抬起时才会激发WM_NCLBUTTONDOWN,苦恼,盼高手解决。const
htTitleBtn = htSizeLast + 1;procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown);
begin
if (Msg.HitTest = htTitleBtn) then
begin
SetCapture(FOwner.Handle);
FLBDown := true;
InRect := true;
DrawTitleButton;
end;
end;procedure WMNCHitTest(var Msg : TWMNCHitTest);
begin
{Check to see if the mouse was clicked in the area of the button}
if PtInRect(TitleButton, Point(Msg.XPos - FOwner.Left, Msg.YPos - FOwner.Top)) then
Msg.Result := htTitleBtn;
end;function MyCallWindowProc(hWnd: HWND;
Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
tmpMsg: TMessage;
begin
Result := CallWindowProc(SWindProc, hWnd, Msg, wParam, lParam);
tmpMsg.Msg := Msg;
tmpMsg.WParam := wParam;
tmpMsg.LParam := lParam;
case Msg of
WM_NCLBUTTONDOWN:
begin
WMNCLButtonDown(TWMNCLBUTTONDOWN(tmpMsg));
end;
WM_NCHITTEST:
begin
WMNCHitTest(TWMNCHITTEST(tmpMsg));
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
FOwner := Self;
SWindProc := Pointer(GetWindowLong(Handle, GWL_WNDPROC));
SetWindowLong(Handle, GWL_WNDPROC, Integer(Addr(MyCallWindowProc)));
end;
htTitleBtn = htSizeLast + 1;procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown);
begin
if (Msg.HitTest = htTitleBtn) then
begin
SetCapture(FOwner.Handle);
FLBDown := true;
InRect := true;
DrawTitleButton;
end;
end;procedure WMNCHitTest(var Msg : TWMNCHitTest);
begin
{Check to see if the mouse was clicked in the area of the button}
if PtInRect(TitleButton, Point(Msg.XPos - FOwner.Left, Msg.YPos - FOwner.Top)) then
Msg.Result := htTitleBtn;
end;function MyCallWindowProc(hWnd: HWND;
Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
tmpMsg: TMessage;
begin
Result := CallWindowProc(SWindProc, hWnd, Msg, wParam, lParam);
tmpMsg.Msg := Msg;
tmpMsg.WParam := wParam;
tmpMsg.LParam := lParam;
case Msg of
WM_NCLBUTTONDOWN:
begin
WMNCLButtonDown(TWMNCLBUTTONDOWN(tmpMsg));
end;
WM_NCHITTEST:
begin
WMNCHitTest(TWMNCHITTEST(tmpMsg));
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
FOwner := Self;
SWindProc := Pointer(GetWindowLong(Handle, GWL_WNDPROC));
SetWindowLong(Handle, GWL_WNDPROC, Integer(Addr(MyCallWindowProc)));
end;
不过我的代码和你的不同的是我先处理WM_NCLBUTTONDOWN 消息然后在传送到旧的过程中执行的。
你只要把
Result := CallWindowProc(SWindProc, hWnd, Msg, wParam, lParam); 放在最后就可以了。