制作風格獨特的按鈕—用VC6擴展CButton類

字號:

一、 本文介紹一個CButton的派生類CLinkButton,用此派生類制作的按鈕具有以下特點:
    1、按鈕的外觀類似靜態(tài)控件類CStatic 產(chǎn)生的對象。
    2、當鼠標的光標移到按鈕上,但并未按下時,光標改變形狀,字體改變形狀;按鈕類似應(yīng)用在工具條和菜單上的扁平鈕效果
    二、下面具體描述這種按鈕的實現(xiàn)方法和步驟:
    1. 在VC6的IDE環(huán)境中,生成一個基于對話框的PROJECT。
    2. 將對話框資源中按鈕的屬性頁打開,在“Style”標簽頁中選取按鈕的“Owner Draw”(自繪)屬性。
    3. 將光標引入到應(yīng)用程序的資源中。
    4. 利用CLASSWIZARD,用CButton為基類,派生一個新類:CLinkButton。
    5. 在派生類中重載基類CButton的虛函數(shù):
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    之所以要重載這個函數(shù)是因為選擇了按鈕的 “Owner Draw”屬性后,當按鈕的可視行為發(fā)生變化時,應(yīng)用程序的框架要調(diào)用這個函數(shù)來重新繪制按鈕。
    6. 定制以下的消息處理:
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    7. 聲明類成員變量定義:
    //定義字體變量
    CFont fUnderline;
    //定義光標變量
    HCURSOR hHand;
    //決定按鈕是否按下
    bool bLBtnDown;
    //決定鼠標是否在按鈕上
    bool bHighlight;