mfc關於CButtonST按鈕設置不可用時 EnableWindow(FALSE) 按鍵圖標的問題

不可否認,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);

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章