怎样控制窗体不移动?(100分)

  • 主题发起人 主题发起人 pingzi
  • 开始时间 开始时间
P

pingzi

Unregistered / Unconfirmed
GUEST, unregistred user!
一个正常的窗口,有最大化、最小化、关闭等按钮,有系统菜单,<br>如何使用户不能用鼠标移动窗口,而菜单、系统按钮正常工作?<br>(又:我试过一个程序,可是运行后标题栏上的系统按钮和菜单都失效了)<br>谢谢!
 
把最大化、最小化、关闭等按钮disable
 
截下WM_NCMTEST消息,直接返回
 
利用消息WM_NCHITTEST:<br><br>//bcb语法:<br>//在*.h文件中:<br>&nbsp;private:<br>&nbsp; WMNCHITTEST(TWMNCHITTEST &amp;Msg);<br><br>BEGIN_MESSAGE_MAP<br>&nbsp;MESSAGE_HANDLER(WM_NCHITTEST,TWMNCHITTEST,WMNCHITTEST)<br>END_MESSAGE_MAP(TForm)<br><br>////////<br>//在*.cpp<br><br>WMNCHITTEST(TWMNCHITTEST &amp;Msg)<br>{<br>if(Msg.Result==htCaption)<br>Msg.Result=htCaption;<br><br>}<br>//试一下,成功后告诉我<br><br><br><br><br>
 
改为:<br><br>if(Msg.Result==htCaption)<br>Msg.Result=htClient;
 
我觉得以上各位漏了很重要的一步,就是在按下键的时候,向窗体发送TWMNCHITTEST消息。
 
原来是我自己搞错了。
 
没必要按下键
 
对不起,我在Delphi中试了 microbit 给出的两种语句,都不行,主要是无法操作菜单。
 
你太悲惨了...消息全部被截了...<br>还有两个笨办法:1.用Border为None,自画菜单,按钮...<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.判断WM_NCHITTEST消息的位置,在菜单范围内就别拦截
 
crystal,能说详细点吗,关于第二点
 
处理form的oncontrainedresize事件。<br><br>在试用时我发现一个有意思的问题:当按下左键时,依次激发onmousedown,onmousemove<br>按下右键时只激发onmousedown;哪位解说一下?
 
我说的是个笨办法!当WM_NCHITTEST发送时,wParam(或lParam)是鼠标位置,<br>高位是Y,低位是X,取出来...<br>菜单不是在左上角吗?它有一个范围,判断你的鼠标位置,在范围内,.....<br>在范围外,.....<br>明白了吧?但这太笨了,我觉得其他人会有更好办法...
 
1、一个窗口如果允许它改变大小,则可以变相地移动,即使做到了不能移动窗体,<br>如:把左边框向左拉50,再把右边框向左拉50,不是=向左移动50吗?所以:要不<br>能移动,最好同时不允许改变窗体尺寸。<br>2、一个不计较成本的方法:<br>&nbsp; 利用Timer1事件,如每0.005秒检查窗体的Left和Top属性是否与初始值相同,否<br>则使其复原。<br>3、可以考虑的另外一个思路:活动窗体的移动,应当引起被该窗体覆盖的窗体的<br>OnPaint事件,利用该事件将活动窗体的位置复原。<br>4、在窗体的OnPaint事件中加入:<br>&nbsp; &nbsp; Screen.ActiveForm.Left:=BeginLeft;//BeginLeft=窗体的Left初始值<br>&nbsp; &nbsp; Screen.ActiveForm.Top:=BeginTop; &nbsp;//BeginTop==窗体的Top初始值<br><br>上述方法我尝试了一下,第四个方法有一定的可行性。<br><br>试试,可以的话通知一声。<br>
 
"损!!!", 问题损, 支的招更损!!
 
这么说吧,为什么程序运行后将他最大化,则不可移动,而在设计阶段<br>将form的windowState设为wsMaximized,或者在程序中指定Form的大小,<br>但是照样可以移动Form。<br>有没有比较好的方法在程序运行后将其最大化,但不显示最大化、最小化按钮,<br>这样就无法改变form的大小了。<br>
 
&nbsp;private<br>{ Private declarations }<br>Procedure MoveForm(var M:TWMNCHITTEST);<br>Message WM_NCHITTEST;<br>&nbsp; &nbsp; //声明一自定义事件,拦截“WM_NCHITTEST”消息<br>&nbsp; public<br>&nbsp; .<br>&nbsp; .<br>{$R *.DFM}<br><br>Procedure TForm1.MoveForm (var M:TWMNCHITTEST);<br>begin<br>&nbsp; inHerited;//继承,窗体可以继续处理以后的事件<br>&nbsp; if (M.Result=HTCLIENT) //如果发生在客户区<br>and ((GetKeyState(vk_CONTROL) &lt; 0) <br>&nbsp;//检测“Ctrl”键是否按下<br>&nbsp; then &nbsp; M.Result:=HTCAPTION;<br>&nbsp; //更改“.Result”域的值<br>end;<br><br>这是让一个窗体点任何地方都右移动,<br>你可用他,让窗体不再移动。道理一样。<br><br>
 
我想,大家可能将这个问题想得过于复杂了,包括我自己;-),因为我刚刚<br>用一个极简单的办法解决了,就是设定form1.Align:=alClient,<br>form1.windowstate:=wsMaximized,这样即使最大、最小、关闭等按钮<br>都不可见,form也不可被移动。
 
多人接受答案了。
 

Similar threads

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