如何让鼠标到按钮上面之后,按钮显示并生效

liangchaoxi 2012-08-31 11:53:00

我建立了一个,在上面加了一个按钮,但是我不想让这个按钮平常显示,我的意图是,当鼠标移到上面的时候,按钮显示,并且这时候可以点击按钮,触发事件。当鼠标移开后,按钮又自动消失,请问,如何实现这个功能呢?


...全文
454 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-03-16
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
liangchaoxi 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

1.首先得到按钮的CRect

2.在对话框的OnMouseMove()函数里面

引用 8 楼 的回复:
if(rc.PtInRect(pt))
pWnd->ShowWindow(SW_SHOW);
// else
// pWnd->ShowWindow(SW_HIDE);


3.将该按钮继承一个Class CbuttonChild:CButton父类

4……
[/Quote]窗口类 和按钮类 都有 OnMouseMove 消息函数,他们的区别是不是,鼠标在窗口上时窗口类的OnMouseMove响应按钮的OnMouseMove不响应,鼠标在 按钮上时 按钮的OnMouseMove响应 窗口的OnMouseMove不响应?

void CCraneTower2Dlg::OnMouseMove(UINT nFlags, CPoint point)

void CBtest::OnMouseMove(UINT nFlags, CPoint point)
「已注销」 2012-09-03
  • 打赏
  • 举报
回复
1.首先得到按钮的CRect

2.在对话框的OnMouseMove()函数里面

[Quote=引用 8 楼 的回复:]
if(rc.PtInRect(pt))
pWnd->ShowWindow(SW_SHOW);
// else
// pWnd->ShowWindow(SW_HIDE);
[/Quote]

3.将该按钮继承一个Class CbuttonChild:CButton父类

4.在CbuttonChild中添加函数OnMouseLeave消息响应函数 鼠标离开按钮后隐藏
{
ShowWindow(SW_HIDE);
}

OnMouseLeave用法具体CSDN一下

:)
liangchaoxi 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

方法贼多啊

最近单的就是重载CButton的OnMouseMove了
[/Quote]
能否说明一下具体如何实现,新手,望谅解
sumos 2012-09-02
  • 打赏
  • 举报
回复
我提供一种思路:
class Back : public CStatic
{
CButton *bt;保存按钮指针 改成 句柄也行
在WM_PAINT中copy 父窗口的dc,看起来Back就是透明的。
添加 MouseMove消息,当MouseHover时bt->ShowWindow(SW_SHOW);如果不显示,就RedrawWindow。
当MouseLeave时,bt->ShowWindow(SW_HIDE);
};
傻X 2012-08-31
  • 打赏
  • 举报
回复
方法贼多啊

最近单的就是重载CButton的OnMouseMove了
铭毅天下 2012-08-31
  • 打赏
  • 举报
回复
可以考虑8楼的方案,也可以下载别人封装好的类如CButtonT等。
youcry 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

在MOUSEMOVE中
if(rc.PtInRect(pt))
pWnd->ShowWindow(SW_SHOW);
else
pWnd->ShowWindow(SW_HIDE);
[/Quote]
这个可以啊,rc就是你按钮的矩形区域!
我以前也做过,是这样的!
liangchaoxi 2012-08-31
  • 打赏
  • 举报
回复
现在有个问题

我发现一个现象:凡是能响应鼠标事件的控件,比如按钮,单选框,文本框用EnableWindow(false)后,则可以响应鼠标移到该控件上的消息,可一旦它们变得可用,则无法响应该消息了.该怎么解决?

也就是说,当鼠标移动按钮上之后,实际上好像是不进入这个函数了,在控件外的时候是进入的:


void CCTDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CDialog::OnMouseMove(nFlags, point);
}
zyrr159487 2012-08-31
  • 打赏
  • 举报
回复
在MOUSEMOVE中
if(rc.PtInRect(pt))
pWnd->ShowWindow(SW_SHOW);
else
pWnd->ShowWindow(SW_HIDE);
liangchaoxi 2012-08-31
  • 打赏
  • 举报
回复
我现在想,让鼠标在按钮上的时候才触发 OnMouseMove

我添加了一个基类为CButton 的类 onbutton ,然后在类视图内单机onbutton类,然后给这个类添加了 消息函数
:OnMouseMove 如下,为什么我运行的时候,即使把鼠标挪动按钮上,也就不了这个函数,而是进了void CCTDlg::OnMouseMove(UINT nFlags, CPoint point),是不是因为我把按钮建在窗体CCTDlg的原因?


void Onbuttin::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CString ShowString = _T("光标在按钮上!!!");
CButton::OnMouseMove(nFlags, point);
}


进了下面这个函数:

void CCTDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CDialog::OnMouseMove(nFlags, point);
}
疯狂-的-蜗牛 2012-08-31
  • 打赏
  • 举报
回复

添加一个定时器:SetTimer(1,100,NULL);
在OnTimer中:
CWnd* pWnd=GetDlgItem(IDC_BUTTON1);
CRect rc;
pWnd->GetWindowRect(&rc);
CPoint pt;
::GetCursorPos(&pt);
if(rc.PtInRect(pt))
pWnd->ShowWindow(SW_SHOW);
else
pWnd->ShowWindow(SW_HIDE);
CDialog::OnTimer(nIDEvent);
知好歹 2012-08-31
  • 打赏
  • 举报
回复
获取按钮坐标:
CWnd *pWnd=(CWnd*)GetDlgItem (IDC_BUTTON1);
CDC *pDC=pWnd->GetDC();
CRect rect;
pWnd->GetClientRect (rect);
int W=rect.Width();
int H=rect.Height();
liangchaoxi 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

在OnMouseMove事件中判断在按钮区间内显示
GetDlgItem(IDC_BUTTON1)->ShowWindow(SW_SHOW);
否则隐藏
GetDlgItem(IDC_BUTTON1)->ShowWindow(SW_HIDE);
[/Quote]怎么判断按钮区间?
liangchaoxi 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

方法贼多啊

最近单的就是重载CButton的OnMouseMove了
[/Quote]具体怎么实现呢? OnMouseMove只要鼠标移动就会触发的呀,我想要的效果是,鼠标移到按钮上才触发的
qlizhang 2012-08-31
  • 打赏
  • 举报
回复
在OnMouseMove事件中判断在按钮区间内显示
GetDlgItem(IDC_BUTTON1)->ShowWindow(SW_SHOW);
否则隐藏
GetDlgItem(IDC_BUTTON1)->ShowWindow(SW_HIDE);

15,979

社区成员

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

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