首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC 自定義按鈕類 CMyButton 實現點擊變色:重繪 OnDraw 並處理 BN_CLICKED 消息

     編輯:程式設計疑難解答

實現步驟

  1. 創建類:繼承 CButton,命名 CMyButton。
  2. 設置 OwnerDraw 風格:資源編輯器中按鈕屬性勾選「Owner Draw」,或代碼:
    m_btn.ModifyStyle(0, BS_OWNERDRAW);
    
  3. 重寫 DrawItem:
    
    void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
        CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
        CRect rect = lpDrawItemStruct->rcItem;
        UINT state = lpDrawItemStruct->itemState;
    
        // 根據狀態選擇顏色
        COLORREF bgColor;
        if (state & ODS_SELECTED) bgColor = RGB(0, 120, 215); // 按下:藍
        else if (state & ODS_DISABLED) bgColor = RGB(200,200,200); // 禁用:灰
        else bgColor = RGB(0, 100, 180); // 正常:深藍
    
        CBrush brush(bgColor);
        pDC->FillRect(&rect, &brush);
    
        // 繪製文字
        CString text;
        GetWindowText(text);
        pDC->SetBkMode(TRANSPARENT);
        pDC->SetTextColor(RGB(255,255,255));
        pDC->DrawText(text, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    
        // 焦點框
        if (state & ODS_FOCUS) pDC->DrawFocusRect(&rect);
    }
    
  4. 消息映射(可選,處理點擊邏輯):
    
    BEGIN_MESSAGE_MAP(CMyButton, CButton)
        ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
    END_MESSAGE_MAP()
    
    void CMyButton::OnClicked() {
        // 自定義點擊邏輯
        Invalidate(); // 觸發重繪
    }
    

關鍵點

  • BS_OWNERDRAW 讓框架調用 DrawItem 而非默認繪制。
  • lpDrawItemStruct->itemState 包含 ODS_SELECTED/ODS_FOCUS/ODS_DISABLED 等狀態標志。
  • 必須手動繪製背景、文本、焦點框,框架不再自動處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved