凡科建站的建站后如何管理,户户通行业网站,新闻热点事件及评论,营销型的网站http://www.cnblogs.com/GnagWang/archive/2010/09/12/1824394.html 我为了移动一个无标题栏的窗体#xff0c;使用了WM_NCHITTEST消息#xff0c;这个消息大概如下#xff1a; 通常#xff0c;我们拖动对话框窗口的标题栏来移动窗口#xff0c;但有时候#xff0c;我们想… http://www.cnblogs.com/GnagWang/archive/2010/09/12/1824394.html 我为了移动一个无标题栏的窗体使用了WM_NCHITTEST消息这个消息大概如下 通常我们拖动对话框窗口的标题栏来移动窗口但有时候我们想通过鼠标在客户区上拖动来移动窗口。 一个容易想到的方案是处理鼠标消息WM_LBUTTONDOWN和WM_LBUTTONUP。在OnLButtonUp函数中计算鼠标位置的变化调用MoveWindow实现窗口的移动。 注意拖动标题栏移动窗口的时候会出现一个矩形框它提示了窗口移动的当前位置。当鼠标左键放开的时候窗口就移动到矩形框所在位置。而我们的实现方案中没有这个功能。 要实现此功能我们必须自己来画这些矩形。 事实上我们没有必要自己来做这件事情因为Windows已经给我们做好了。 试想如果我能够欺骗Windows告诉它现在鼠标正在拖动的是标题栏而不是客户区那么窗口移动操作就由Windows来代劳了。 要欺骗Windows并不像想像中的困难甚至非常简单。 我们利用一个消息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 sent to the window that has captured the mouse. 这个消息是当鼠标移动或者有鼠标键按下时候发出的。 Windows用这个消息来做什么 “HITTEST”就是“命中测试”的意思WM_NCHITTEST消息用来获取鼠标当前命中的位置。 WM_NCHITTEST的消息响应函数会根据鼠标当前的坐标来判断鼠标命中了窗口的哪个部位消息响应函数的返回值指出了部位例如它可能会返回HTCAPTION或者HTCLIENT等。其返回值有很多请查阅MSDN。 为了便于理解我先描述一下Windows对鼠标键按下的响应流程 确定鼠标键点击的是哪个窗口。Windows会用表记录当前屏幕上各个窗口的区域坐标当鼠标驱动程序通知Windows鼠标键按下了Windows根据鼠标的坐标确定它点击的是哪个窗口。 确定鼠标键点击的是窗口的哪个部位。Windows会向鼠标键点击的窗口发送WM_NCHITTEST消息来询问鼠标键点击的是窗口的哪个部位。WM_NCHITTEST的消息响应函数的返回值会通知Windows。通常来说WM_NCHITTEST消息是系统来处理的用户一般不会主动去处理它也就是说WM_NCHITTEST的消息响应函数通常采用的是Windows默认的处理函数。 根据鼠标键点击的部位给窗口发送相应的消息。例如如果WM_NCHITTEST的消息响应函数的返回值是HTCLIENT表示鼠标点击的是客户区则Windows会向窗口发送WM_LBUTTONDOWN消息如果WM_NCHITTEST的消息响应函数的返回值不是HTCLIENT可能是HTCAPTION、HTCLOSE、HTMAXBUTTON等即鼠标点击的是非客户区Windows就会向窗口发送WM_NCLBUTTONDOWN消息。 我们有必要详细讨论一下如果WM_NCHITTEST的消息响应函数的返回值是HTCAPTION即指示了鼠标点击了标题栏接下去Windows的处理是怎样的 上面已经提到接下来Windows会向窗口发送WM_NCLBUTTONDOWN消息。 MSDN对WM_NCLBUTTONDOWN消息描述如下 WM_NCLBUTTONDOWN nHittest (INT) wParam; // hit-test value pts MAKEPOINTS(lParam); // position of cursor WM_NCLBUTTONDOWN的wParam指示了鼠标点击的窗口部位lParam指示了当前鼠标的坐标。 如果应用程序没有对该消息响应则由系统默认处理。 系统默认处理又是怎样的呢系统发现wParam指示了鼠标点击的是标题栏就会标识当前窗口处于“拖拽状态”Windows内部记录了每个窗口的状态信息。由于标识了“拖拽状态”则从此刻起到鼠标键放开之前你的鼠标移动状况完全由Windows跟踪。它根据鼠标的移动使得窗口作“同步”移动。 注意这个过程中窗口不会收到WM_NCMOUSEMOVE消息因为窗口和鼠标是“同步”移动的你的鼠标相对于窗口是静止的。 但问题同时也出现了 我想在右键这个窗体的时候弹出一个菜单 当我完成 MSG_WM_RBUTTONDOWN 这个消息的时候发现窗体收不到这个消息 将WM_NCHITTEST消息的实现去掉就可以了看了一原因是 因为你在WM_NCHITTEST中处理了鼠标消息把他定位成HTCAPTION也就是鼠标在标题栏上而标题栏属于非客户区NC; 非客户区的事件消息都是以WM_NC开头的。也就是说当你的WM_NCHITTEST返回HTCAPTION时原来可以用WM_LBUTTONUP处理的消息你只能用WM_NCLBUTTONUP来处理。 解决方法 同时处理WM_NCHITTEST和WM_NCRBUTTONUP而不处理WM_RBUTTONUP 转载于:https://www.cnblogs.com/sky1991/p/3264264.html