Следующий код возвращает 0 в wnd, но сразу после CreateDialog возникает ошибка ERROR_SUCCESS. Диалог не появляется, и я не понимаю, как это возможно. Это консольный проект, и диалог создается в vs2013, если это актуально.

#include <windows.h>
#include "resource.h"

int main(){
    HWND wnd = CreateDialog(NULL, MAKEINTRESOURCE(IDD_DIALOG1), NULL, NULL);
    ShowWindow(wnd, SW_SHOWDEFAULT);
    UpdateWindow(wnd);
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

Должно быть, это какая-то действительно глупая ошибка, но я этого не вижу.

1
simonzack 23 Дек 2014 в 05:22
Есть ли в диалоговом окне какие-либо элементы управления?
 – 
Jonathan Potter
23 Дек 2014 в 05:29
Да, у него есть 3, OK, ОТМЕНА и поле редактирования RichEdit20A.
 – 
simonzack
23 Дек 2014 в 05:31
Сначала вам потребуется инициализировать библиотеку расширенного редактирования — см. примечание по адресу msdn.microsoft.com/en-us/library/windows/desktop/… о звонке LoadLibrary. В качестве альтернативы установка стиля DS_NOFAILCREATE должна разрешить создание диалогового окна, хотя элемент управления расширенным редактированием не будет отображаться.
 – 
Jonathan Potter
23 Дек 2014 в 05:35
Загрузка Riched20.dll помогла, спасибо! Жаль, что визуальная студия не сказала бы что-нибудь об этом. Отправьте это как ответ, и я приму это. Кстати, это было невероятное предположение :D
 – 
simonzack
23 Дек 2014 в 05:38
Рад, что теперь работает!
 – 
Jonathan Potter
23 Дек 2014 в 05:43

2 ответа

Лучший ответ

Сначала вам нужно будет инициализировать библиотеку расширенного редактирования - если библиотека не загружена, элемент управления не будет зарегистрирован и создание диалогового окна завершится ошибкой.

См. Примечание по адресу http://msdn.microsoft.com /en-us/library/windows/desktop/hh298375(v=vs.85).aspx о вызове LoadLibrary. Это необходимо сделать до создания диалога.

В качестве альтернативы установка стиля DS_NOFAILCREATE должна позволить создать диалоговое окно, хотя элемент управления Rich Edit не будет отображаться.

6
Jonathan Potter 23 Дек 2014 в 05:43
Есть ли способ определить во время выполнения, что это была ошибка?
 – 
M.M
23 Дек 2014 в 05:51
@MattMcNabb: я ожидал, что GetLastError вернет ERROR_CANNOT_FIND_WND_CLASS - если нет, то, вероятно, нет.
 – 
Jonathan Potter
23 Дек 2014 в 06:05

Если бы такая же проблема возникла, мой диалог не появлялся, на самом деле отсутствовала загрузка элемента управления RichText2.0.

Вот как я исправил, он должен поддерживать любую версию Windows.

Добавьте это в свой проект

#include <richedit.h>       // To use richedit control

//Load RichText4.1 or 2.0/3.0 or 1.0 (last resort)  Control first. (3 different DLL's for full support).

//
//   FUNCTION: IsWinXPSp1Min()
//
//   PURPOSE: Return TRUE if operating sytem is Windows XP SP1 or later. 
//   Windows XP SP1 is the minimum system required to use a richedit v4.1 but only 
//   when UNICODE is defined.
//
BOOL IsWinXPSp1Min()
{
    OSVERSIONINFO osvi = { sizeof(osvi) };
    if (!GetVersionEx(&osvi))
    {
        return FALSE;
    }

    // Determine if system is Windows XP minimum
    if (osvi.dwMajorVersion >= 5 && osvi.dwMinorVersion >= 1)
    {
        // Now check if system is specifically WinXP and, if so, what service pack 
        // version is installed.
        if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
        {
            // The following test assumes that the szCSDVersion member of the 
            // OSVERSIONINFO struct's format will always be a string like 
            // "Service Pack x", where 'x' is a number >= 1. This is fine for SP1 
            // and SP2 but future service packs may have a different string 
            // descriptor.
            TCHAR* pszCSDVersion = L"Service Pack 1";
            if (osvi.szCSDVersion < pszCSDVersion)
            {
                return FALSE;
            }
        }
        return TRUE;
    }
    return FALSE;
}

//
//   FUNCTION: GetRichEditClassName()
//
//   PURPOSE: Load the proper version of RichEdit and return the class name.
//
PCWSTR GetRichEditClassName()
{
    HINSTANCE hLib;

    // Try to load latest version of rich edit control. Since v4.1 is available 
    // only as an UNICODE control on a minimum of Windows XP with service pack 1 
    // installed, use preprocessor conditional to ensure that an attempt to load 
    // Msftedit.dll is only made if UNICODE is defined.

#if defined UNICODE
    if (IsWinXPSp1Min())
    {
        // Try to get richedit v4.1, explicitly use wide character string as this 
        // is UNICODE only.
        hLib = LoadLibrary(L"msftedit.dll");
        if (hLib)
        {
            return MSFTEDIT_CLASS;
        }
    }
#endif

    // Cannot get latest version (v4.1) so try to get earlier one

    // Rich Edit Version 2.0/3.0
    hLib = LoadLibrary(L"riched20.dll");
    if (hLib)
    {
        // Version 2.0/3.0 is good
        return RICHEDIT_CLASS;
    }

    // Rich Edit Version 1.0
    hLib = LoadLibrary(L"riched32.dll");
    if (hLib)
    {
        // Version 1.0 is good
        return L"RichEdit";
    }

    // Cannot get any versions of RichEdit control (error)
    return L"";
}

Файл resource.h

#define IDC_RICHEDIT        3990

Создайте фактический элемент управления RichEdit

// //   FUNCTION: OnInitRichEditDialog(HWND, HWND, LPARAM) // //   PURPOSE: Process the WM_INITDIALOG message // BOOL OnInitRichEditDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {
    RECT rc = { 20, 20, 160, 250 };

    HWND hRichEdit = CreateWindowEx(WS_EX_CLIENTEDGE, GetRichEditClassName(), 
        L"RichEdit Control", 
        ES_MULTILINE | ES_AUTOHSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | 
        WS_VSCROLL | WS_CHILD | WS_VISIBLE, 
        rc.left, rc.top, rc.right, rc.bottom, 
        hWnd, reinterpret_cast<HMENU>(IDC_RICHEDIT), g_hInst, 0);
    if (hRichEdit)
    {
        SendMessage(hRichEdit, WM_SETFONT, reinterpret_cast<WPARAM>(g_hFont), TRUE);
    }

    return TRUE; }
0
SSpoke 15 Май 2021 в 02:37