Unicode 構建下,非模態對話框 CEdit 輸入中文顯示亂碼/方塊,模態對話框正常。
CEdit 內部調用 CreateWindowEx(WC_EDIT...),非模態對話框消息泵中 IsDialogMessage 處理輸入法消息 (WM_IME_COMPOSITION) 存在時序問題,導致組合字符串未正確提交。
CEdit,從工具箱拖入 Rich Edit Control (IDC_RICHEDIT1)。#include <afxrich.h>。CRichEditCtrl m_richEdit;,DDX_Control(pDX, IDC_RICHEDIT1, m_richEdit);。OnInitDialog 中 AfxInitRichEdit2(); (或 AfxInitRichEdit() 舊版)。m_richEdit.SetFont(&font); 確保字體支持中文。BOOL CMyDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
AfxInitRichEdit2(); // 必須調用
m_richEdit.SetFont(GetFont());
m_richEdit.SetEventMask(ENM_CHANGE | ENM_KEYEVENTS); // 可選事件
return TRUE;
}
| 特性 | CEdit | CRichEditCtrl |
|---|---|---|
| 非模態中文輸入 | 易亂碼 | 正常 |
| RTF/富文本 | 不支持 | 支持 |
| 撤銷/重做 | 基礎 | 完整 |
| 內存佔用 | 極低 | 稍高 |
// 在 CWinApp::Run 或模態循環中
while (GetMessage(&msg, NULL, 0, 0)) {
if (!IsDialogMessage(hDlg, &msg)) { // 非模態也需傳 hDlg
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
但容易引入副作用,首選 RichEdit。