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

VC++ 控件進階小技巧五則:List/ListBox CheckBox、Spin+Edit 綁定、彩色 Static、Static 顯示圖片

     編輯:VC 教學

前言:小技巧解決大問題

整理 5 個 VC++ 控件進階用法,無需複雜繼承即可實現常見進階效果。

1. List Control 加入核取方塊

CListCtrl m_List;
// 設定擴充風格
DWORD dwStyle = m_List.GetExtendedStyle();
dwStyle |= LVS_EX_CHECKBOXES;
m_List.SetExtendedStyle(dwStyle);

自動在第一欄顯示 CheckBox,GetCheck/SetCheck 操作項目狀態。

2. List Box 加入核取方塊

  1. 變數宣告用 CCheckListBox 取代 CListBox。
  2. 屬性頁:Has Strings = True、Owner Draw = Fixed。
  3. GetCheck/SetCheck(index) 操作。

3. Spin Control 與 Edit Control 綁定

  1. Tab Order:Spin 緊接在 Edit 之後 (Edit Tab Order = N,Spin = N+1)。
  2. Spin 屬性:Auto Buddy = True、Set Buddy Integer = True。
  3. 自動綁定:Spin 旋鈕直接修改 Edit 數值,無需寫程式碼。

4. 可設定背景/文字顏色的 Static 控件

衍生 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)) 等。

5. Static 控件顯示位圖 (BMP)

  1. Static 控件 ID 必須非 IDC_STATIC (如 IDC_STATIC_PIC),才能加入 Control 變數 m_StaticPic。
  2. 修改風格:m_StaticPic.ModifyStyle(0, SS_BITMAP | SS_CENTERIMAGE);
  3. 載入並顯示:
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 CheckBoxLVS_EX_CHECKBOXES多選清單、屬性頁
ListBox CheckBoxCCheckListBox + Owner Draw Fixed簡易多選介面
Spin+Edit 綁定Tab Order 相鄰 + Auto Buddy/Set Buddy Integer數值輸入微調
彩色 Static衍生類別 + ON_WM_CTLCOLOR_REFLECT狀態指示、強調顯示
Static 顯示圖片SS_BITMAP + SS_CENTERIMAGE + SetBitmapLogo、預覽圖、圖示

結語

這 5 個技巧皆為「零/極少程式碼」實現進階效果,屬於 VC++ 開發者必備的工具箱內容。遇到對應需求時直接套用,避免重複造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved