Rich Edit Control会更改DialogBox的返回值行为吗?

时间:2011-06-21 18:03:37

标签: c++ winapi richedit dialog

我有点疑惑:我创建了一个带有Edit Control的对话框,然后我注意到文本没有自动换行,所以我用Google搜索并发现我应该使用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 link已解决问题:在afxwin.h窗口添加AfxInitRichEdit2()并致电WM_CREATE

1 个答案:

答案 0 :(得分:1)

This thread 有一些很好的解决此问题的技巧。总结一下:

如果使用纯WinAPI:

  • 请务必致电LoadLibrary("RichEd20.dll");LoadLibrary("Msftedit.dll");。后者是控件的较新版本。
  • 根据 Rich Edit Control in raw Win32 ,您还可以使用相应的类常量(InitCommonControlsEx()显然)调用MSFTEDIT_CLASS - 但只有在您希望Windows可视化时才需要它工作风格。

如果使用MFC:

  • 请务必在初始化阶段致电AfxInitRichEdit2(),例如在InitInstance()