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

MFC 非模態對話框編輯框中文亂碼:RichEdit 控件解決方案

     編輯:程式設計綜合問答

現象

Unicode 構建下,非模態對話框 CEdit 輸入中文顯示亂碼/方塊,模態對話框正常。

根因

CEdit 內部調用 CreateWindowEx(WC_EDIT...),非模態對話框消息泵中 IsDialogMessage 處理輸入法消息 (WM_IME_COMPOSITION) 存在時序問題,導致組合字符串未正確提交。

解決方案:使用 CRichEditCtrl

  1. 對話框編輯器:刪除 CEdit,從工具箱拖入 Rich Edit Control (IDC_RICHEDIT1)。
  2. 頭文件添加:#include <afxrich.h>。
  3. 變量關聯:CRichEditCtrl m_richEdit;,DDX_Control(pDX, IDC_RICHEDIT1, m_richEdit);。
  4. 初始化:OnInitDialog 中 AfxInitRichEdit2(); (或 AfxInitRichEdit() 舊版)。
  5. 設置字體:m_richEdit.SetFont(&font); 確保字體支持中文。

代碼示例

BOOL CMyDlg::OnInitDialog() {
    CDialogEx::OnInitDialog();
    AfxInitRichEdit2();  // 必須調用
    m_richEdit.SetFont(GetFont());
    m_richEdit.SetEventMask(ENM_CHANGE | ENM_KEYEVENTS);  // 可選事件
    return TRUE;
}

對比

特性CEditCRichEditCtrl
非模態中文輸入易亂碼正常
RTF/富文本不支持支持
撤銷/重做基礎完整
內存佔用極低稍高

備選:修正消息泵 (不推薦)

// 在 CWinApp::Run 或模態循環中
while (GetMessage(&msg, NULL, 0, 0)) {
    if (!IsDialogMessage(hDlg, &msg)) {  // 非模態也需傳 hDlg
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

但容易引入副作用,首選 RichEdit。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved