截獲BM_SETSTYLE:自繪按鈕控制項屬性自繪屬性的保持

來源:互聯網
上載者:User

由於標準的按鈕控制項在樣式上比較單調,因此,在很多時候,我們都需要對標準按鈕控制項實行自畫,以滿足特定的需求。為了能讓按鈕控制項支援自畫,需要設定按鈕的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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.