两种方法实现点击窗口任意位置的拖拽

一般的窗口只有点击地址标题栏才能实现拖拽,以下代码可以实现点击任何位置产生拖拽。

 1> 首先介绍MFC实现的方法:

在对话框“属性”栏中调出“message”中的WM_NCHITTEST,对于函数为OnNcHitTest

LRESULT CFadeDlg::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
 return CDialog::OnNcHitTest(point);
}

在其中添加需要的代码后,OnNcHitTest函数如下:

LRESULT CFadeDlg::OnNcHitTest(CPoint point)
{
	// TODO: Add your message handler code here and/or call default

	//得到鼠标点击的窗口的部位
	UINT nHitTest = CDialog::OnNcHitTest(point);
	// 如果鼠标点击的是客户区,则返回HTCAPTION给Windows
	if (nHitTest == HTCLIENT)
	{
		return HTCAPTION;
	}
	else
		return nHitTest;
	return CDialog::OnNcHitTest(point);
}


2> 再介绍使用window API实现方法:

假设注册窗口类传递的回调函数为WndProc

例如:

	wcex.lpfnWndProc	= (WNDPROC)WndProc;

在WndProc的switch中case WM_NCHITTEST添加部分代码,效果如下:

LRESULT __stdcall WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
	switch(nMsg)
	{
		case WM_NCHITTEST:
		{
			UINT nHitTest;
			nHitTest = ::DefWindowProc(hWnd, WM_NCHITTEST, wParam, lParam);
			if (nHitTest == HTCLIENT &&
				::GetAsyncKeyState(MK_LBUTTON) < 0) // 如果鼠标左键按下,GetAsyncKeyState函数的返回值小于0
				nHitTest = HTCAPTION;
			return nHitTest;
		}
		case ...
		...
	}
}


也可参考:http://www.cnblogs.com/lzjsky/archive/2010/08/04/1791874.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现C#窗体的任意位置拖动效果,可以通过以下步骤进行: 1. 在窗体上添加一个Panel控件,并将其Dock属性设置为Top。这个Panel控件将作为窗体的标题栏。 2. 在Panel控件上添加一个Label或者其他控件,用来显示窗体的标题。 3. 在Panel控件的MouseDown事件中,获取鼠标当前的位置,并将窗体的Location属性设置为这个位置。同时设置一个变量记录鼠标按下时的位置。 4. 在Panel控件的MouseMove事件中,如果鼠标左键被按下,计算鼠标当前位置和按下时位置的偏移量,然后将窗体的Location属性加上这个偏移量。 下面是示例代码: ``` public partial class Form1 : Form { private Point mouseOffset; public Form1() { InitializeComponent(); } private void panelTitle_MouseDown(object sender, MouseEventArgs e) { mouseOffset = new Point(-e.X, -e.Y); this.Cursor = Cursors.SizeAll; } private void panelTitle_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point mousePos = Control.MousePosition; mousePos.Offset(mouseOffset.X, mouseOffset.Y); this.Location = mousePos; } } private void panelTitle_MouseUp(object sender, MouseEventArgs e) { this.Cursor = Cursors.Default; } } ``` 在上述代码中,panelTitle是我们添加的Panel控件,用来作为窗体的标题栏。在MouseDown事件中,我们记录鼠标按下时的位置,并将鼠标的光标设置为SizeAll,以便用户知道窗体可以被拖动。在MouseMove事件中,如果鼠标左键被按下,我们计算鼠标当前位置和按下时位置的偏移量,并将窗体的Location属性设置为鼠标当前位置加上偏移量。在MouseUp事件中,我们将光标设置回默认状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值