首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC 對話框數據交換機制陷阱:修改控件變量後必須調用 UpdateData(FALSE) 才能更新界面

     編輯:程式設計疑難解答

問題代碼

void CEmailSettingDlg::OnBnClickedOk() {
    UpdateData(TRUE); // 從控件獲取數據到變量
    // ... 修改 m_str_BackGround 等變量 ...
    ::SendMessage(pdlg->m_hWnd, WM_PAINT, 0, 0); // 界面未更新!
}

DDX 機制原理

  • UpdateData(TRUE):控件 → 變量(用戶輸入同步到成員變量)。
  • UpdateData(FALSE):變量 → 控件(成員變量值推送到界面控件)。

修改 m_str_BackGround 等變量後,若不調用 UpdateData(FALSE),控件顯示舊值,繪製邏輯讀取控件值仍為舊值。

修正代碼

UpdateData(TRUE);
// ... 業務邏輯修改變量 ...
UpdateData(FALSE); // 關鍵:同步變量到控件
::SendMessage(pdlg->m_hWnd, WM_PAINT, 0, 0); // 現在繪製讀取到新值

補充:直接操作控件 vs 變量

若繼承 CWnd 直接 GetDlgItem(IDC_EDIT)->SetWindowText(newVal),則不涉及 DDX,無需 UpdateData。但推薦統一使用 DDX 變量,代碼更清晰。

常見錯誤

  • 只調用 UpdateData(TRUE) 忘記 FALSE。
  • 在 OnInitDialog 中設置變量後未調用 UpdateData(FALSE) 導致初始值不顯示。
  • 多線程中直接修改 UI 變量,需 PostMessage 回主線程 UpdateData。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved