整理 5 個 VC++ 控件進階用法,無需複雜繼承即可實現常見進階效果。
CListCtrl m_List;
// 設定擴充風格
DWORD dwStyle = m_List.GetExtendedStyle();
dwStyle |= LVS_EX_CHECKBOXES;
m_List.SetExtendedStyle(dwStyle);
自動在第一欄顯示 CheckBox,GetCheck/SetCheck 操作項目狀態。
CCheckListBox 取代 CListBox。GetCheck/SetCheck(index) 操作。衍生 CStatic 類別 CColorStatic,處理 WM_CTLCOLOR (Reflect) 訊息:
// ColorStatic.h
class CColorStatic : public CStatic
{
DECLARE_DYNAMIC(CColorStatic)
public:
CColorStatic();
void SetBackColor(COLORREF clr) { m_clrBack = clr; Invalidate(); }
void SetTextColor(COLORREF clr) { m_clrText = clr; Invalidate(); }
protected:
DECLARE_MESSAGE_MAP()
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
CBrush m_brushBack;
COLORREF m_clrBack, m_clrText;
};
// ColorStatic.cpp
IMPLEMENT_DYNAMIC(CColorStatic, CStatic)
BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
CColorStatic::CColorStatic()
: m_clrBack(::GetSysColor(COLOR_BTNFACE)), m_clrText(::GetSysColor(COLOR_BTNTEXT)) {}
HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT)
{
m_brushBack.DeleteObject();
m_brushBack.CreateSolidBrush(m_clrBack);
pDC->SetBkColor(m_clrBack);
pDC->SetTextColor(m_clrText);
return m_brushBack;
}
使用:對話框編輯器將 Static 控件類別改為 CColorStatic,程式碼呼叫 SetBackColor(RGB(255,0,0)) 等。
IDC_STATIC (如 IDC_STATIC_PIC),才能加入 Control 變數 m_StaticPic。m_StaticPic.ModifyStyle(0, SS_BITMAP | SS_CENTERIMAGE);CRect rect;
m_StaticPic.GetWindowRect(&rect);
ScreenToClient(&rect);
// 依控件大小載入 (或用 0,0 載入原始大小)
HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, _T("D:\\test.bmp"), IMAGE_BITMAP,
rect.Width(), rect.Height(), LR_LOADFROMFILE);
m_StaticPic.SetBitmap(hBmp);
// 注意:SetBitmap 後 hBmp 所有權轉給控件,不可 DeleteObject
// 若需更換圖片,先 GetBitmap 取回再 DeleteObject
| 技巧 | 關鍵點 | 適用場景 |
|---|---|---|
| List CheckBox | LVS_EX_CHECKBOXES | 多選清單、屬性頁 |
| ListBox CheckBox | CCheckListBox + Owner Draw Fixed | 簡易多選介面 |
| Spin+Edit 綁定 | Tab Order 相鄰 + Auto Buddy/Set Buddy Integer | 數值輸入微調 |
| 彩色 Static | 衍生類別 + ON_WM_CTLCOLOR_REFLECT | 狀態指示、強調顯示 |
| Static 顯示圖片 | SS_BITMAP + SS_CENTERIMAGE + SetBitmap | Logo、預覽圖、圖示 |
這 5 個技巧皆為「零/極少程式碼」實現進階效果,屬於 VC++ 開發者必備的工具箱內容。遇到對應需求時直接套用,避免重複造輪子。