不可否認,CButtonST是一個十分強大的類,在應用時,十分方便,但是我最近遇到了一個很大的問題,就是設置按鈕不可用時,按鈕就變爲一個灰框,怎麼辦呢,有人的解決辦法是:
參考網址:http://dev.csdn.net/htmls/66/66766.html
1、在資源編輯的時候選中按鈕的Owner draw即可,不需要選擇Bitmap屬性!
2、在程序中定義一個CBitmapButton成員變量。不能使用ClassWizard爲按鈕映射一個CButton變量,然後改爲CBitmapButton,這麼做並不能將按鈕直接映射爲CBitmapButton類的對象,反而會出現初始化錯誤。
3-1、使用CBitmapButton::LoadBitmaps裝載各種狀態的圖片,使用SubclassDlgItem關聯到想要的按鈕,使用CBitmapButton::SizeToContent函數使按鈕適合圖片大小。。注意Loadbitmaps一定要在關聯到按鈕之前進行!
按照上面的注意事項做如下操作即可
CBitmapButton m_syncbtn;
m_syncbtn.LoadBitmaps(IDB_DOWNLOAD_ALL_GRAY, 0, 0, 0);
m_syncbtn.SubclassDlgItem(IDC_BUTTON_DOWNALL, this);
m_syncbtn.SizeToContent();
m_syncbtn.EnableWindow(FALSE);
m_syncbtn.LoadBitmaps(IDB_DOWNLOAD_ALL_COLOR, 0, 0, 0);
m_syncbtn.EnableWindow(TRUE);
這樣的確很容易做到,但是這就違背了我們最初想使用CButtonST的初衷,參考http://bbs.csdn.net/topics/320232857,我做了如下嘗試,對BtnST.cpp中的代碼DrawTheBitmap函數,做簡單的修改,如下:
void CButtonST::DrawTheBitmap(CDC* pDC, BOOL bHasTitle, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL
bIsDisabled)
{
HDC hdcBmpMem = NULL;
HBITMAP hbmOldBmp = NULL;
HDC hdcMem = NULL;
HBITMAP hbmT = NULL;
BYTE byIndex = 0;
// Select the bitmap to use
if ((m_bIsCheckBox && bIsPressed) || (!m_bIsCheckBox && (bIsPressed || m_bMouseOnButton)))
byIndex = 0;
else
byIndex = (m_csBitmaps[1].hBitmap == NULL ? 0 : 1);
CRect rImage;
PrepareImageRect(bHasTitle, rpItem, rpCaption, bIsPressed, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, &rImage);
hdcBmpMem = ::CreateCompatibleDC(pDC->m_hDC);
hbmOldBmp = (HBITMAP)::SelectObject(hdcBmpMem, m_csBitmaps[byIndex].hBitmap);
hdcMem = ::CreateCompatibleDC(NULL);
hbmT = (HBITMAP)::SelectObject(hdcMem, m_csBitmaps[byIndex].hMask);
//if (bIsDisabled && m_bShowDisabledBitmap)
//{
// HDC hDC = NULL;
// HBITMAP hBitmap = NULL;
// hDC = ::CreateCompatibleDC(pDC->m_hDC);
// hBitmap = ::CreateCompatibleBitmap(pDC->m_hDC, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight);
// HBITMAP hOldBmp2 = (HBITMAP)::SelectObject(hDC, hBitmap);
// RECT rRect;
// rRect.left = 0;
// rRect.top = 0;
// rRect.right = rImage.right + 1;
// rRect.bottom = rImage.bottom + 1;
// ::FillRect(hDC, &rRect, (HBRUSH)RGB(255, 255, 255));
// COLORREF crOldColor = ::SetBkColor(hDC, RGB(255,255,255));
// ::BitBlt(hDC, 0, 0, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight,
hdcMem, 0, 0, SRCAND);
// ::BitBlt(hDC, 0, 0, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, hdcBmpMem, 0, 0, SRCPAINT);
// ::SetBkColor(hDC, crOldColor);
// ::SelectObject(hDC, hOldBmp2);
// ::DeleteDC(hDC);
// pDC->DrawState( CPoint(rImage.left/*+1*/, rImage.top),
// CSize(m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight),
// hBitmap, DST_BITMAP | DSS_DISABLED);
// ::DeleteObject(hBitmap);
//} // if
//else
//{
::BitBlt(pDC->m_hDC, rImage.left, rImage.top, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, hdcMem, 0, 0, SRCAND);
::BitBlt(pDC->m_hDC, rImage.left, rImage.top, m_csBitmaps[byIndex].dwWidth, m_csBitmaps[byIndex].dwHeight, hdcBmpMem,
0, 0, SRCPAINT);
//} // else
::SelectObject(hdcMem, hbmT);
::DeleteDC(hdcMem);
::SelectObject(hdcBmpMem, hbmOldBmp);
::DeleteDC(hdcBmpMem);
} // End of DrawTheBitmap
我對紅色加粗部分的代碼,進行了註釋,這樣在按鈕不可用時,它就不會更改現有的圖標,如果你希望在不可用時,換一種圖標,你只要在置爲不可用之前,先設置一下即可
CButtonST m_btnObjStatistics;
m_btnObjStatistics.SetBitmaps(IDB_BMP_OBJSTATISTICS1,RGB(255,255,255)); //設置按鈕不可用時的圖片
m_btnObjStatistics.EnableWindow(FALSE);
當然,這樣你在置爲可用時,也要重新設置可用時圖標
m_btnObjStatistics.SetBitmaps(IDB_BMP_OBJSTATISTICS,RGB(255,255,255)); //設置按鈕不可用時的圖片
m_btnObjStatistics.EnableWindow(TRUE);