Rich Edit控件更改对话框返回值行为



我有点困惑:我用Edit Control创建了一个对话框,然后我注意到文本没有换行,所以我在谷歌上搜索,发现我应该使用Rich Edit Control。我照做了。现在,当我的对话框中有一个Rich Edit Control时,功能就会改变:如果没有Rich Edit Control,对话框就会返回IDOKIDCANCEL,我在消息处理程序代码之外处理它们。但是,如果对话框中的任何位置都有Rich Edit Control,那么在我单击对话框中的任意按钮之前,它总是返回除IDOK之外的其他内容:对话框似乎根本没有创建。

这是消息处理程序:

INT_PTR CALLBACK MyDialogBox(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
    switch(message){
        case WM_INITDIALOG: {
            SetDlgItemText(hDlg, IDC_EDIT1, (LPCTSTR)some_string.c_str());
            return (INT_PTR)TRUE;
        }
        case WM_COMMAND:
            switch(LOWORD(wParam)){
                case IDOK: case IDCANCEL: {
                    EndDialog(hDlg, LOWORD(wParam));
                    return (INT_PTR)TRUE;
                }
            }
        break;
    }
    return (INT_PTR)FALSE;
}

这是我使用对话框的代码:

if(DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, MyDialogBox) == IDOK){
    // without rich edit control it goes here or below depending on the user choice.
}else{
    // with rich edit it always goes here.
}

所以,这里的终极问题是:我如何让这个东西像正常的Edit Control一样工作?

编辑:当它失败时,值为:DialogBox()为-1,GetLastError()为0,如果有帮助的话?

第2版:由antinome的链接解决的问题:包括afxwin.h并在窗口WM_CREATE消息中调用AfxInitRichEdit2()

这个线程有一些解决这个问题的好技巧。总结:

如果使用纯WinAPI:

  • 请务必拨打LoadLibrary("RichEd20.dll");LoadLibrary("Msftedit.dll");。后者是控件的更新版本
  • 根据原始Win32中的Rich Edit Control,您还可以使用适当的类常量(显然是MSFTEDIT_CLASS)调用InitCommonControlsEx()—但只有当您希望windows视觉样式能够正常工作时,才需要它

如果使用MFC:

  • 确保在初始化阶段调用AfxInitRichEdit2(),例如在InitInstance()

最新更新