【问题标题】:Rich Edit Control changes the DialogBox return value behavior?Rich Edit Control 改变 DialogBox 返回值的行为?
【发布时间】:2011-09-19 18:26:41
【问题描述】:

我有点困惑:我用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 一样工作?

编辑:失败时,值为:-1 表示 DialogBox(),0 表示 GetLastError(),如果有帮助?

Edit2:问题被Antinome的link解决:包括afxwin.h并在窗口WM_CREATE消息处调用AfxInitRichEdit2()

【问题讨论】:

  • 了解DialogBox() 返回的值会很有帮助。还有,如果在DialogBox返回后调用GetLastError()返回什么值?
  • @antinome,-1 表示 dialogbox(),0 表示 getlasterror()。
  • 这是所有的代码吗?还是您的代码在一个或多个 case 语句中缺少 break
  • 如果未指定 ES_AUTOHSCROLL,则多行编辑控件会自动换行。请参阅Edit Control Styles 中的 ES_MULTILINE。
  • @Hans,是的,这都是我的代码。顺便说一句,该错误与代码无关:每当我添加 Rich Edit Control 时,对话框就会停止按预期运行,并且当我删除 Rich Edit Control 时,它又可以正常工作了!即使在我的代码中根本没有引用这个 Rich Edit Control,这一切也会发生。

标签: c++ winapi richedit dialog


【解决方案1】:

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

如果使用纯 WinAPI:

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

如果使用 MFC:

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

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多