void CEmailSettingDlg::OnBnClickedOk() {
UpdateData(TRUE); // 從控件獲取數據到變量
// ... 修改 m_str_BackGround 等變量 ...
::SendMessage(pdlg->m_hWnd, WM_PAINT, 0, 0); // 界面未更新!
}
UpdateData(TRUE):控件 → 變量(用戶輸入同步到成員變量)。UpdateData(FALSE):變量 → 控件(成員變量值推送到界面控件)。修改 m_str_BackGround 等變量後,若不調用 UpdateData(FALSE),控件顯示舊值,繪製邏輯讀取控件值仍為舊值。
UpdateData(TRUE);
// ... 業務邏輯修改變量 ...
UpdateData(FALSE); // 關鍵:同步變量到控件
::SendMessage(pdlg->m_hWnd, WM_PAINT, 0, 0); // 現在繪製讀取到新值
若繼承 CWnd 直接 GetDlgItem(IDC_EDIT)->SetWindowText(newVal),則不涉及 DDX,無需 UpdateData。但推薦統一使用 DDX 變量,代碼更清晰。
UpdateData(TRUE) 忘記 FALSE。OnInitDialog 中設置變量後未調用 UpdateData(FALSE) 導致初始值不顯示。PostMessage 回主線程 UpdateData。