資源編輯器雖方便佈局,但某些情境需在執行期根據條件動態建立/銷毀控件 (如依使用者權限顯示不同欄位)。本文以 CEdit 為例,示範動態建立控件的標準流程:宣告成員變數、定義控件 ID、訊息對應、CreateEx 建立、ShowWindow 顯示、DestroyWindow 銷毀。
class CMyDlg : public CDialog {
public:
CEdit m_MyEdit; // 成員變數
protected:
afx_msg void OnChangeEdit(); // 內容變更處理
DECLARE_MESSAGE_MAP()
};
// 自訂控件 ID (避免與資源編輯器 ID 衝突)
#define ID_MYEDT 1820
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_EN_CHANGE(ID_MYEDT, OnChangeEdit)
END_MESSAGE_MAP()
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(); // 設定焦點
GetDlgItem(ID_MYEDT)->DestroyWindow();
// 或 m_MyEdit.DestroyWindow(); (需確認 m_MyEdit.m_hWnd 有效)
void CMyDlg::OnChangeEdit() {
CString str; m_MyEdit.GetWindowText(str);
// 即時驗證、過濾、聯動其他控件...
}
| 控件 | 類別名 | 關鍵風格 |
|---|---|---|
| Button | BUTTON | BS_PUSHBUTTON, BS_CHECKBOX, BS_RADIOBUTTON |
| ListBox | LISTBOX | LBS_NOTIFY, WS_VSCROLL, WS_BORDER |
| ComboBox | COMBOBOX | CBS_DROPDOWN, CBS_DROPDOWNLIST, WS_VSCROLL |
| ListCtrl | SysListView32 | LVS_REPORT, LVS_SINGLESEL, WS_BORDER |
| TreeCtrl | SysTreeView32 | TVS_HASBUTTONS, TVS_LINESATROOT, WS_BORDER |
| DateTimePicker | SysDateTimePick32 | DTS_SHORTDATEFORMAT, WS_BORDER |
建立方式同樣呼叫 CreateEx,傳入對應類別名與風格,成員變數型別改為 CButton、CListBox、CComboBox、CListCtrl、CTreeCtrl、CDateTimeCtrl 等。
GetWindowText/SetWindowText。WS_TABSTOP 風格,並確保父對話框有 WS_EX_CONTROLPARENT。m_hWnd 變為 NULL,重複建立前應檢查或重新 SubclassDlgItem。掌握 CreateEx + 訊息對應 + 成員變數模式,即可在執行期彈性建立/移除任意標準控件,適合插件式介面、權限動態顯示、精簡資源載入等進階場景。