首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

CFormView 動態建立 CBitmapButton:位圖按鈕建立、載入與訊息映射完整流程

     編輯:關於C語言

應用場景

CFormView 基於對話框模板,但有時需動態建立位圖按鈕 (如工具列式按鈕、狀態指示),而非在資源編輯器靜態放置。

類別成員宣告


class CMyFormView : public CFormView {
    CBitmapButton m_btnOpen;
    CBitmapButton m_btnSave;
    // ...
};

OnInitialUpdate / OnCreate 建立按鈕


void CMyFormView::OnInitialUpdate() {
    CFormView::OnInitialUpdate();

    CRect rectOpen(10, 10, 46, 46); // 左上角 (10,10) 寬高 36x36
    CRect rectSave(60, 10, 96, 46);

    // 建立按鈕,BS_OWNERDRAW 必須,父視窗為 this (CFormView)
    m_btnOpen.Create(NULL, WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, rectOpen, this, ID_BTN_OPEN);
    m_btnSave.Create(NULL, WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, rectSave, this, ID_BTN_SAVE);

    // 載入位圖:正常、按下、焦點、停用 (四態)
    // 資源 ID: IDB_OPEN_UP, IDB_OPEN_DOWN, IDB_OPEN_FOCUS, IDB_OPEN_DISABLED
    m_btnOpen.LoadBitmaps(IDB_OPEN_UP, IDB_OPEN_DOWN, IDB_OPEN_FOCUS, IDB_OPEN_DISABLED);
    m_btnSave.LoadBitmaps(IDB_SAVE_UP, IDB_SAVE_DOWN, IDB_SAVE_FOCUS, IDB_SAVE_DISABLED);

    // 設定按鈕大小自動調整 (可選)
    m_btnOpen.SizeToContent();
    m_btnSave.SizeToContent();
}

位圖資源要求

  • 四張位圖尺寸**完全相同**。
  • 建議 24-bit 或 32-bit (含 Alpha 通道) 位圖,透明色由 CBitmapButton 自動處理 (以左上角像素色為透明色)。
  • 資源編輯器中位圖屬性:**不勾選**「將位圖載入為影像」(即非 IMAGE_BITMAP 類型),保持標準位圖資源。

訊息映射處理點擊


BEGIN_MESSAGE_MAP(CMyFormView, CFormView)
    ON_BN_CLICKED(ID_BTN_OPEN, OnBtnOpen)
    ON_BN_CLICKED(ID_BTN_SAVE, OnBtnSave)
END_MESSAGE_MAP()

void CMyFormView::OnBtnOpen() {
    // 開啟檔案邏輯
}

void CMyFormView::OnBtnSave() {
    // 儲存檔案邏輯
}

常見問題排查

現象原因解決
按鈕不顯示/顯示空白位圖資源 ID 錯誤、未載入、尺寸不一檢查 LoadBitmaps 參數、資源 ID、位圖尺寸一致
按鈕點擊無反應未加入 ON_BN_CLICKED、ID 衝突、父視窗錯誤確認訊息映射、ID 唯一、Create 父視窗參數
透明色不正確位圖左上角非透明色、含 Alpha 通道衝突確保左上角像素為欲透明色、或使用 32-bit Alpha 位圖
按鈕文字重疊CBitmapButton 不支援文字,僅顯示位圖文字需繪製在位圖上,或改用 CButton + SetBitmap

進階:自訂繪製 (CBitmapButton 衍生類)


class CMyBitmapButton : public CBitmapButton {
protected:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS) {
        // 完全自訂繪製:漸層背景、圖示+文字、狀態動畫...
        // 參考 CBitmapButton 源碼實作邏輯
    }
};

記憶體管理

  • 按鈕為成員變數,隨 CFormView 銷毀自動釋放位圖資源 (CBitmapButton 解構函式呼叫 DestroyWindow 並釋放 CBitmap 陣列)。
  • 若動態 new 按鈕,需在 OnDestroy 中 delete。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved