最近遇到了给按钮设置样式的问题。我们都知道在我们用过的程序中,按钮是个很神奇的东西。有的按钮表面是这种样式,鼠标指上去就换一种样式,点下去是一种样式,点过后又是一种样式。
其实,用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.编译运行,效果实现。