MFC CBitmapButton类的应用

本文介绍如何使用CBitmapButton类实现按钮的四种不同状态样式,包括正常、按下、获得焦点和失效状态,并通过定时器确保按钮在鼠标悬停时正确显示获得焦点的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到了给按钮设置样式的问题。我们都知道在我们用过的程序中,按钮是个很神奇的东西。有的按钮表面是这种样式,鼠标指上去就换一种样式,点下去是一种样式,点过后又是一种样式。

其实,用CBitmapButton类完全可以实现。

现在我们要实现一个效果,就是按钮显示,按钮按下时(鼠标别松),鼠标指向按钮,点击后失效。四种样式。IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5,IDB_BITMAP6

1.在对话框上放一个按钮ID为IDC_BUTTON1,选择它的owner draw属性为true。注意:不要给按钮设置控制变量,想控制它属性直接指针调用吧。

2.在对话框头文件中定义

CBitmapButton  bt;
3.找到对话框的BOOL CzidlgDlg::OnInitDialog()函数添加如下代码

bt.LoadBitmaps(IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5,IDB_BITMAP6);//给bt载入按钮位图样式;位图事先准备好bmp格式,添加到位图资源。
	bt.SubclassDlgItem(IDC_BUTTON1,this);//将bt与你要设置的按钮关联。
	bt.SizeToContent();

在button的点击事件中写入

GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
4.参数介绍
bt.LoadBitmaps(IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5,IDB_BITMAP6);
3图代表按钮正常样子,4图代表按钮按下样子,5图代表按钮有焦点时显示的样子,6图代表按钮失效后的样子。

5.编译运行会发现,第三种样式没有实现,原因就在于鼠标指向按钮时候,按钮并没有获得焦点。

我们靠定时器实现。

添加TIMER,在OnInitDialog()函数设置定时器时间长度SetTimer(1,10,NULL); 这里设置10ms ,时间短效果好。

接下来找到ontimer函数写入

if (1==nIDEvent)  
     {  
      POINT p;  
      GetCursorPos(&p);     
      CWnd *hwnd;  
      hwnd=WindowFromPoint(p);        //检索窗口中包含指定的点;点必须指定屏幕坐标在屏幕上的一个点。     
      CWnd *hwnd2=GetDlgItem(IDC_BUTTON1);  
      if (hwnd2 == hwnd)         //如果鼠标在按钮上  
      {  
       if (GetFocus()!=hwnd2)        //如果按钮无焦点,设置焦点  
        hwnd2->SetFocus() ;  
      }  
      else          //如果鼠标不在按钮上;  
      {  
       if (GetFocus() == hwnd2 )                  //如果按钮有焦点
        GetDlgItem(IDOK)->SetFocus();      //这里的IDOK为你想跳转到的控件ID号  
      }     
     }
6.编译运行,效果实现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值