Создать OpenGL окно Win32 API

Я пытаюсь создать окно OpenGL внутри уже существующего родительского окна с помощью Win32 API. Однако при создании дочернего элемента функция CreateWindowEx возвращает NULL с ошибкой 1407 ERROR_CANNOT_FIND_WND_CLASS. Окно должно быть дочерним, чтобы оставалось место для других элементов управления, таких как кнопки и флажки...

Часть кода, которая создает родительское окно:

WNDCLASSEX wincl;
wincl.style = 0;
wincl.lpszMenuName = NULL;
wincl.lpszClassName = L"WindowClass";
wincl.lpfnWndProc = WndProc;
wincl.hInstance = hInstance;
wincl.hIconSm = LoadIcon(NULL, IDC_ICON);
wincl.hIcon = LoadIcon(NULL, IDC_ICON);
wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wincl.cbWndExtra = 0;
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.cbClsExtra = 0;

if(!RegisterClassEx(&wincl)){
    std::cout << "Window failed to register!" << std::endl;
    return false;
}

DWORD style = WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU | WS_SIZEBOX;

parentHwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
                      L"WindowClass",
                      L"Title",
                      style,
                      CW_USEDEFAULT, // X
                      CW_USEDEFAULT, // Y
                      800, // Width
                      600, // Height
                      NULL,
                      NULL,
                      hInstance,
                      0);

if (parentHwnd == NULL){
    std::cout << "Window failed to create!" << std::endl;
    return false;
}

ShowWindow(parentHwnd, SW_SHOWNORMAL);
UpdateWindow(parentHwnd);

Внутри цикла сообщений я создаю дочернее окно:

LRESULT WndProc(HWND hwnd, UINT Msg, WPARAM wParam , LPARAM lParam){
    switch (Msg){
        case WM_CREATE:{
            // Create child OpenGL window
            childHwnd = CreateWindowEx(0,
                                   L"OpenGL",
                                   NULL,
                                   WS_CLIPCHILDREN | WS_VISIBLE,
                                   100, // X
                                   100, // Y
                                   400, // Width
                                   300, // Height
                                   hwnd, // Parent
                                   0, // ID
                                   NULL,
                                   NULL);
            // Prints 1407 ERROR_CANNOT_FIND_WND_CLASS
            std::cout << "Last error: " << GetLastError() << std::endl;
        }
        default:{
            return DefWindowProc(hwnd, Msg, wParam, lParam);
        }
    }
    return 0;
}

Я просмотрел несколько учебных пособий ( NeHe, cs.rit.edu и многие другие, но я не могу опубликовать более двух ссылок), и все они использовали L"OpenGL" как имя класса для второго аргумента в функции CreateWindowEx(),

Что я делаю неправильно? Является ли "OpenGL" допустимым именем класса, например "Edit" / "Static" / "Button"? Могу ли я заменить его на что-то еще? Я попробовал "Static", но он ничего не сделал.

Я знаю, что есть много библиотек (GLFW, SDL, ...), которые обрабатывают создание окон, но мне нужно использовать чистый win32 API.

ОБНОВИТЬ:

RegisterClass () решил проблему. Вот код, который работает для меня:

WNDCLASS wc      = {0}; 
wc.lpfnWndProc   = WndProc;
wc.hInstance     = hInstance; // Same hinstance used by parent
wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);
wc.lpszClassName = L"OpenGL";
wc.style = CS_OWNDC;

if(!RegisterClass(&wc)){
    std::cout << "Failed to register window!" << std::endl;
    return false;
}

childHwnd = CreateWindowEx(0, // Must be zero
                           L"OpenGL",
                           NULL,
                           WS_VISIBLE | WS_CHILD,
                           100, // X
                           100, // Y
                           400, // Width
                           300, // Height
                           parentHwnd, // Parent HWND
                           0, // ID
                           hInstance, // Same hinstance used by parent
                           NULL);

0 ответов

Другие вопросы по тегам