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

VC++ 執行期動態建立控件完整指南:以 CEdit 為例

     編輯:關於VC++

前言

資源編輯器雖方便佈局,但某些情境需在執行期根據條件動態建立/銷毀控件 (如依使用者權限顯示不同欄位)。本文以 CEdit 為例,示範動態建立控件的標準流程:宣告成員變數、定義控件 ID、訊息對應、CreateEx 建立、ShowWindow 顯示、DestroyWindow 銷毀。

步驟詳細說明

1. 標頭檔宣告 (MyDlg.h)


class CMyDlg : public CDialog {
public:
    CEdit m_MyEdit;                 // 成員變數
protected:
    afx_msg void OnChangeEdit();    // 內容變更處理
    DECLARE_MESSAGE_MAP()
};

2. 實作檔定義與訊息對應 (MyDlg.cpp)


// 自訂控件 ID (避免與資源編輯器 ID 衝突)
#define ID_MYEDT 1820

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_EN_CHANGE(ID_MYEDT, OnChangeEdit)
END_MESSAGE_MAP()

3. 動態建立控件 (例如在 OnInitDialog 或按鈕處理中)


CRect rect(10, 10, 200, 30); // 位置與大小
m_MyEdit.CreateEx(
    WS_EX_CLIENTEDGE,         // 3D 邊框
    _T("EDIT"),               // 系統類別名
    NULL,                     // 無標題
    ES_AUTOHSCROLL | ES_LEFT | ES_NOHIDESEL | WS_CHILD | WS_VISIBLE,
    rect, this, ID_MYEDT
);
// CreateEx 已含 WS_VISIBLE,若分開建立需額外呼叫 ShowWindow(SW_SHOW)
m_MyEdit.SetFocus();          // 設定焦點

4. 動態銷毀控件


GetDlgItem(ID_MYEDT)->DestroyWindow();
// 或 m_MyEdit.DestroyWindow(); (需確認 m_MyEdit.m_hWnd 有效)

5. 事件處理函數實作


void CMyDlg::OnChangeEdit() {
    CString str; m_MyEdit.GetWindowText(str);
    // 即時驗證、過濾、聯動其他控件...
}

其他常見控件動態建立差異

控件類別名關鍵風格
ButtonBUTTONBS_PUSHBUTTON, BS_CHECKBOX, BS_RADIOBUTTON
ListBoxLISTBOXLBS_NOTIFY, WS_VSCROLL, WS_BORDER
ComboBoxCOMBOBOXCBS_DROPDOWN, CBS_DROPDOWNLIST, WS_VSCROLL
ListCtrlSysListView32LVS_REPORT, LVS_SINGLESEL, WS_BORDER
TreeCtrlSysTreeView32TVS_HASBUTTONS, TVS_LINESATROOT, WS_BORDER
DateTimePickerSysDateTimePick32DTS_SHORTDATEFORMAT, WS_BORDER

建立方式同樣呼叫 CreateEx,傳入對應類別名與風格,成員變數型別改為 CButton、CListBox、CComboBox、CListCtrl、CTreeCtrl、CDateTimeCtrl 等。

注意事項

  • 控件 ID 必須唯一,建議定義在 1000 以上避開系統保留值。
  • 動態建立的控件不會自動參與對話框資料交換 (DDX),需手動 GetWindowText/SetWindowText。
  • 若需支援 Tab 鍵切換焦點,建立時需加入 WS_TABSTOP 風格,並確保父對話框有 WS_EX_CONTROLPARENT。
  • 銷毀後成員變數 m_hWnd 變為 NULL,重複建立前應檢查或重新 SubclassDlgItem。

總結

掌握 CreateEx + 訊息對應 + 成員變數模式,即可在執行期彈性建立/移除任意標準控件,適合插件式介面、權限動態顯示、精簡資源載入等進階場景。

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