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();
}
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。