问题描述
1如何让一个有标题栏的窗口使之不能使用鼠标拖动,(请不要说用图片做一个假标题栏,因为用图片做的假标题栏,没有办法在电脑在调整了显示模式后也随着改变,所以这种方法不可行)2如何让一个form2始终显示在form1的上面,若不关闭form2则不能对form1作任何操作.
解决方案
解决方案二:
这个方法是用来处理消息的,包括鼠标的各种消息。前一种方法中讲到了非客户区的鼠标消息,但我在msdn里找了半天,没找到相关的非客户区的鼠标事件。但WndProc里可以处理。原理:将鼠标在客户区按下的消息更改为在非客户区的标题栏按下。protectedoverridevoidWndProc(refMessagem){switch(m.Msg){case0x0201://鼠标左键按下的消息m.Msg=0x00A1;//更改消息为非客户区按下鼠标m.LParam=IntPtr.Zero;//默认值m.WParam=newIntPtr(2);//鼠标放在标题栏内break;}base.WndProc(refm);}这个重写一下就行了
解决方案三:
高,实在是高
解决方案四:
可以参考下面的代码:[DllImport("user32.dll",CharSet=CharSet.Auto,ExactSpelling=true)]publicstaticexternIntPtrGetSystemMenu(IntPtrhWnd,boolbRevert);[DllImport("user32.dll",CharSet=CharSet.Auto,ExactSpelling=true)]publicstaticexternboolRemoveMenu(IntPtrhMenu,intuPosition,intuFlags);IntPtrhMenu;hMenu=GetSystemMenu(this.Handle,false);RemoveMenu(hMenu,SC_MOVE,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);//移动菜单
解决方案五:
上面用的到常数如下:publicconstintMF_BYCOMMAND=0x00000000;publicconstintMF_DISABLED=0x00000002;publicconstintMF_GRAYED=0x00000001;
解决方案六:
哎,漏了一下主要的:publicconstintSC_MOVE=0xf010;
解决方案七:
From.TopMost=True
解决方案八:
第一个问题1楼的兄弟搞定了其实还可以继承form.改写他的OnMouseHover也可以.2如何让一个form2始终显示在form1的上面,若不关闭form2则不能对form1作任何操作.privatevoidPop(){Formfrm2=newForm();frm2.Text=".....";//其他初始化操作frm2.ShowDialog();}frm2就始终再上面了~模式窗体
解决方案九:
同意楼上的说法,lz的描述几乎就是模态对话框的定义了。当然可能还需要检查一下DialogResult。...if(DialogResult.OK==frm1.ShowDialog()){...
解决方案十:
frm2.ShowDialog();用这种方式显示,其它窗体就不能动了,模式对话框与非模式对话框的问题
解决方案十一:
frm2.ShowDialog();这样的方式的确可让form2显示在form1的前面,可能是我的意思描述不够清楚,我的form1和form2都不是全屏显示的,在运行程序后我用鼠标点击桌面空白区域,在form1form2就会在任务最小化我的要求是无论鼠标点什么地方这个窗口都不变化(不让它最小化,始终显示在屏幕上),除非我执行this.hide();或其他退出命令
解决方案十二:
6楼建议的Form.TopMost可以保证你的窗口总在其他窗口上方。阻止用户最小化窗体,可以使用3楼的方法,从系统菜单中移去最小化菜单项(也会导致窗体右上角相应按钮实效),也可设置Form.MinimizeBox=false;从而禁用窗体右上角最小化按钮及系统菜单中的最小化菜单项。但是“显示桌面”可以让所有窗体最小化,这个似乎阻止不了,但应该可以通过在合适的时机设置Form.WindowState=FormWindowState.Normal;来解决。因为不熟悉WindowsAPI,未能提供P/Invoke的解决办法,上述办法都是可以在窗体设计器中做到的,简单方便有余,能不能满足要求就难说了。
解决方案十三:
1.窗体有一个属性,可以不显示标题栏,这样就移动不了了.2.用模式窗体(ShowDialog方法)