做点贡献,提供一个方法,利用消息实现3态位图按纽
呵呵,非转载:
目前网上的办法一般是重载,学vc半年了,从csdn做了大量不劳而获的亏心事,做点贡献这次。我这里提供一个用消息做的,写详细点,给初学者共享:
(基于对话框的)
假设有2个按纽,一个叫“退出”,一个叫“浏览”。
1:选择它们的owerdraw属性
2:定义2个 CBitmapButton 变量。
CBitmapButton m_exit;
CBitmapButton m_browse;
可以定义在头文件中。
3:在初始化中加入:
m_exit.AutoLoad(IDC_BUTTON_EXIT, this);
m_exit.LoadBitmaps(IDB_BITMAP_EXIT_NORMAL,IDB_BITMAP_EXIT_DOWN,IDB_BITMAP_EXIT_OVER,IDB_BITMAP_EXIT_GREY);
//第一个参数是正常状态位图,第二个是按下状态的,第三个是位于上方时的,第四个是不可用时的
m_browse.AutoLoad(IDC_BUTTON_BROWSE, this);
m_browse.LoadBitmaps(IDB_BITMAP_BROWSE_NORMAL,IDB_BITMAP_BROWSE_DOWN,IDB_BITMAP_BROWSE_OVER,IDB_BITMAP_BROWSE_GREY);
4:在cpp上面定义2个全局变量:
bool BROWSEreDraw = 0;
bool EXITreDraw = 0;
5:BOOL C ....Dlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_MOUSEMOVE)
{
if(pMsg->hwnd == GetDlgItem(IDC_BUTTON_EXIT)->m_hWnd)
{
if(!EXITreDraw)
{
GetDlgItem(IDC_BUTTON_EXIT)->SetFocus();
EXITreDraw = !EXITreDraw;
}
}
else if(pMsg->hwnd == GetDlgItem(IDC_BUTTON_BROWSE)->m_hWnd)
{
if(!BROWSEreDraw)
{
GetDlgItem(IDC_BUTTON_BROWSE)->SetFocus();
BROWSEreDraw = !BROWSEreDraw;
}
}
else
{
if(BROWSEreDraw )
{
BROWSEreDraw = !BROWSEreDraw ;
}
if(EXITreDraw)
{
EXITreDraw = !EXITreDraw;
}
GetDlgItem(IDC_OTHER)->SetFocus(); //将任意一个其他的控件获得焦点
}
}
.......................
}
结束了(应该没有漏掉什么吧),不用担心,没有闪烁。