问个MFC问题

归途醉染 2018-06-30 10:50:53
MFC中,如何实现鼠标点击按钮一直按着不松开,会一直执行, 鼠标松开就停止执行
...全文
538 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
归途醉染 2018-07-10
  • 打赏
  • 举报
回复
引用 32 楼 schlafenhamster 的回复:
UINT newState=GetAsyncKeyState(VK_LBUTTON);// 0x8001(0)

明白了 谢谢
schlafenhamster 2018-07-10
  • 打赏
  • 举报
回复
UINT newState=GetAsyncKeyState(VK_LBUTTON);// 0x8001(0)
归途醉染 2018-07-10
  • 打赏
  • 举报
回复
引用 30 楼 xianglitian 的回复:
设置一个变量,鼠标按下的时候设为真,抬起的时候设为假,如果标志为真一直执行你要的操作

您好 怎么判断鼠标抬起动作
MK_LBUTTON 是鼠标按下的状态
向立天 2018-07-10
  • 打赏
  • 举报
回复
设置一个变量,鼠标按下的时候设为真,抬起的时候设为假,如果标志为真一直执行你要的操作
schlafenhamster 2018-07-06
  • 打赏
  • 举报
回复
"鼠标单点界面的时候" 你按下 LBUTTON 会 一直 执行 到 你 松开 LBUTTON !
归途醉染 2018-07-06
  • 打赏
  • 举报
回复
引用 25 楼 schlafenhamster 的回复:
再 给 一个 不用MouseMove的
void CMoveStaticDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
static int i=0;
while(nFlags==MK_LBUTTON)// 1
{
UINT newState=GetAsyncKeyState(VK_LBUTTON);// 0x8001(0)
if(newState & 0x8000)
{
afxDump << i << "\n";// 调用 你的 函数
i++;
nFlags=MK_LBUTTON;
}
else
{
nFlags=0;
}
}
CDialog::OnLButtonDown(nFlags, point);
}
不过这是 一个 阻塞 界面 的 函数 !


阻塞的 鼠标单点界面的时候回执行两次
归途醉染 2018-07-06
  • 打赏
  • 举报
回复
引用 26 楼 qq_36088602 的回复:
[quote=引用 24 楼 qq_36088602 的回复:]
[quote=引用 21 楼 schlafenhamster 的回复:]
通常 是
void CMyStatic1::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static CPoint ptLast;
if(MK_LBUTTON==nFlags)
{
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
MapWindowPoints(GetParent(),&rc);
MoveWindow(rc.left+(point.x-ptLast.x), rc.top+(point.y-ptLast.y), rc.Width(), rc.Height());
}
else
{
ptLast=point;
CStatic::OnMouseMove(nFlags, point);
}
Invalidate();
//
// CStatic::OnMouseMove(nFlags, point);
}

即利用 MouseMove 来 不断 产生 消息,然后是 检测 MK_LBUTTON==nFlags


如果 不用 MouseMove 你得 用别的方法 保持 不断 有消息。如 timer


好 谢谢 我尝试一下[/quote]

兄弟 按照你这个方法 出现如图错误:

还有就是关闭按钮的时候也会出现[/quote]

谢谢兄弟 搞定了
归途醉染 2018-07-06
  • 打赏
  • 举报
回复
引用 24 楼 qq_36088602 的回复:
[quote=引用 21 楼 schlafenhamster 的回复:]
通常 是
void CMyStatic1::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static CPoint ptLast;
if(MK_LBUTTON==nFlags)
{
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
MapWindowPoints(GetParent(),&rc);
MoveWindow(rc.left+(point.x-ptLast.x), rc.top+(point.y-ptLast.y), rc.Width(), rc.Height());
}
else
{
ptLast=point;
CStatic::OnMouseMove(nFlags, point);
}
Invalidate();
//
// CStatic::OnMouseMove(nFlags, point);
}

即利用 MouseMove 来 不断 产生 消息,然后是 检测 MK_LBUTTON==nFlags


如果 不用 MouseMove 你得 用别的方法 保持 不断 有消息。如 timer


好 谢谢 我尝试一下[/quote]

兄弟 按照你这个方法 出现如图错误:

还有就是关闭按钮的时候也会出现
schlafenhamster 2018-07-05
  • 打赏
  • 举报
回复
再 给 一个 不用MouseMove的
void CMoveStaticDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
static int i=0;
while(nFlags==MK_LBUTTON)// 1
{
UINT newState=GetAsyncKeyState(VK_LBUTTON);// 0x8001(0)
if(newState & 0x8000)
{
afxDump << i << "\n";// 调用 你的 函数
i++;
nFlags=MK_LBUTTON;
}
else
{
nFlags=0;
}
}
CDialog::OnLButtonDown(nFlags, point);
}
不过这是 一个 阻塞 界面 的 函数 !
归途醉染 2018-07-05
  • 打赏
  • 举报
