Заголовок окон, определенный в функции CreateWindowW, не отображается - PullRequest
0 голосов
/ 21 марта 2019

Я создал окно с функцией CreateWindowW (после регистрации класса Windows и т. Д.), И оно работает нормально, но заголовок окна не отображается.Я мог бы решить проблему с помощью функции SetWindowTextW, но все же мне интересно, почему она не работает обычным образом.

Это моя функция регистрации:

ATOM MainWindow::RegisterMainWindow(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = MainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = windowsClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassExW(&wcex);
}

Моя функция создания…:

BOOL MainWindow::CreateMainWindow(HINSTANCE hInstance)
{
hwnd = CreateWindowW(windowsClass, L"FLY", WS_OVERLAPPEDWINDOW,
    PublicMainClass::userData.MainWindow.left, PublicMainClass::userData.MainWindow.top,
    PublicMainClass::userData.MainWindow.right, PublicMainClass::userData.MainWindow.bottom, nullptr, nullptr, hInstance, NULL/*this*/);

SetWindowTextW(hwnd, windowsTitle);

if (!hwnd)
{
    return FALSE;
}

ShowWindow(hwnd, SW_NORMAL);
UpdateWindow(hwnd);
return TRUE;
}

И мой конструктор:

MainWindow::MainWindow(HINSTANCE hInstance)
{
PublicMainClass::userData.NewUser();

PublicMainClass::PublicMainClassConstructor(hInstance);

LoadStringW(hInstance, MAIN_WINDOW_CLASS, windowsClass, MAX_LOADSTRING);
LoadStringW(hInstance, APP_TITLE, windowsTitle, MAX_LOADSTRING);
}

Вот как функция wWinMain вызывает класс:

MainWindow* mainWindow = new MainWindow(hInstance);
mainWindow->RegisterMainWindow(hInstance);
mainWindow->CreateMainWindow(hInstance);

И это моя оконная процедура:

LRESULT CALLBACK MainWindow::MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_NCCREATE:
{
    CREATESTRUCT *pcs = (CREATESTRUCT*)lParam;
    //MainWindow* mainWindow = (MainWindow*)pcs->lpCreateParams;
    //mainWindow->hwnd = hWnd;
    SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)pcs->lpCreateParams);

    /*Taskbar *taskbar = new Taskbar();
    taskbar->RegisterTaskbarWindow();
    taskbar->CreateTaskbarWindow(hWnd);*/

    /*WorkSpace *workspace = new WorkSpace();
    workspace->RegisterWorkSpaceWindow();
    workspace->CreateWorkSpaceWindow(hWnd);*/
    return TRUE;
}
break;
case WM_CREATE:
{
    ShowWindow(hWnd, SW_SHOW);
}
break;
case WM_CLOSE:
{
    PostQuitMessage(0);
}
break;
case WM_DESTROY:
{
    MainWindow *mainWindow = (MainWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    if (mainWindow) mainWindow->hwnd = 0;
    return TRUE;
}
break;
case WM_LBUTTONDOWN:
{
    MainWindow *mainWindow = (MainWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    POINT pointer;
    pointer.x = GET_X_LPARAM(lParam);
    pointer.y = GET_Y_LPARAM(lParam);
    mainWindow->OnClk(&pointer);
    return TRUE;
}
break;
case WM_RBUTTONDOWN:
{
    MainWindow *mainWindow = (MainWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    POINT pointer;
    pointer.x = GET_X_LPARAM(lParam);
    pointer.y = GET_Y_LPARAM(lParam);

    return TRUE;
}
break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}

return 0;
}

1 Ответ

0 голосов
/ 27 марта 2019

Проблема в том, что, поскольку я обработал сообщение WM_NCCREATE в процедуре окна, оно не было обработано функцией DefWindowProc(). Функция WM_NCCREATE должна обрабатываться следующим образом:

case WM_NCCREATE:
{
    CREATESTRUCTW* create = (CREATESTRUCTW*)lParam;
    SetWindowTextW(hWnd, create->lpszName);
    return TRUE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...