窗口移动无边框各种方式
QT:如何移动和缩放一个无边框窗口
QT:如何移动和缩放⼀个⽆边框窗⼝⼀个QT窗⼝如下可以做到⽆边框:Window {id: window//Designer 竟然不⽀持..., 设计模式时要注意flags: Qt.FramelessWindowHintwidth: 500height: 300title: "Window Title"}不过要注意, 这样QT Designer不⽀持, 在设计的时候可以先注释掉, 最后在打开.⼀旦设置了FramelessWindowHint, 系统就不管你这个窗⼝的移动和缩放了, 就需要⾃⼰来处理了.那怎么处理哪, ⼤概有以下思路1. 增加⼀个接收拖动事件的组件, 让它跟着⿏标移动2. 增加⼀个缩放锚点, 随着⿏标缩放3. 增加窗⼝四周的⿏标触发区域, 可以随着⿏标向四个⽅向缩放 (此⽂没包括实现) , 可以参考 {:target="_blank"}我们先来看看如果拖动窗⼝, 代码如下:/**头部操作区域.*/Rectangle {id: titleOpRectx: 0y: 0width: parent.widthheight: 30property string title : "Hello Board"MouseArea {id: mouseMoveWindowArea//height: 20anchors.fill: parentacceptedButtons: Qt.LeftButtonproperty point clickPos: "0,0"onPressed: {clickPos = Qt.point(mouse.x, mouse.y)//isMoveWindow = true}onReleased: {//isMoveWindow = false}onPositionChanged: {var delta = Qt.point(mouse.x - clickPos.x, mouse.y - clickPos.y)//如果mainwindow继承⾃QWidget,⽤setPoswindow.setX(window.x + delta.x)window.setY(window.y + delta.y)}}Button {id: closeButtonwidth: 25height: parent.heighttext: "X"anchors.left: parent.leftanchors.leftMargin: 0anchors.bottom: parent.bottomanchors.bottomMargin: 0flat: truefont.bold: truefont.pointSize: 14onClicked: {window.close()}}Text {id: titleTexttext: titleanchors.bottom: parent.bottom//底部留点空间bottomPadding: 5} //end titleTextButton {id: newStrikeButtonwidth: 25height: parent.heighttext: "+"anchors.right: parent.rightanchors.rightMargin: 0anchors.bottom: parent.bottomanchors.bottomMargin: 0flat: truefont.pointSize: 22}Frame {width: titleOpRect.widthheight: 1anchors.bottom: titleOpRect.bottomRectangle {height: parent.heightwidth: parent.widthcolor: "blue"}}}关键代码在MouseArea的onPressed 和 onPositionChanged 事件上. ⽐较容易.我们再来看看如果缩放窗⼝这次我们只是在窗⼝右下⾓放⼀个⼩矩形区域, 来捕获⿏标移动事件, 以实现缩放. /**尾部操作区域.*/Rectangle {id: footOpRectanchors.bottom: parent.bottomwidth: parent.widthheight: 30//resize区域MouseArea {id: resizeanchors {right: parent.rightbottom: parent.bottom}width: 15height: 15cursorShape: Qt.SizeFDiagCursorproperty point clickPos: "1,1"//保持窗⼝左上⾓不动property int oldXproperty int oldYonPressed: {clickPos = Qt.point(mouse.x, mouse.y)//oldWidth = window.width//oldHeight = window.heightoldX = window.xoldY = window.y}onPositionChanged: {var delta = Qt.point(mouse.x - clickPos.x,mouse.y - clickPos.y)var minWidth = 100;var minHeight = 100;//最⼩var newWidth = (window.width + delta.x)<minWidth?minWidth:(window.width + delta.x);//最⼩var newHeight = (window.height + delta.y)<minHeight?minHeight:(window.height + delta.y); window.width = newWidth;window.height = newHeight;window.x = oldXwindow.y = oldY}onReleased: {}Rectangle {id: resizeHintcolor: "red"anchors.fill: resize}}}这段代码⽹上很常见,1. 不过这⾥判断了窗⼝的最⼩⾼度和宽度, 不会导致窗⼝太⼩看不见2. ⿏标移动会导致负数, 所以这⾥也做了判断.3. 保持窗⼝左上⾓不动, 否则⿏标跑来跑去有问题.That's all, Thanks.。
如何使用Delphi实现无边界窗体的移动
在⽤Delphi制作Windows程序的窗体时,窗体的边界有四种选择:对话框式(bsDialog),单边固定式(bsSingle),双边可变式(bsSizeable),⽆边界式(bsNone)。
当设置为bsNone时,窗体也就没有标题条,很显然,程序运⾏以后就⽆法移动窗体了。
事实上,⽆边界窗体是很有⽤的,例如,象Word⾥⾯的浮动式⼯具箱其实就是⽆边界窗体,它可以⼤⼤节约屏幕空间。
那么,如何⽤Delphi实现这个功能呢?显然,这需要修改Windows的内部消息,也就是说,需要把“MouseDownonForm”这个消息改为“MouseDownonCaption”,这其中有三个关键:捕捉MouseDown消息、判断光标位置、发送MouseDown消息。
如果光标在窗体中,则发送MouseDownonCaption消息。
在Delphi的对象巡检器中列出的所有事件是不能捕捉到Windows消息的,因为这些都是已经发出的消息,⽆法修改了。
捕捉Win dows消息有两种办法:⼀个就是增加⼀个消息处理句柄,直接处理Windows消息;另⼀个是对消息进⾏过滤,滤出所需消息。
第⼆个办法⽐较常⽤,适⽤于各种情况,下⾯就是移动⽆边界窗体程序⽚断,加注释部分是⼿动加⼊的: unitUnit1; : type TForm1Κclass(TForm) procedureFormCreate(Sender:TObject); : public {申明消息过滤过程} procedureAppMessage(varMsg:TMsg;varHandled:Boolean); : implementation procedureTForm1.FormCreate(Sender:TObject); begin {捕捉消息:将程序的收到消息事件与消息过滤过程关联起来} Application.OnMessage:ΚAppMessage; end; procedureTForm1.AppMessage(varMsg:TMsg;varHandled:Boolean); begin {如果⿏标左键按下的话} ifMsg.messageΚWM—LButtonDownthen begin {判断光标是否在⽤户⼯作区内} ifDefWindowProc(Handle,WM—NCHitTest,0,GetMessagePos)ΚHTClientthen begin {发出⿏标在⽤户标题栏内被按下的消息} SendMessage(Handle,WM—NCLButtonDown, HTCaption,GetMessagePos); Handled:Κtrue;{消息处理完毕,窗体不再接受M ouseDown及Click事件,如果为false,程序的运⾏稍微有些不正常。
电脑视窗操作方法有哪些
电脑视窗操作方法有哪些电脑视窗操作是指在Windows操作系统中,对电脑视窗进行各种操作的方法。
视窗是计算机屏幕上显示的一个矩形区域,用户可以在其中执行各种任务。
下面将介绍一些常见的电脑视窗操作方法。
1. 打开和关闭视窗:在Windows桌面上双击其中一个程序的图标即可打开一个视窗。
关闭视窗的方法有多种,如单击窗口右上角的“关闭”按钮,或使用键盘快捷键Alt+F4。
2. 最大化和还原视窗:在Windows操作系统中,每个视窗都有一个最大化和还原的按钮。
如果点击最大化按钮,视窗将会占据整个屏幕;如果再次点击还原按钮,则视窗将恢复到原来的大小。
3. 最小化视窗:点击窗口右上角的“最小化”按钮或按下键盘快捷键Win+M,可以将视窗最小化到任务栏上,以便在后续需要时方便找回。
4. 移动视窗:在视窗的标题栏上按住鼠标左键不放,即可拖动视窗到其他位置。
也可以使用键盘快捷键Alt+空格,然后按下M键,使用方向键移动视窗。
5. 调整视窗大小:将鼠标移到窗口的边框上,当鼠标变为双向箭头时,按住鼠标左键移动鼠标即可调整视窗的大小。
也可以使用键盘快捷键Alt+空格,然后按下S键,使用方向键调整视窗的大小。
6. 分割视窗:可以将一个屏幕分割成两个窗口,每个窗口显示不同的程序。
点击窗口上方的“最大化”按钮时,会显示一个小箭头,点击之后,屏幕将分割成两个部分,可以在每个部分中打开不同的视窗。
7. 切换视窗:在Windows操作系统中,可以使用Alt+Tab键来切换不同的视窗。
按住Alt键,然后反复按下Tab键,即可在打开的视窗之间切换。
8. 将视窗置顶:在Windows操作系统中,可以将其中一个视窗置顶,即使点击其他视窗,该视窗还是保持在最上方。
右键点击任务栏上的视窗图标,在弹出菜单中选择“将窗口置顶”。
9. 窗口操作命令:在Windows操作系统中,可以使用一些命令来操作视窗。
比如,按下Win+左/右键,可以将视窗移动到屏幕的左侧或右侧;按下Win+上/下键,可以将视窗最大化或还原。
完成窗口切换的方法
完成窗口切换的方法嘿,朋友们!今天咱就来聊聊怎么完成窗口切换这档子事儿。
你想想看啊,咱平时用电脑的时候,是不是经常要在好多窗口之间跳来跳去呀?就跟咱在现实生活中一会儿去这个房间瞅瞅,一会儿去那个房间逛逛一样。
这窗口切换可太重要啦,要是不会,那可就像只无头苍蝇到处乱撞,效率低得要命呢!其实完成窗口切换不难,就几种方法。
比如说,用鼠标直接去点那个你想要的窗口,这就好比你在一群人里,一眼就瞅准了你要找的那个人,然后走过去跟他打招呼。
简单吧?还有啊,咱可以用键盘上的快捷键。
这就像是你有了个秘密通道,一下子就蹦到了你想去的地方。
比如说“Alt+Tab”,按一下,就可以在打开的窗口之间来回切换,那感觉,就像孙悟空一个筋斗云就翻到了目的地,快得很呐!再说说“Win+Tab”,这也挺好用的。
就好像你有了个魔法棒,轻轻一挥,那些窗口就都乖乖地排好队让你挑选,多有意思!你说,要是没有这些方法,咱得费多大劲才能在一堆窗口里找到自己想要的那个呀!那不得跟大海捞针似的。
有时候我就在想,这电脑的世界还真是奇妙,就这么几个简单的操作,就能让我们的工作和娱乐变得这么方便。
咱可得把这些小窍门都记好了,别到时候手忙脚乱的。
而且啊,熟练掌握窗口切换,那工作效率不得蹭蹭往上涨啊!你就可以快速地在文档、网页、聊天窗口之间切换,一点都不耽误事儿。
咱再回过头来想想,这生活中不也有很多类似的情况吗?我们不也得在各种事情之间灵活切换嘛。
就好像我们一会儿要工作,一会儿要陪家人,一会儿又要做自己喜欢的事儿,这可不就跟窗口切换一样嘛。
所以说呀,学会了窗口切换,可不仅仅是在电脑上有用,在生活中咱也能变得更加灵活、高效呢!怎么样,朋友们,是不是觉得很有道理呀?别再犹豫啦,赶紧去试试这些方法吧,让你的电脑操作变得溜溜的!就这么简单直接,没啥好纠结的,用起来就对啦!原创不易,请尊重原创,谢谢!。
QTQProgressBarQProgressDialog模态,位置设置,无边框,进度条样式
QTQProgressBarQProgressDialog模态,位置设置,⽆边框,进度条样式⼀关于模态设置QProgressDialog可以设置模态(需要在new的时候传⼊parent),QProgressBar设置不好;只有dialog可以设置模态,widget不能设置模态(QProgressBar继承⾃widget)⼆关于位置设置⼦窗⼝要相对于⽗窗⼝设置合适的位置,⽗窗⼝在屏幕上移动,⼦窗⼝对应跟着改变⼤⼩与位置:1 先设置⼦窗⼝的width与height,可以按⽗窗⼝的⽐例来;2 然后以⽗窗⼝的左上⾓为原点计算⼦窗⼝的位置QPoint;3 将2中的位置使⽤⽗窗⼝的mapToGlobal换算到屏幕的位置;4 将3中得到的位置设置给⼦窗⼝;如果⼦窗⼝设置成⽆边框的,则⼦窗⼝位置设置⾃动转换成相对于⽗窗⼝的位置,此时不再需要转换屏幕坐标设置;三关于⽆边框,⽆取消按钮setCancelButton(0);//隐藏取消按钮setWindowFlags(Qt::FramelessWindowHint);//⽆边框setStyleSheet("QWidget{background-color: rgb(255,255,255);}");//背景板是⽩⾊四关于进度条样式取消显⽰百分⽐,QProgressBar的setTextVisiable可以设置;但是QProgressDialog没有setTextVisiable怎么办?这时new⼀个QProgressBar(该QProgressDialog可构造设置为其parent,⽅便管理),然后QProgressDialog调⽤setBar即可;progressBar再设置setTextVisiable(false)即可。
进度条还可以设置QSS样式;五进度条⼤⼩控制有setFixedSize()与setMinminSize();先设置最⼩⼤⼩,然后设置固定⼤⼩,则最⼩限制被抵消;反之则可⾏;。
让窗口缩小的6种方法
让窗口缩小的6种方法
哎呀呀,你是不是有时候也想让窗口缩小呀?今天,我就来给你讲讲让窗口缩小的 6 种方法吧!
第一种方法,直接用鼠标去拖窗口的边缘呀。
就好像你拉着一个小玩具车,把它变小一样简单呢!比如说你正在看电影的窗口,你就可以用鼠标抓住它的边边,轻轻一拉,嘿,就变小啦。
第二种方法呢,是按窗口右上角的那个小按钮,那个最小化按钮呀。
这就好比是给窗口施了个魔法,“噗”的一下就变小躲起来啦。
比如你在工作的时候,暂时不想看到某个文档窗口,按一下那个按钮,它就乖乖变小藏起来咯。
第三种方法,嘿,是用快捷键哟!按“Alt+空格+N”,哇,窗口就缩
小了呢。
这就像是给窗口下达了一个神秘的指令,它立马就执行啦!比如你正在玩游戏,突然有人喊你,你就可以快速按这个快捷键,让游戏窗口缩小,然后去回应别人。
第四种方法,在任务栏上找到对应的窗口图标,右键单击,然后选“最小化”。
这就好像是给窗口发出了一个特别的信号,它就变小啦!就像你有好多窗口打开着,你想让其中一个缩小,就用这个方法呗。
第五种方法,有些软件自身会带有缩小的功能哦。
就像有些超级英雄有自己独特的技能一样。
比如说一些绘图软件,里面可能就有一个专门的按钮来让窗口缩小呢。
第六种方法,嘿嘿,想不到吧,关闭再重新打开,它也可能以比较小的形态出现哦。
这就有点像重新洗牌,总会有不一样的结果出现呢!假如你不小心把窗口弄很大了,又不知道怎么调,就试试这个办法呀!
怎么样,是不是很有趣呀?快试试这些方法吧!。
切换窗口的四种方法
切换窗口的四种方法
在日常的工作、学习、娱乐等方面,人们都会使用到电脑。
而在使用电脑时,如果多窗口并列,那么切换窗口就变得十分重要。
切换窗口不仅能让用户在多个窗口间快捷切换,而且也能提高工作效率。
因此,掌握切换窗口的方法就显得格外重要。
那么,切换窗口到底有哪些方法?其实,有许多种不同的方法可以用来切换窗口,本文将介绍四种最常见的方法。
第一种方法:键盘快捷键。
大多数电脑都自带有键盘快捷键,只要按下Alt+Tab可以在各个窗口之间快速切换。
但是这种方法只能切换那些已经打开的窗口,不能打开新窗口,也不能结束程序。
第二种方法:鼠标拖动。
使用鼠标可以轻松地从一个窗口切换到另一个窗口。
可以通过控制鼠标,将鼠标移动到另一个窗口,然后松开鼠标即可完成窗口的切换。
第三种方法:任务栏图标法。
任务栏中的任务图标可以显示出当前已经打开的窗口,只要将鼠标移动到需要切换的窗口上,点击一下即可完成窗口的切换。
第四种方法:窗口快速预览。
Windows 7以后的操作系统中提供了一种叫做“快速预览”的功能。
用户只要按下Win+Tab键,就可以快速地看到当前所有打开的窗口,再按下Tab键就可以实现窗口的切换。
以上就是切换窗口的四种方法。
用户可以根据自己的需要选择其中一种或多种方法。
无论选择哪一种,切换窗口都能提高工作效率,
增加操作的便利性,让用户在平时的学习和工作中都能够更好的感受到它的便利性。
窗口的操作
窗口大小合适后,松开鼠标左键 处于最大化的窗口不能用此法改变大小
最大化窗口:此窗口中只有恢复按钮.
方法1:单击窗口标题栏右侧的最大化 按钮
方法2:双击窗口标题栏中除按钮外的 空白处
最小化窗口:指窗口缩小为任务栏中的 小图标按钮形式。
窗口的操作窗口的操作一窗口的组成窗口的操作窗口的操作一窗口的组成二窗口的操作11移动窗口移动窗口移动鼠标使鼠标位于要移动窗口的标题栏内此时的光标应呈空心箭头状
窗口的操作
一、窗口的组成
窗口的操作
一、窗口的组成 二、窗口的操作
1、移动窗口
移动鼠标,使鼠标位于要移动窗口的标 题栏内,此时的光标应呈空心箭头状。
单击此小图标按钮,可使最小化程序窗 口恢复成缩小前的窗口状态
关闭窗口: 1、双击窗口标题栏左侧的控制图标 2、单击窗口标题栏右侧的关闭按钮 3、Alt +F4键
按窗口移至合适位置后,放开鼠标左键。
注:最大化的窗口无法移动
2、改变窗口大小
一、窗口的三种状态:最大化、最小化、中间 化窗口。
二、改变窗口大小是针对中间化窗口而言的。 方法如下:
光标指向窗口的四个边框或某一个角时,将显 示成双箭头状;
C#WinForm设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框
C#WinForm设置窗⼝⽆边框、窗⼝可移动、窗⼝显⽰在屏幕中央、控件去边框1)窗⼝去除边框在组件属性中FormBorderStyle设为None2)窗⼝随着⿏标移动⽽动添加引⽤using System.Runtime.InteropServices;在初始化控件{InitializeComponent();}代码后添加1 [DllImport("user32.dll")]2public static extern bool ReleaseCapture();3 [DllImport("user32.dll")]4public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);5bool beginMove = false;//初始化⿏标位置6int currentXPosition;7int currentYPosition;8 //获取⿏标按下时的位置9 private void QRCode_MouseDown(object sender, MouseEventArgs e)10 {11if (e.Button == MouseButtons.Left)12 {13 beginMove = true;14 currentXPosition = MousePosition.X;//⿏标的x坐标为当前窗体左上⾓x坐标15 currentYPosition = MousePosition.Y;//⿏标的y坐标为当前窗体左上⾓y坐标16 }17 }18 //获取⿏标移动到的位置19private void QRCode_MouseMove(object sender, MouseEventArgs e)20 {21if (beginMove)22 {23this.Left += MousePosition.X - currentXPosition;//根据⿏标x坐标确定窗体的左边坐标x24this.Top += MousePosition.Y - currentYPosition;//根据⿏标的y坐标窗体的顶部,即Y坐标25 currentXPosition = MousePosition.X;26 currentYPosition = MousePosition.Y;27 }28 }29 //释放⿏标时的位置30private void QRCode_MouseUp(object sender, MouseEventArgs e)31 {32if (e.Button == MouseButtons.Left)33 {34 currentXPosition = 0; //设置初始状态35 currentYPosition = 0;36 beginMove = false;37 }38 }3)窗⼝居中显⽰利⽤C# Form中的StartPosition属性CenterScreen将界⾯显⽰在屏幕中央若是⽤代码实现,显⽰窗体前,应设置此属性,可在调⽤Show()或是ShowDialog()⽅法之前或在窗体构造函数中设置此属性,不要在load()事件中改变此属性,不起作⽤。
无标题栏窗口移动方法种种
无标题栏窗口移动方法种种首先,看看在正常情况下系统是怎样来移动程序窗口的。
当使用者在程序窗口标题栏区域(非工作区)内,按下鼠标左键时将会发生下列事情:◆系统向该窗口过程函数发送WM_NCLBUTTONDOWN消息。
◆WM_NCLBUTTONDOWN消息最终将传送到窗口过程函数中的DefWindowProc()函数中去。
◆DefWindowProc()函数将根据鼠标左键按下并移动,以及HTCAPTION标识所表示鼠标按下时的位置诸多信息,来执行该消息的缺省动作即窗口随同鼠标光标一起移动的操作。
下面作为练习来测试一下,首先在窗口回调函数(即窗口过程函数)中设置下列语句:case WM_NCLBUTTONDOWNreturn 0;然后,同样是在窗口标题栏内按住鼠标左键并移动鼠标,但此时窗口却并不随同鼠标一起移动了,这是怎么回事?这是因为上述语句中设有“return 0”语句的缘故。
该语句使得WM_NCLBUTTONDOWN消息未能传递到DefWindowProc()函数,就在窗口过程函数中提前返回了,当然移动窗口的操作就无从进行了。
这也从反面印证了一个事实,那就是,最后完成移动窗口的操作将是由DefWindowProc()函数来完成的。
通过上面的分析可以勾划出这样一个操作过程:即用户在窗口标题栏内按下鼠标左键→系统发送WM_NCLBUTTONDOWN消息→DefWindowProc()函数接收消息→用户移动鼠标→DefWindowProc()函数执行窗口随同鼠标一起移动的操作。
由此得出一个结论,那就是要想实现移动窗口的操作,必须具备两个条件:一是要按下鼠标左键并移动(DefWindowProc()函数将检测这个条件);二是在按下鼠标左键时能发送WM_NCLBUTTONDOWN消息并返回HTCAPTION标识。
下面就根据以上的分析,在没有窗口标题栏的情况下,采取骗取DefWindowProc()函数的方式,来实现对无标题栏窗口实体的移动操作。
切换窗口的五种方法
切换窗口的五种方法
随着计算机和互联网的普及,人们在工作和生活中需要同时打开多个窗口,如何快速切换窗口成为了一项必备技能。
下面介绍五种切换窗口的方法,让你的操作更加高效。
1. Alt + Tab 切换
这是最基本的切换窗口方法,只需要按下键盘上的 Alt + Tab 键,就可以在所有打开的窗口中快速切换。
按住 Alt 键,不放手,按下Tab 键,可以循环切换到下一个窗口。
2. Win + Tab 切换
Win + Tab 是 Windows 10 新增的窗口切换方式,可以在所有打开的窗口中预览。
按下键盘上的 Win + Tab 键,可以打开任务视图,显示所有打开的应用程序。
在任务视图中,可以通过鼠标或方向键选择需要切换的窗口。
3. 鼠标滚轮切换
如果你的鼠标配备了滚轮,那么可以用它来切换窗口。
只需要将鼠标移动到任务栏上,然后用鼠标滚轮滚动,就可以循环切换窗口。
4. Alt + Esc 切换
这种方法是按照打开窗口的顺序来切换,只需要按下键盘上的
Alt + Esc 键,就可以依次切换到打开的窗口,最后返回到桌面。
5. Win + 数字键切换
如果你在任务栏上固定了一些应用程序,可以使用 Win + 数字
键的方式进行切换。
只需要按下键盘上的 Win 键和相应数字键,就
可以快速打开或切换到相应的应用程序。
以上是切换窗口的五种方法,每种方法都有自己的特点和适用场景,根据个人偏好和操作习惯选择合适的方式,可以提高工作效率,使操作更加顺畅。
C#Winform去掉窗体灰色边框,以及实现窗体可拖动边框改变大小
C#Winform去掉窗体灰⾊边框,以及实现窗体可拖动边框改变⼤⼩1)去掉窗体灰⾊边框:在设计窗⼝中,将Form的FormBorderStyle设置为 FixedSingle 。
但是设置后窗⼝⽆法实现拖动边框改变⼤⼩。
需要在Form.cs加⼊以下代码:private const int WM_NCLBUTTONDBLCLK = 163;private const int WM_NCHITTEST = 132;///<summary>///边框改变⼤⼩///</summary>///<param name="m"></param>protected override void WndProc(ref Message m){switch (m.Msg){case WM_NCLBUTTONDBLCLK://WM_NCLBUTTONDBLCLK=163 <0xA3>拦截⿏标⾮客户区左键双击消息,决定窗体是否最⼤化显⽰if (this.MaximizeBox){base.WndProc(ref m);this.Invalidate();}return;case WM_NCHITTEST://WM_NCHITTEST=132 <0x84>base.WndProc(ref m);//如果去掉这⼀⾏代码,窗体将失去MouseMove..等事件//Point lpint = new Point((int)m.LParam);//可以得到⿏标坐标,这样就可以决定怎么处理这个消息了,是移动窗体,还是缩放,以及向哪向的缩放//if (lpint.Y < 30)// m.Result = (IntPtr)0x2;//托动HTCAPTION=2 <0x2>if (WindowState != FormWindowState.Maximized){Point p2 = this.PointToClient(MousePosition);//⿏标相对于窗体的坐标//当然可以托动也可以改变⼤⼩了//label1.Text = p2.X + "," + p2.Y;//HTLEFT=10 <0xA> 左边框if (p2.X < 5 && p2.Y > 5 && p2.Y < this.Height - 5)m.Result = (IntPtr)0xA;else if (p2.Y < 5 && p2.X > 5 && p2.X < this.Width - 5)m.Result = (IntPtr)0xC;//HTTOP=12 <0xC> 上边框else if (p2.X < 5 && p2.Y < 5)m.Result = (IntPtr)0xD;//HTTOPLEFT=13 <0xD>else if (p2.X >= this.Width - 5 && p2.Y < 5)m.Result = (IntPtr)0xE;//HTTOPRIGHT=14 <0xE>else if (p2.X > this.Width - 5 && p2.Y > 5 && p2.Y < this.Height - 5)m.Result = (IntPtr)0xB;//HTRIGHT=11 <0xB>else if (p2.Y >= this.Height - 5 && p2.X > 5 && p2.X < this.Width - 5)m.Result = (IntPtr)0xF;//HTBOTTOM=15 <0xF>else if (p2.X < 5 && p2.Y >= this.Height - 5)m.Result = (IntPtr)0x10;//HTBOTTOMLEFT=16 <0x10>else if (p2.X > this.Width - 5 && p2.Y >= this.Height - 5)m.Result = (IntPtr)0x11;//HTBOTTOMRIGHT=17 <0x11>//HTBORDER=18 <0x12>//HTMINBUTTON=8 <0x8> 最⼩化按钮//HTMAXBUTTON=9 <0x9> 最⼤化按钮//HTCLOSE=20 <0x14> 关闭按钮}return;default:base.WndProc(ref m);return;}}。
易语言用窗口消息实现无边框调整和窗口的移动方法
易语⾔⽤窗⼝消息实现⽆边框调整和窗⼝的移动⽅法⾸先你可以添加4个图⽚框作为窗⼝的标题栏和边框窗⼝的四周边框和标题栏可以⽤图⽚框来捏造如果你不想别⼈看见图⽚框的话可以把图⽚框的背景颜⾊弄得和窗⼝底⾊⼀样移动窗⼝,你可以⽤:_启动窗⼝.发送信息 (161, 2, 0)改变窗⼝⼤⼩,你可以⽤:_启动窗⼝.发送信息 (274, 61441, 0) ' 可以调整窗⼝左边的边框_启动窗⼝.发送信息 (274, 61442, 0) ' 可以调整窗⼝右边的边框_启动窗⼝.发送信息 (274, 61443, 0) ' 可以调整窗⼝上边的边框_启动窗⼝.发送信息 (274, 61446, 0) ' 可以调整窗⼝下边的边框_启动窗⼝.发送信息 (274, 61444, 0) ' 可以同时调整窗⼝上边和左边的边框_启动窗⼝.发送信息 (274, 61445, 0) ' 可以同时调整窗⼝上边和右边的边框_启动窗⼝.发送信息 (274, 61447, 0) ' 可以同时调整窗⼝下边和左边的边框_启动窗⼝.发送信息 (274, 61448, 0) ' 可以同时调整窗⼝下边和右边的边框⽤法:我举个例⼦,添加个图⽚框,名称改为“标题栏”,例如要移动窗⼝:.⼦程序 _标题栏_⿏标左键被按下, 逻辑型.参数横向位置, 整数型.参数纵向位置, 整数型.参数功能键状态, 整数型_启动窗⼝.发送信息 (161, 2, 0)如果要改变窗⼝⼤⼩,我想你也知道该怎么⽤上⾯的代码如果在改变窗⼝⼤⼩时,你可以⽤.版本 2.⼦程序 __启动窗⼝_尺⼨被改变然后在该⼦程序⾥添加尺⼨改变后4个图⽚框的位置应该在哪的代码以上就是本次介绍的全部内容和先关代码,感谢⼤家对的⽀持。
SWT 无边框窗体拖动鼠标移动及右键菜单实现关闭操作
package dragWindow;import org.eclipse.jface.action.Action;import org.eclipse.jface.action.MenuManager;import org.eclipse.jface.window.ApplicationWindow;import org.eclipse.swt.SWT;import org.eclipse.swt.events.MenuDetectEvent;import org.eclipse.swt.events.MenuDetectListener;import org.eclipse.swt.events.MouseEvent;import org.eclipse.swt.events.MouseListener;import org.eclipse.swt.events.MouseMoveListener;import yout.GridData;import yout.GridLayout;import posite;import org.eclipse.swt.widgets.Control;import org.eclipse.swt.widgets.Menu;import org.eclipse.swt.widgets.Shell;public class DragWindow extends ApplicationWindow implements MouseListener, MouseMoveListener, MenuDetectListener {private Composite composite;private boolean isDraw = false;private int xx;private int yy;public DragWindow(Shell parentShell) {super(parentShell);setShellStyle(SWT.BORDER | SWT.RESIZE);}@Overrideprotected void configureShell(Shell shell) {super.configureShell(shell);shell.setSize(200, 300);}@Overrideprotected Control createContents(Composite parent) {composite = new Composite(parent, SWT.NONE);composite.setLayout(new GridLayout());GridData gridData = new GridData();gridData.verticalAlignment = GridData.FILL;gridData.horizontalAlignment = GridData.FILL;gridData.grabExcessHorizontalSpace = true;gridData.grabExcessV erticalSpace = true;composite.setLayoutData(gridData);composite.addMouseListener(this);composite.addMouseMoveListener(this);composite.addMenuDetectListener(this);return composite;}@Overridepublic void mouseMove(MouseEvent arg0) {if (isDraw) {getShell().setLocation(getShell().getLocation().x + arg0.x - xx,getShell().getLocation().y + arg0.y - yy);}}@Overridepublic void mouseDoubleClick(MouseEvent arg0) {}@Overridepublic void mouseDown(MouseEvent arg0) {isDraw = true;xx = arg0.x;yy = arg0.y;}@Overridepublic void mouseUp(MouseEvent arg0) {isDraw = false;}@Overridepublic void menuDetected(MenuDetectEvent arg0) {MenuManager manager = new MenuManager();manager.add(new CloseAction());Menu menu = manager.createContextMenu(composite);menu.setLocation(arg0.x, arg0.y);menu.setV isible(true);}private class CloseAction extends Action {public CloseAction() {super("Close");}@Overridepublic void run() {close();}}public static void main(String[] args) {DragWindow window = new DragWindow(new Shell());window.setBlockOnOpen(true);window.open();}}。
C#中窗体Form的美化窗体圆角的处理
C#中窗体Form的美化VS足够强大,强大到只需动动鼠标就可以写出个基本的界面出来,但是其自带的控件都是千篇一律的样式,对于追求完美的我而言,实在是忍不下去了,只好自己亲自动手对其进行改造----继承已有的控件,再对其相关的消息或事件进行处理。
窗体Form作为界面的主体部分,必先对其进行美化,在窗体自绘的过程中,需要使用到GDI+,如若对GDI+不是很了解的同学可移步我的CSDN博客或者搜索下相关的介绍。
这篇文章将要介绍到的内容:∙窗体圆角的处理∙无边框窗体大小的改变与移动∙窗体边框的绘制与边框阴影的实现∙系统按钮的绘制与事件处理∙窗体标题栏的绘制∙解决窗体闪烁的问题实现效果演示:代码下载一:窗体圆角的处理对于无边框窗体圆角矩形的处理,我这里采用的是使用API函数CreateRoundRectRgn,相比于自己用GDI+写的处理圆角的函数,效果要稍微好点,至少线条在圆角处过渡的比较平滑,为了便于复用,我把其封装到窗体自绘辅助类RenderHlper的SetFormRoundRectRgn函数中:View Code ///<summary>///设置窗体的圆角矩形///</summary>///<param name="form">需要设置的窗体</param>///<param name="rgnRadius">圆角矩形的半径</param>public static void SetFormRoundRectRgn(Form form, int rgnRadius){int hRgn = 0;hRgn = Win32.CreateRoundRectRgn(0, 0, form.Width + 1, form.Height + 1, rgnRadius, rgnRadius);Win32.SetWindowRgn(form.Handle, hRgn, true);Win32.DeleteObject(hRgn);}此处需要把所需要的API函数引用到类Win32中,引用的时候注意添加System.Runtime.InteropServices 命名空间:View Code [DllImport("gdi32.dll")]public static extern int CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3);[DllImport("user32.dll")]public static extern int SetWindowRgn(IntPtr hwnd, int hRgn, Boolean bRedraw);[DllImport("gdi32.dll", EntryPoint = "DeleteObject", CharSet = CharSet.Ansi)]public static extern int DeleteObject(int hObject);重写窗体的OnSizeChanged事件,并在此事件中调用SetFormRoundRectRgn,此处的Radius参数为定义的窗体圆角半径属性:View Code protected override void OnSizeChanged(EventArgs e){base.OnSizeChanged(e);RenderHelper.SetFormRoundRectRgn(this, Radius);}二:无边框窗体大小的改变与移动当把窗体的FormBorderStyle属性调整为FormBorderStyle.None时,此时,窗体的大小改变不了,同时窗体不能移动。
无边框窗口移动
第一步://先定义一个坐标点对象 mypointprivate Point mypoint;第二步:在窗体的点击事件中写private void Form1_MouseDown(object sender, MouseEventArgs e) {//鼠标在窗体内按下时,自动记录鼠标的 x y 值,并将它们改为负数mypoint = new Point(-e.X,-e.Y);}第三步:在窗体的鼠标移动事件中写private void Form1_MouseMove(object sender, MouseEventArgs e){/*鼠标在窗体内移动时,首先判断e.Button按下的是哪个鼠标按钮再判断* 是否等于左键按下,MouseButtons.Left这句的意思是鼠标左键按下状态*/if (e.Button == MouseButtons.Left){/*新建一个坐标点对象,它的坐标等于(Control.MousePosition;)* 桌面上坐标的位置*/Point myposition = Control.MousePosition;/*myposition.offset中的Offset是坐标平移的意思,现在将在窗体* 内点击左键时产生的负数加进来,也就等于现在鼠标在桌面上的坐标* 减去鼠标在窗体内的坐标位置,就等于现在窗体的位置*/myposition.Offset(mypoint.X, mypoint.Y);/*this.DesktopLocation这句的意思是获取或设置窗体在桌面上的位置* 它的位置来自myposition*/this.DesktopLocation = myposition;}其实这是个让人说过无数次的内容,但是最近在写一个测试小程序的时候发现了一个问题,今天没什么事做,就做个小的总结。
通过拖动窗体的客户区来移动一个窗体并不是很新鲜的内容,很多的程序都用到了这一点,尤其是一些可以换肤的程序。
多媒体课件制作的常用抓图技巧
多媒体课件制作的常用抓图技巧摘要:随着多媒体技术的发展,利用多媒体课件来辅助教学已成为主流,尤其是直观的图片呈现有利于提高教学的效果。
探讨了在多媒体课件制作中常用的几种抓图技巧和具体操作方式,为多媒体课件制作者提供指导与借鉴。
关键词:多媒体课件;抓图技巧;教学效果0引言随着网络信息技术的发展,高等学校招生规模不断扩大,高等教育对课堂教学的要求也越来越高,传统的板书教学,因其效率低、呈现方式单一、不直观等缺点,已经很难满足现代高等教育发展的需要。
现代的教育教学方式迫切需要一场变革来改变传统的教学方式,而多媒体教学方式的出现,彻底改变了传统的、单一的课堂教学模式。
多媒体教学方式的出现为现代的课堂教学带来了革命性的变革,其中多媒体课件是对传统纸质备课的一种颠覆性的变革,其所具有的声音、图像、形象、直观等特点能够让课堂教学焕然一新。
在多媒体教学成为主流的情况下,一个好的多媒体课件会给课堂教学带来翻天覆地的变化,尤其是图文并茂的课件,不仅继承了传统的教学方式,还融入了直观的图片,从而使得教学内容更加形象易懂。
在电脑已成为教学辅助手段的今天,通过图片带给人们的视觉冲击效果,能够为教育教学带来生机。
目前,应用于课堂教学的每个多媒体课件所包含的图形元素有背景、图表、建筑物、人物、抽象物体的线性轮廓、界面和按钮等,这些会使抽象难懂或是生涩的文字变得更加形象易懂。
多媒体课件中直观的图片应用不仅可以给学习者带来生理和心理上的反应,而且还可以产生情感和行动上的反应,这些都将有利于集中学习者的注意力,取得更好的教学效果。
但是现实中直接可以应用于教学的现成图片毕竟是有限的,尤其是一些需要用统计软件生成的统计图、画图工具如Photoshop制作的图像以及影视动画视频画面中的图片等,若要将其应用于教学就需要通过专业的工具进行抓图或是通过网络共享来获取,而通过抓图来获取是最方便最易达到目的的方式。
下文对日常教学中的常用抓图技巧和具体操作方式加以介绍。
切换窗口的四种方法
切换窗口的四种方法
软件开发中,窗口切换是一个十分常见的功能,它可以让用户在相同的上下文状态中从一个任务到另一个任务地更方便得多。
下面就来介绍一下窗口切换的四种方法。
第一种方法是使用标签页(Tab)法。
标签页法是最常用的切换窗口方法,它能够让用户在不同的窗口之间切换毫不费力。
它也是很多软件客户端常用的界面操作方式,在不同模式下能够实现窗口切换效果。
第二种是菜单式切换,它也被称之为窗口跳转模式。
当用户想要在不同的窗口间进行切换时可以使用菜单来实现,用户可以在菜单中选择不同的界面,来实现对同一类型任务的转换操作,而且这种方式可以避免多个标签页占用大量系统资源的问题。
第三种是图片浏览切换窗口。
当用户想要在多个窗口之间转换时,可以通过图片浏览的方式来聚焦于想要的窗口,并在图片浏览时,可以以滑动的方式进行切换,从而能够实现窗口切换的效果。
最后一种方法是分屏(Split)方式。
分屏方式就是将窗口分割成两部分,分别运用两个任务的界面,这样用户就可以在两个任务之间切换,从而实现窗口切换的功能。
无论是显示器还是手机,分屏方式在操作上都很方便。
以上就是窗口切换的四种方法,它们可以根据不同的操作系统和不同的设备去实现相应的界面操作。
在不同的场景下,能够有效地让用户从一个任务转变到另一个任务,极大地减轻着用户操作上的负担。
切换窗口的四种方法
切换窗口的四种方法
随着不断的计算机技术的发展和改进,现在人们都用计算机来完成日常工作,即便是家庭用户也同样会这么做。
为了优化工作效率,人们常常需要在不同的窗口之间进行切换,以保存工作中的每一步,或者以完成各种任务。
因此,正确使用切换窗口的方法对于提高工作效率具有重要意义。
一般来说,切换窗口有四种常用方法:
1.捷键:快捷键是指计算机操作系统中为提高操作效率而设置的一组特殊组合键。
使用快捷键切换窗口,可以让人们快速地打开和切换窗口,同时又不会有多余的动作。
2.标:鼠标是计算机操作系统中为提高操作效率而设置的一种输入设备。
使用鼠标可以让用户更容易地控制屏幕中的指针,控制窗口大小和位置,以及快速切换窗口。
3.他输入设备:除了快捷键和鼠标,也可以使用其他输入设备,如游戏手柄、连接设备,来进行窗口切换等操作。
4.口切换工具:有些计算机操作系统提供了一些窗口切换工具,可以非常方便地切换窗口,例如Windows操作系统提供的任务视图功能,可以帮助用户直接切换窗口,只需要点击或按键即可完成操作。
以上就是切换窗口的四种常用方法,它们各有优缺点,使用时可以根据实际情况选择合适的方法。
此外,有了这四种方法,切换窗口对于提高工作效率来说变得更加容易,有效地提高了用户的工作效率和质量。
伴随着社会不断进步,计算机技术也在不断发展。
现在,切换窗口的方法比起以前也大不相同。
这些改进可以帮助人们更有效地完成任务,它们的重要性不可忽视。
凭借良好的操作技术,能够有效地使用切换窗口的方法,人们可以更好地完成工作,提高工作效率。
C#实现窗口无边框,可拖动效果
总结
以上所述是小编给大家介绍的C# 实现窗口无边框,可拖动效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编 会及时回复大家的。在此也非常感谢大家对网站的支持!
这篇文章主要介绍了c邮件定时Fra bibliotek发工具atilia用法较为详细的分析了atilia实现邮件定时群发功能的原理与实现技巧具有一定参考借鉴价值需要的朋友可以参考下
C#实现窗口无边框 ,可拖动效果
具体代码如下所示:
#region 无边框拖动效果 [DllImport("user32.dll")]//拖动无窗体的控件 public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); public const int WM_SYSCOMMAND = 0x0112; public const int SC_MOVE = 0xF010; public const int HTCAPTION = 0x0002; private void Start_MouseDown(object sender, MouseEventArgs e) { //拖动窗体 ReleaseCapture(); SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); } #endregion
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一步://先定义一个坐标点对象 mypointprivate Point mypoint;第二步:在窗体的点击事件中写private void Form1_MouseDown(object sender, MouseEventArgs e) {//鼠标在窗体内按下时,自动记录鼠标的 x y 值,并将它们改为负数mypoint = new Point(-e.X,-e.Y);}第三步:在窗体的鼠标移动事件中写private void Form1_MouseMove(object sender, MouseEventArgs e){/*鼠标在窗体内移动时,首先判断e.Button按下的是哪个鼠标按钮再判断* 是否等于左键按下,MouseButtons.Left这句的意思是鼠标左键按下状态*/if (e.Button == MouseButtons.Left){/*新建一个坐标点对象,它的坐标等于(Control.MousePosition;)* 桌面上坐标的位置*/Point myposition = Control.MousePosition;/*myposition.offset中的Offset是坐标平移的意思,现在将在窗体* 内点击左键时产生的负数加进来,也就等于现在鼠标在桌面上的坐标* 减去鼠标在窗体内的坐标位置,就等于现在窗体的位置*/myposition.Offset(mypoint.X, mypoint.Y);/*this.DesktopLocation这句的意思是获取或设置窗体在桌面上的位置* 它的位置来自myposition*/this.DesktopLocation = myposition;}其实这是个让人说过无数次的内容,但是最近在写一个测试小程序的时候发现了一个问题,今天没什么事做,就做个小的总结。
通过拖动窗体的客户区来移动一个窗体并不是很新鲜的内容,很多的程序都用到了这一点,尤其是一些可以换肤的程序。
这篇文章并不打算详细论述如何在C#下实现这一功能,因为它的代码实在是简单得不能再简单。
这里简单说一下实现的原理:首先说一个概念——窗体的客户区,窗体的客户区指的是一个窗体除了标题栏和边框以外的部分。
当我们的鼠标在窗体中移动的时候,会触发WM_NCHITTEST系统消息,MSDN中对这个消息的说明为:The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released. If the mouse is not captured, the message is sent to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse. (当光标移动或一个鼠标键被按下或释放时,WM_NCHITTEST消息会被发送到一个窗口中,如果光标没有被捕获,这个消息被送到光标下的窗口。
否则这个消息被送到捕获了光标的窗口。
)这个消息被默认的(请注意是“默认的”)窗口过程(窗口过程这个概念后面再说)处理后,会根据触发这个消息时鼠标的位置返回一个值,例如当鼠标在窗口的标题栏上时,返回HTCAPTION;当鼠标在一个窗口的客户区中时,返回HTCLIENT;如果鼠标指向某个窗口的字窗口的“关闭”按钮或系统菜单(就是点击窗口图标后出现的那个菜单),就返回HTSYSMENU。
所以我们要做的就是骗!我们要欺骗Windows,当我们的鼠标在窗体的客户区中移动时,默认的窗口过程处理后会返回 HTCLIENT,Windows系统根据这个值进行相应的操作,把适当的消息插入到应用程序的消息队列(这个概念同样在后面讨论)中。
这时如果我们做一些改变,人为地修改窗口过程的返回值,把HTCLIENT修改为HTCAPTION并返回给系统,系统就会认为鼠标这时在窗体的标题栏中,而拖动标题栏可以移动一个窗体,所以当我们在一个被这样修改后的应用程序的客户区按下鼠标并拖动时,Windows会认我们在拖动一个窗体的标题栏,于是它把一个移动窗体的消息插入到程序的消息队列中,再经过窗口过程的处理,就实现了我们需要的功能——拖动窗体的客户区移动窗体。
于是就有了下面的代码:protected override WndProc(ref message m){switch (m.Msg){case WM_NCHITTEST: //如果鼠标移动或单击base.WndProc(ref m);//调用基类的窗口过程——WndProc方法处理这个消息if (m.Result == (IntPtr)HTCLIENT)//如果返回的是HTCLIENT{m.Result = (IntPtr)HTCAPTION;//把它改为HTCAPTIONreturn;//直接返回退出方法}break;}base.WndProc(ref m);//如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理}这也是MSDN上的一个例子,重写窗体的WndProc方法,判断消息然后返回。
我本来也是想这样就完事了,可是后来测试的时候却发现有个大问题:双击窗体的时候,窗体会最大化。
那天脑子有点迷糊,也没多想就到网上问了一下,一个高手提醒我说可能是那个重写的窗口过程的问题,于是一下子明白了。
我们向Windows传递了假信息,Windows我们在窗体的客户区双击鼠标在Windows看来是双击了窗体的标题栏,理所当然的Windows会告诉窗口过程窗体需要最大化,窗口过程又理所当然的照做了,于是就出现了这样的现象。
刚开始的时候还不是很确定这样想对不对,不过后来出现的另一个现象证实了这个推断是正确的:因为窗体没有标题栏,每次退出程序都要按Alt+F4实在是比较不爽,我就给窗体添加了一个ContextMenuStrip,只有一个菜单项用来关闭窗体退出程序。
我发现当我修改了窗体的默认窗口过程后,这个右键菜单就显示不出来了。
出现这个现象的原因只能有一个——Windows真的把窗体的客户区当成标题栏处理了,而默认ContextMenuStrip只能用在窗体的客户区或控件上。
后来我又跟那位高手讨论了一下,他给我提供了另一种方法,这个方法需要两个API函数:LRESULT SendMessage(HWND hWnd,// handle of destination windowUINT Msg,// message to sendWPARAM wParam,// first message parameterLPARAM lParam // second message parameter);BOOL ReleaseCapture(VOID)SendMessage函数想必不用多说了,无数个木马制作教学贴里都有详细的描述,这个函数用来向指定的窗体发送Windows消息,功能的确十分强大^_^ReleaseCapture函数相对陌生一些,这个函数用来释放被当前线程中某个窗口捕获的光标。
他给出的代码是这样的:private void Form1_MouseDown(object sender, MouseEventArgs e){ReleaseCapture();SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);}也就是说,在窗体的MouseDown(鼠标按下)事件中,首先释放光标,然后向窗口过程发送WM_SYSCOMMAND消息。
说实话这个方式的SendMessage函数调用我也是第一次遇到,刚开始怎么也不明白为什么要把它们(SC_MOVE 和 HTCAPTION)用一个加号连接起来。
这个WM_SYSCOMMAND消息包含了一些信息表示用户要进行的操作,消息的wParam 字段表示用户要最大化、最小化或移动窗体。
我去掉HTCAPTION试了一下,每当我在窗体上按下鼠标左键时,鼠标就会移动到窗体的最顶端——原来标题栏的位置,与我们在系统菜单中选择“移动”菜单项的效果一样。
于是查阅MSDN,在WM_SYSCOMMAND的帮助中查到这样一句话:In WM_SYSCOMMAND messages, the four low-order bits of the uCmdType parameter are used internally by Windows. To obtain the correct result when testing the value of uCmdType, an application must combine the value 0xFFF0 with the uCmdType value by using the bitwise AND operator. (在WM_SYSCOMMAND消息中,uCmdType的低四位是Windows内部使用的。
如果测试时要获得uCmdType的正确结果,应用程序必须把0xFFF0这个值与uCmdType的值通过位相加的方式合并在一起。
)于是豁然开朗:这个所谓的“Windows内部使用的值”在移动这个窗体的时候其实就是表示“窗体的标题栏”,所以我们使用SC_MOVE + HTCAPTION表示窗体将被移动且目前鼠标正在窗体的标题栏中。
至于这里为什么要先释放光标再发送消息,根据前面的WM_NCHITTEST消息的说明,如果光标被当前窗口捕获,那么当鼠标移动时,就会发送 WM_NCHITTEST到我们的窗体,而由于我们这时没有重写窗口过程,这个消息会被按照默认的方式处理,Windows会发现鼠标在窗体的客户区移动,SendMessage发过去的HTCAPTION被WM_NCHITTEST消息中的HTCLIENT覆盖,这样窗体就不会有任何动作。
还有两个名词解释:窗口过程:窗口过程是一个应用程序定义的、用来处理Windows消息的回调(CallBack)函数,当有消息发生时,窗口过程负责处理消息。
消息队列:Windows会把有关一个应用程序的全部消息放到一块内存区域中,这个区域使用一种先进先出(FIFO)的方式工作,就是说最先进入这个区域的消息会第一个离开这个区域,故称消息队列。
应用程序从消息队列中取出一条消息,进行相应的处理,返回一定的信息,然后再取出下一条处理。
例1:using System;using ponentModel;using System.Drawing;using System.Windows.Forms;namespace LiBo.WinControls.Forms {/// <summary>/// DragForm 类是可/// </summary>public class DragForm : System.Windows.Forms.Form {private bool dragEnable;private bool dragging;private int xOld, yOld;public DragForm() : base() {dragEnable = false;}/// <summary>/// 获取或设置一个值,该值指示窗体是否可以通过鼠标左键拖动。