回复
引用 21 楼 schlafenhamster 的回复:
通常 是
void CMyStatic1::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static CPoint ptLast;
if(MK_LBUTTON==nFlags)
{
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
MapWindowPoints(GetParent(),&rc);
MoveWindow(rc.left+(point.x-ptLast.x), rc.top+(point.y-ptLast.y), rc.Width(), rc.Height());
}
else
{
ptLast=point;
CStatic::OnMouseMove(nFlags, point);
}
Invalidate();
//
// CStatic::OnMouseMove(nFlags, point);
}

即利用 MouseMove 来 不断 产生 消息,然后是 检测 MK_LBUTTON==nFlags


如果 不用 MouseMove 你得 用别的方法 保持 不断 有消息。如 timer


好 谢谢 我尝试一下
schlafenhamster 2018-07-04
  • 打赏
  • 举报
回复
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
是在派生类中 处理
归途醉染 2018-07-04
  • 打赏
  • 举报
回复
引用 4 楼 qq_36088602 的回复:
[quote=引用 3 楼 schlafenhamster 的回复:]
例子

// CMyButton message handlers
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rcParent;
CWnd *pParent=GetParent();
pParent->GetClientRect(&rcParent);
//afxDump << rcParent << "\n";
if(m_Tracking)
{
if(MK_LBUTTON==nFlags)
{
if(Track(this,point))
{
MapWindowPoints(pParent,&m_rect);
//afxDump << m_rect << "\n";
if( (m_rect.left >= 0) &&
(m_rect.top >= 0) &&
(m_rect.right <= rcParent.right) &&
(m_rect.bottom <= rcParent.bottom))
{// limit moving in the parent
MoveWindow(&m_rect);// the button
}
CRect rc;
GetWindowRect(&rc);
rc.OffsetRect(-rc.left,-rc.top);
m_rect=rc;// re-init
//afxDump << rc << "\n";
}
}
}
else
{
CButton::OnLButtonDown(nFlags, point);
}
}


if(MK_LBUTTON==nFlags) 一直按着不松开

66666 谢谢 我试试这个例子[/quote]
不好意思 这两天在忙
我刚刚试了一下
MK_LBUTTON
是一次点击事件吧?
还有那个CButton::OnLButtonDown(nFlags, point);
根本跑不起来呀
归途醉染 2018-07-04
  • 打赏
  • 举报
回复
引用 15 楼 sichuanpb 的回复:
整个线程
归途醉染 2018-07-04
  • 打赏
  • 举报
回复
引用 14 楼 cwj976277916 的回复:
[quote=引用 13 楼 qq_36088602 的回复:]
[quote=引用 12 楼 cwj976277916 的回复:]
然后你如果是在对话框上,就可以直接对应获取点击的Button的ID,如果是在其他的控件上面,比如工具栏上,就要另外处理。

您好,您这个只能获取鼠标的点击事件 并不能获取鼠标一直按在button控件上就一直执行,松开才停止[/quote]
可以,因为我已经实现了。[/quote]

666 老板 把你demo发一下呗
sichuanwww 2018-07-04
  • 打赏
  • 举报
回复
整个线程
schlafenhamster 2018-07-04
  • 打赏
  • 举报
回复

void CxxxxDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(MK_LBUTTON==nFlags)
{
afxDump << "OnMouseMove()\n";
}
else
{
}
CDialog::OnMouseMove(nFlags, point);
}
schlafenhamster 2018-07-04
  • 打赏
  • 举报
回复
通常 是
void CMyStatic1::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static CPoint ptLast;
if(MK_LBUTTON==nFlags)
{
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
MapWindowPoints(GetParent(),&rc);
MoveWindow(rc.left+(point.x-ptLast.x), rc.top+(point.y-ptLast.y), rc.Width(), rc.Height());
}
else
{
ptLast=point;
CStatic::OnMouseMove(nFlags, point);
}
Invalidate();
//
// CStatic::OnMouseMove(nFlags, point);
}

即利用 MouseMove 来 不断 产生 消息,然后是 检测 MK_LBUTTON==nFlags

如果 不用 MouseMove 你得 用别的方法 保持 不断 有消息。如 timer
归途醉染 2018-07-04
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
是在派生类中 处理

派生Cbutton类
是不是这样就能一直处理按下状态了一直运行
抬起就结束
那就要两个处理函数
OnLButtonDown
OnLButtonUP?
思考者Jack 2018-07-03
  • 打赏
  • 举报
回复
引用 13 楼 qq_36088602 的回复:
[quote=引用 12 楼 cwj976277916 的回复:]
然后你如果是在对话框上,就可以直接对应获取点击的Button的ID,如果是在其他的控件上面,比如工具栏上,就要另外处理。

您好,您这个只能获取鼠标的点击事件 并不能获取鼠标一直按在button控件上就一直执行,松开才停止[/quote]
可以,因为我已经实现了。
归途醉染 2018-07-03
  • 打赏
  • 举报
回复
引用 12 楼 cwj976277916 的回复:
然后你如果是在对话框上,就可以直接对应获取点击的Button的ID,如果是在其他的控件上面,比如工具栏上,就要另外处理。

您好,您这个只能获取鼠标的点击事件 并不能获取鼠标一直按在button控件上就一直执行,松开才停止
加载更多回复(11)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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