本文通過一個完整的 MFC 對話框程序,演示三個常見交互功能的實現:靜態文本點擊切換、兩數相加計算器、窗體動態伸縮。代碼結構清晰,適合初學者理解 MFC 消息映射、控件變量、窗口位置管理。
在對話框編輯器中添加靜態文本控件(ID: IDC_LAB_NUM1),設置屬性 Notify = True 以接收點擊消息。雙擊控件生成 OnStnClickedLabNum1 處理函數:
void CMFCTestDlg::OnStnClickedLabNum1() {
CString str; GetDlgItem(IDC_LAB_NUM1)->GetWindowText(str);
if (str == _T("Num1")) GetDlgItem(IDC_LAB_NUM1)->SetWindowText(_T("數字1"));
else GetDlgItem(IDC_LAB_NUM1)->SetWindowText(_T("Num1"));
}
添加三個編輯框(IDC_TXT_NUM1, IDC_TXT_NUM2, IDC_TXT_NUM3)和按鈕(IDC_BTN_ADD)。為前三個控件添加 int 類型變量 m_num1, m_num2, m_num3。按鈕處理:
void CMFCTestDlg::OnBnClickedBtnAdd() {
UpdateData(TRUE); // 從控件讀取數據到變量
m_num3 = m_num1 + m_num2;
UpdateData(FALSE); // 將變量寫回控件
}
添加按鈕 IDC_BTN_FLEX(初始文本「打開>>」)和靜態分割線 IDC_PIC_SPLIT(Visible=False, Sunken=True)。定義靜態 CRect 變量記錄大小:
static CRect rectBig, rectSmall, rectSplit;
初始化收縮狀態(OnInitDialog):
GetWindowRect(&rectBig); // 完整窗口大小 GetDlgItem(IDC_PIC_SPLIT)->GetWindowRect(&rectSplit); rectSmall = rectBig; rectSmall.right = rectSplit.right; // 收縮寬度至分割線 SetWindowPos(NULL, 0, 0, rectSmall.Width(), rectSmall.Height(), SWP_NOMOVE|SWP_NOZORDER);
伸縮切換邏輯:
void CMFCTestDlg::OnBnClickedBtnFlex() {
CString str; GetDlgItemText(IDC_BTN_FLEX, str);
if (str == _T("收縮<<")) {
SetDlgItemText(IDC_BTN_FLEX, _T("打開>>"));
SetWindowPos(NULL, 0, 0, rectSmall.Width(), rectSmall.Height(), SWP_NOMOVE|SWP_NOZORDER);
} else {
SetDlgItemText(IDC_BTN_FLEX, _T("收縮<<"));
SetWindowPos(NULL, 0, 0, rectBig.Width(), rectBig.Height(), SWP_NOMOVE|SWP_NOZORDER);
}
}
Notify = True,否則不發送 STN_CLICKED 消息。UpdateData(TRUE/FALSE):實現控件與變量雙向數據傳輸,DDX 機制核心。GetWindowRect + SetWindowPos:以屏幕坐標操作窗口大小位置,SWP_NOMOVE 保持位置不變。CRect 保存狀態:避免重複計算,確保伸縮精確可逆。