关于模式窗口(75分)

  • 主题发起人 主题发起人 Croco
  • 开始时间 开始时间
C

Croco

Unregistered / Unconfirmed
GUEST, unregistred user!
ShowModal出的窗口,怎样拦住/响应鼠标在该窗口外的点击?
比如,ShowMessage('老兄,别在窗口外乱点。');
 
尝试一下锁住鼠标活动范围.
 
Form1为调用的窗体.

TForm1 = class(TForm)
procedure Button1Click(Sender: TObject);
private
procedure CMMouseButton(var Message: TMessage); message WM_LBUTTONDOWN;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
end;

implementation

uses unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Form2) do try
ShowModal;
finally
Free;
end;
end;

procedure TForm1.CMMouseButton(var Message: TMessage);
begin
if (message.WParam = MK_LBUTTON) and inForm then begin
inMain := true;
showmessage('老兄,别在窗口外乱点。');
SetCapture(Application.MainForm.handle);
inMain := false;
end;
end;

procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
if not assigned(form2) then
SetCapture(Application.MainForm.handle);
end;

procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
ReleaseCapture
end;


Form2为ShowModal出的窗体.

TForm2 = class(TForm)
private
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
end;

var
Form2: TForm2;
inForm: boolean = false;
inMain: boolean =false;

implementation

procedure TForm2.CMMouseEnter(var Message: TMessage);
begin
ReleaseCapture;
inForm:=false;
end;

procedure TForm2.CMMouseLeave(var Message: TMessage);
begin
if inMain then exit;
SetCapture(Application.MainForm.handle);
inForm:=true;
end;
 
如果 form2 比 form1 还大呢?呵呵。
 
在MouseMove事件中:
1)得到当前FORM的范围,Form1.BoundsRect;
2)判断MOUSE是否到边界;是flag = 1; 否 flag = 0;
3)其它的你来处理。
 
以下是捕捉非Client区域的消息,Try!
WM_NCLBUTTONDBLCLK
WM_NCLBUTTONDOWN
WM_NCLBUTTONUP
WM_NCMBUTTONDBLCLK
WM_NCMBUTTONDOWN
WM_NCMBUTTONUP
WM_NCMOUSEMOVE
WM_NCRBUTTONDBLCLK
WM_NCRBUTTONDOWN
WM_NCRBUTTONUP
 
我一直不明白这个非client 的意思。
比如 caption 不属于 client,那么窗体外面是不是属于 非 client ?
 
多人接受答案了。
 
又看了一下,非客户区为 caption, scrollbar statusbar 等等。
 
后退
顶部