轉載:http://blog.csdn.net/wuan584974722/article/details/25045737
我們在做MFC程序時候經常會一個切換式的按鈕,之前我的做法是利用buttion類的一個SetState()函數,但是返現效果不佳。而且容易出現點1按鈕,焦點跑到另外一個按鈕上去了 。后來看到別人一個程序。我發現他的切換效果做的很好 ,經過看代碼發現,他用的控件根本不是buttion控件而是check box 控件。我就很奇怪,如何將check box變成了一個按鈕的,經查看代碼發現,原來是他將控件的屬性------push lisk (我的翻譯是按下去像 純字面理解)設置成true 如圖
他就會變成一個按鈕形狀了,這時候 你給他添加控件變量和控件變量的值,在程序里面函數DoDataExchange(CDataExchange* pDX)中會生成DDX_Control(pDX, IDC_BUTTON1, m_btn_AT);
DDX_Check(pDX, IDC_BUTTON1, m_Check_AT);在頭文件中會定義兩個連個變量CButtion m_btn_AT;和BOOL m_Check_AT, 可以修改CButtion 為你重新寫的類。然后我們添加按鈕的消息響應函數:在消息響應函數中要添加函數UpdataData(true);這個函數會調用DoDataExchange(CDataExchange* pDX);
void C按鈕凹凸效果Dlg::OnBnClickedCheck1()
{
UpdateData(TRUE);
if(m_Checked)
{
m_btn_check.SetWindowText(L"1狀態 (開)");
m_btn_check.SetBitmaps(IDB_BITMAP1,RGB(255,255,255));
}
else
{
m_btn_check.SetWindowText(L"0狀態 (關)");
m_btn_check.SetBitmaps(IDB_BITMAP1,RGB(255,255,255));
}
}
參考上面例子,其實在Duilib中也是用CheckBox控件來實現開關按鈕,代碼都不需要實現,直接在xml中設置就行了
<CheckBox name="chkOption" width="143" height="90" float="10,0,0,0" normalimage="file='switchbutton.png' source='0,0,143,91'" selectedimage="file='switchbutton.png' source='0,182,143,273'"/>
代碼實現:
CCheckBoxUI *pCheck = new CCheckBoxUI; pCheck->SetMaxHeight(40); pCheck->SetMaxWidth(60); pCheck->SetAttribute(_T("normalimage"), _T("file='image\\switchbutton.png' source='0,0,143,91'")); pCheck->SetAttribute(_T("selectedimage"), _T("file='image\\switchbutton.png' source='0,182,143,273'"));
最后上效果:
這個背景圖