用了WMNCHitTest来移动窗口,发现PopupMenu1无效了,郁闷... ( 积分: 100 )

  • 主题发起人 主题发起人 emitsong
  • 开始时间 开始时间
E

emitsong

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;<br>begin<br> inherited;<br> M.Result := htCaption; // 获得鼠标点击移动的效果<br><br>end;
 
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;<br>begin<br> inherited;<br> M.Result := htCaption; // 获得鼠标点击移动的效果<br><br>end;
 
移动窗体的时候,UI设计上弹出菜单基本上就可以取消了.<br>郁闷什么?
 
我要的是点击右键出菜单
 
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;<br>你的这些代码是让系统误认为鼠标点击在标题栏,而通常窗体标题栏上点击鼠标右键本来就<br>不会有弹出菜单,所以PopupMenu1无效。你还可以看到关闭按钮也是无效的。
 
我要的是点击右键出菜单 &nbsp;,又可以移动,如何写代码
 
那可以用 mouseDown 呀。<br>procedure TCPAR.MouseDown(Button: TMouseButton; Shift: TShiftState; X,<br> &nbsp;Y: Integer);<br>begin<br> &nbsp;if button = mbLeft then<br> &nbsp;begin<br> &nbsp; ReleaseCapture;<br> &nbsp; perform(WM_sysCommand, $F017,0);<br> &nbsp;end;<br>end;
 
在Form的MouseDown事件中写代码:<br>procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;<br> &nbsp;Shift: TShiftState; X, Y: Integer);<br>begin<br> &nbsp;if Button = mbRight then<br> &nbsp; &nbsp;self.PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y)<br> &nbsp;else<br> &nbsp;begin<br> &nbsp; &nbsp;ReleaseCapture;<br> &nbsp; &nbsp;SendMessage(Form1.handle,WM_SYSCOMMAND,$F012,0);<br> &nbsp;end;<br>end;
 
以上两种方法都会被上面控件的mousedown屏蔽掉,不能点窗口任意位置移动
 
这你可没事先说清楚。你要求点窗口任意位置移动,那控件mousedown如果有处理代码,<br>怎么调用?不能两全其美吧?<br>就你的点窗口任意位置移动,这样试试:<br>窗体public中定义一个TMessageEvent类型过程,然后将其赋给application.OnMessage<br>让application去处理鼠标点击事件:<br> &nbsp;public<br> &nbsp; &nbsp;procedure OnMouseDown(var Msg: TMsg; var Handled: Boolean);<br> &nbsp;......<br> &nbsp;procedure TForm1.OnMouseDown(var Msg: TMsg; var Handled: Boolean);<br> &nbsp;begin<br> &nbsp; &nbsp;if Msg.message = WM_RBUTTONDOWN then<br> &nbsp; &nbsp; &nbsp;self.PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y)<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;ReleaseCapture;<br> &nbsp; &nbsp; &nbsp;SendMessage(Form1.handle,WM_SYSCOMMAND,$F012,0);<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br><br> &nbsp;procedure TForm1.FormCreate(Sender: TObject);<br> &nbsp;begin<br> &nbsp; &nbsp;application.OnMessage :=self.OnMouseDown;<br> &nbsp;end;<br><br>这样,你就能点窗口任意位置移动了,包括点控件移动(但控件的mousedown事件就<br>不响应了,所以,你可以再加代码判断,以调用控件mousedown处理代码)。
 
以上两种方法都会被上面控件的mousedown屏蔽掉,不能点窗口任意位置移动???<br><br>这样的要求非常不合理!
 
用我这个移动窗口就可以用popupmenu1了<br>procedure TDragForm.CreateWnd;<br>begin<br> &nbsp;inherited CreateWnd;<br> &nbsp;Visible := True;<br> &nbsp;// 为 2000/XP 创建半透明、穿透效果<br> &nbsp;if Assigned(SetLayeredWindowAttributes) then<br> &nbsp;begin<br> &nbsp; &nbsp;SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);<br> &nbsp; &nbsp;SetLayeredWindowAttributes(Handle, clWhite, 128, LWA_ALPHA or LWA_COLORKEY);<br> &nbsp;end;<br> &nbsp;// 设置为接受拖拽<br> &nbsp;DragAcceptFiles(Handle, True);<br>end;
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
585
import
I
后退
顶部