如何在纯进度条的窗体上按下鼠标能够拖动窗体

iceofwater 2017-11-13 02:17:53
现在的界面是只有一个进度条,窗体的大小也就是进度条的大小,现在我想在进度条上按下鼠标左键,能够拖动这个进度条,想拖哪就拖哪
我在用OnNcHitTest方式时发现只能实现鼠标按下的区域在窗体上,才能响应,但是在进度条上则不会响应
所以发帖请教各位大神,如何在进度条上按下鼠标左键能够拖动这个窗体,谢谢!
...全文
303 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iceofwater 2017-11-20
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
5 楼代码 没问题,就是 在 TranslateMessage 前 PreTranslateMessage 中 截获 WM_MOUSEMOVE 这样 WM_MOUSEMOVE 就不会到 进度条 控件中去
问题搞定了,我没有采用这些方法,我是重新写了个CProgressCtrl类,然后在鼠标左键按下的事件中,给父窗体标题栏发送OnNcHitTest的消息,就能够实现拖动了,能够达到效果,不过也感谢给了我灵感。
schlafenhamster 2017-11-16
  • 打赏
  • 举报
回复
while (GetMessage (&msg, NULL, 0, 0)) { if(!PreTranslateMessage (&msg)) TranslateMessage (&msg) ; DispatchMessage (&msg) ; }
schlafenhamster 2017-11-16
  • 打赏
  • 举报
回复
如果是 win32 工程

BOOL PreTranslateMessage(MSG *pMsg)
{
static POINT ptLast;
	// TODO: Add your specialized code here and/or call the base class
	if(pMsg->message==WM_MOUSEMOVE)
	{
		if(MK_LBUTTON==pMsg->wParam)
		{
			RECT rc;
			GetWindowRect(pMsg->hwnd,&rc);// desk
			MoveWindow(pMsg->hwnd, rc.left+(pMsg->pt.x-ptLast.x), rc.top+(pMsg->pt.y-ptLast.y),
				       rc.right-rc.left, rc.bottom-rc.top, TRUE);
			ptLast=pMsg->pt;// screen coord
		}
		else
		{
			ptLast=pMsg->pt;// screen coord
		}
		return TRUE;
	}
	return FALSE;
}
调用处 while (GetMessage (&msg, NULL, 0, 0)) { if(!PreTranslateMessage (&msg)) TranslateMessage (&msg) ; DispatchMessage (&msg) ; }
schlafenhamster 2017-11-16
  • 打赏
  • 举报
回复
5 楼代码 没问题,就是 在 TranslateMessage 前 PreTranslateMessage 中 截获 WM_MOUSEMOVE 这样 WM_MOUSEMOVE 就不会到 进度条 控件中去
iceofwater 2017-11-16
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
"能够拖动这个进度条,想拖哪就拖哪" 是拖动只有一个进度条的窗口,窗口有没有标题栏 ?
是的,这个窗口只有进度条,并且窗口就只有进度条这么大,因为明显就只能拖动这个进度条,才能拖动窗体啊
iceofwater 2017-11-16
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
建议从 CSliderCtrl 下手
这个有用吗?
iceofwater 2017-11-16
  • 打赏
  • 举报
回复
引用 1 楼 dingxz105090 的回复:
方法1:子类化进度条控件,在其点击事件中设定为点击了父窗体 方法2:不用任何控件,直接在窗体上绘制进度,想怎么画就怎么画,不影响点击和拖动
有点不太懂得怎么实现啊
schlafenhamster 2017-11-14
  • 打赏
  • 举报
回复
MFC 代码,

BOOL CDIDlg::PreTranslateMessage(MSG* pMsg) 
{
static CPoint ptLast;
	// TODO: Add your specialized code here and/or call the base class
	if(pMsg->message==WM_MOUSEMOVE)
	{
		if(MK_LBUTTON==pMsg->wParam)
		{
			CRect rc;
			GetWindowRect(&rc);// screen coord
			MoveWindow(rc.left+(pMsg->pt.x-ptLast.x), rc.top+(pMsg->pt.y-ptLast.y), rc.Width(), rc.Height());
			ptLast=pMsg->pt;// screen coord
		}
		else
		{
			ptLast=pMsg->pt;// screen coord
		}
		return TRUE;
	}
	return CDialog::PreTranslateMessage(pMsg);
}
Eleven 2017-11-14
  • 打赏
  • 举报
回复
你是想用鼠标拖动进度条,改变进度条的进度,还是拖得进度条移动到其它位置,而不改变进度?
schlafenhamster 2017-11-13
  • 打赏
  • 举报
回复
"能够拖动这个进度条,想拖哪就拖哪" 是拖动只有一个进度条的窗口,窗口有没有标题栏 ?
zgl7903 2017-11-13
  • 打赏
  • 举报
回复
建议从 CSliderCtrl 下手
凌乱哥 2017-11-13
  • 打赏
  • 举报
回复
方法1:子类化进度条控件,在其点击事件中设定为点击了父窗体 方法2:不用任何控件,直接在窗体上绘制进度,想怎么画就怎么画,不影响点击和拖动

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