Rich Edit Control изменяет поведение возвращаемого значения DialogBox? - PullRequest
1 голос
/ 21 июня 2011

Я немного озадачен: я создал диалоговое окно с Edit Control, затем я заметил, что текст не переносится словами, поэтому я погуглил и обнаружил, что вместо него я должен использовать Rich Edit Control.Так я и сделал.Теперь, когда в моем диалоговом окне появляется Rich Edit Control, функциональность меняется: без Rich Edit Control диалоговое окно возвращает либо IDOK, либо IDCANCEL, который я обрабатываю за пределами кода обработчика сообщений.НО, если в диалоговом окне где-то есть 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: Проблема решена с помощью ссылки антинома: включите afxwin.h и позвоните AfxInitRichEdit2() в окне WM_CREATE message.

1 Ответ

1 голос
/ 23 июня 2011

В этой теме есть несколько полезных советов для решения этой проблемы. Подведем итог:

Если используется чистый WinAPI:

  • Обязательно позвоните LoadLibrary("RichEd20.dll"); или LoadLibrary("Msftedit.dll");. Последний является более новой версией элемента управления.
  • В соответствии с Rich Edit Control в сыром Win32 , вы также можете вызвать InitCommonControlsEx() с соответствующей константой класса (MSFTEDIT_CLASS, по-видимому) & mdash; но это необходимо, только если вы хотите, чтобы визуальные стили Windows работали.

При использовании MFC:

  • Обязательно вызовите AfxInitRichEdit2() на этапе инициализации, например, в InitInstance()
...