拖动无标题窗口的方法

有的时候,我们需要自绘窗口的标题,或者隐藏了窗口标题,那么问题来了,这就是怎么拖动无标题的窗口?

这个问题的本质便是怎么在窗口的客户区上,拖动鼠标,并且移动窗口。

通常状态下,一个窗口只有在标题栏的区域,才会响应鼠标拖动的消息。而在窗口的客户区并不会响应。

这样便有了一个方法,就是我们可以欺骗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.

这个消息是当鼠标移动或者有鼠标键按下时候发出的。

如果WM_NCHITTEST的消息响应函数的返回值是HTCLIENT,表示鼠标点击的是客户区,则Windows会向窗口发送WM_LBUTTONDOWN消息;如果WM_NCHITTEST的消息响应函数的返回值不是HTCLIENT(可能是HTCAPTION、HTCLOSE、HTMAXBUTTON等),即鼠标点击的是非客户区,Windows就会向窗口发送WM_NCLBUTTONDOWN消息。

这个介绍对这个没有什么大关系,但是可以帮助你理解。

接下来便是实现的具体方法,这个方法分为两步:

1.在MESSAGE_MAP中添加ON_WM_NCHITTEST()

2.手动添加响应函数UINT OnNcHitTest(CPoint point)

其中应这么处理:

UINT CYourClass::OnNcHitTest(CPoint point)
{
	UINT nh=CDialog::OnNcHitTest(point);
	return ((nh==HTCLIENT)?HTCAPTION:nh);
}

第二个办法很简单了,就是处理鼠标左击消息:

首先添加鼠标左键单击消息,用自动添加便可。

void CYourClass::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	SendMessage(WM_SYSCOMMAND,0xF012,0);
	CDialog::OnLButtonDown(nFlags, point);
}

需要注意的是SendMessage(WM_SYSCOMMAND,0xF012,0);

这跟第一个方法的效果相差不大,发送的消息说明的是发送SC_MOVE + HTCAPTION,所以这里简写成为0xF012。

时间: 2024-08-28 23:18:51

拖动无标题窗口的方法的相关文章

141107●Winform拖动无边框窗口、播放音频、启动外部exe程序

鼠标拖动无边框窗口 1. //鼠标拖动 Point downpoint = new Point(); //事件,鼠标按下,获取当前坐标 private void panel1_MouseDown(object sender, MouseEventArgs e) { downpoint.X = -e.X; downpoint.Y = -e.Y; } //事件,鼠标移动,赋值新坐标 private void panel1_MouseMove(object sender, MouseEventArgs

Delphi中拖动无边框窗口的5种方法

1.MouseMove事件中加入: // ReleaseCapture;// Perform(WM_SYSCOMMAND, $F017 , 0); 2.MouseDown事件中加入: // POSTMESSAGE(Self.Handle,WM_LBUTTONUP,0,0);// POSTMESSAGE(Self.Handle,274,61458,0); 3.MouseDown事件中加入: // ReleaseCapture;// Perform(WM_SYSCOMMAND, $F012, 0);

QT无标题窗口在任务栏显示关闭(增加系统菜单)

在对话框中使用了如下代码: setWindowFlags(Qt::FramelessWindowHint); 在任务栏上右键点击程序,不会弹出菜单,解决办法,使用下面代码: setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); http://blog.csdn.net/itjobtxq/article

delphi技巧——移动无标题窗口

http://weibo.com/P-V5bm03j-p-P-p/1001604190250212701970淮昭练人傻RMP露攀痘恫 http://weibo.com/P-Yry1ypv-p-P-p/1001604190250263034582橇醋写礁杀CWB宰撑岗让 http://weibo.com/P-EKHuEFO-p-P-p/1001604190250279812212纤弥诙琅舜UVS谰掌哨蹦 http://weibo.com/P-Gb7akdm-p-P-p/1001604190250

无标题窗体拖动(三种方法)

通过响应“wm_NCHitTest”消息来移动窗体.Windows发送“wM_NCHitTest”消息来确定鼠标操作是否发生在窗体的客户区,或边框的特殊区上(非客户区).如果Windows发现用户单击了窗体标题,系统将移动窗体,单击了窗体边框,则系统将开始改变窗体大小.例程如下: //声明一自定义事件,拦截“WM_NCHITTEST”消息 Procedure MoveForm(var M:TWMNCHITTEST);Message WM_NCHITTEST; Procedure TForm1.M

C#无标题窗体的拖动

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; namespace Example013_无标题窗体的拖动 { /// <summary> /// Form1 的摘要说明. /// </s

MFC修改窗口无标题和标题信息,修改执执行文件图标

一.创建MFC后 窗口显示的是 无标题-工程名 修改方法在网上看到了几种,下面介绍下比较简单的一种: 1.在MianFrame.c文件中找到这个函数 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 2.在函数中添加这样一句可以 修改标题名称 m_strTitle = "我的标题v1.0"; 3.在函数中添加如下代码可以去除无标题几个字 cs.style &= ~FWS_ADDTOTITLE ;//防止MFC在窗口标题

关于无标题栏窗口拖动的问题

要使无标题栏窗口实现拖动效果,除了处理OnNCHitTest()函数外:就是在OnLButtonDown()函数中发送虚假消息了. 但是,这儿得注意一下,在OnLButtonDown()函数中如果使用SetCapture()函数后再::SendMessage(m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);是不会成功的!必须去掉或在之后使用. void XWindow::OnLButtonDown(UINT nFlags, CPoint point) { XCon

Android:实现无标题的两种方法

实现无标题的两种方法:配置xml文件和编写代码设置 1.在AndroidManifest.xml文件中进行配置 实现全屏效果: android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 实现无标题栏(但有系统自带的任务栏): android:theme="@android:style/Theme.NoTitleBar" 2.编写代码设置 requestWindowFeature(Window.FEATURE