由於標準的按鈕控制項在樣式上比較單調,因此,在很多時候,我們都需要對標準按鈕控制項實行自畫,以滿足特定的需求。為了能讓按鈕控制項支援自畫,需要設定按鈕的BS_OWNERDRAW風格,一般情況下,我們可以在PreSubclassWindow中進行設定:
class CxxxButton : public CButton { ... }; void CxxxButton::PreSubclassWindow() { ModifyStyle( 0, BS_OWNERDRAW); CButton::PreSubclassWindow (); }
這樣,我們就可以重載DrawItem,從而按照自己的意願對按鈕進行自畫。
但是,在實際環境中,我們經常發現這樣的bug:我們明明已經對某個按鈕控制項進行了子類化了,並且開始的時候,該按鈕也確實是自畫的,可以滿足當前的需
求。但是在進行了一些其它的操作之後,發現該按鈕有變為了標準的按鈕了,自畫屬性已經不翼而飛了!這可不是我們所希望的。
那麼,該如何讓按鈕在不管進行了什麼操作之後,還能保持自畫的風格呢?從MSDN中找到瞭解決的方法:截獲BM_SETSTYLE的訊息。從MSDN中,
可以瞭解到,應用程式在改變按鈕的風格的時候,會給按鈕發送BM_SETSTYLE的訊息。我們在按鈕處理該訊息之前截獲它,然後修改訊息參數為符合自己
需求的風格,這樣就不怕應用程式在暗地裡搗鬼了。部分代碼如下:
1、訊息聲明:
afx_msg LRESULT OnSetStyle ( WPARAM wParam, LPARAM lParam );
2、訊息映射:
ON_MESSAGE ( BM_SETSTYLE, OnSetStyle )
3、實現修改風格:
LRESULT CxxxButton::OnSetStyle ( WPARAM wParam, LPARAM lParam ){ return DefWindowProc ( BM_SETSTYLE, ( wParam & ~BS_TYPEMASK ) | BS_OWNERDRAW, lParam );}
如果編譯的時候提示沒有定義BS_TYPEMASK,那麼可以手動添加該宏:
#ifndef BS_TYPEMASK#define BS_TYPEMASK SS_TYPEMASK#endif
原文:http://www.wangchao.net.cn/bbsdetail_55476.html