CreateWindowEx создает границу в старом (Windows 7) стиле в Windows 10

Всякий раз, когда я создаю окно с CreateWindowEx(...) (точные параметры можно найти в коде ниже), оно отображается как окно в старом стиле:

старый стиль  окно

Только когда я запускаю его на удаленном рабочем столе, закрываю соединение и снова подключаюсь, он меняется на нужный стиль Windows 10:

новый стиль  окно

Это как-то связано с несколькими WM_SETTINGCHANGE сообщениями, которые приложение получает при этом?

Очевидно, я хочу, чтобы окно имело современный стиль при создании, а не после обработки какого-то сообщения.

Я пробовал разные комбинации аргументов в стиле WS_.... Как ни странно, приложение надежно отображается только с WS_OVERLAPPEDWINDOW | WS_VISIBLE.

Я пробовал ShowWindow (с разными аргументами) и UpdateWindow в обоих случаях.

Я также пытался возиться с целевой платформой и набором инструментов, но безрезультатно (используя VS2015, v140).

Фрагмент кода:

WNDCLASSEX wc = {sizeof(WNDCLASSEX), NULL, WindowController::globalEventProcessor, 
                 0L, 0L, GetModuleHandle(NULL), NULL,
                 LoadCursor(NULL, IDC_ARROW), NULL, NULL,
                 _T("Window"), NULL};
RegisterClassEx(&wc);

HWND handle = CreateWindowEx(
            NULL,
            wc.lpszClassName,
            _T("Test"),
            WS_OVERLAPPEDWINDOW | WS_VISIBLE,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            parentWindow ? parentWindow->getHandle() : NULL,
            NULL,
            wc.hInstance,
            reinterpret_cast<LPVOID>(this)
);

if (handle != NULL)
{
    ... // resizing the window's contents
    UpdateWindow(handle);
}

person T. J. Evers    schedule 16.07.2019    source источник
comment
Просто предположение, но вам может понадобиться манифест приложения.   -  person Sebastian Redl    schedule 16.07.2019
comment
@SebastianRedl Я следовал инструкциям по добавлению манифеста в VS2015, но либо я делаю что-то не так, либо это не дает никакого эффекта.   -  person T. J. Evers    schedule 24.07.2019


Ответы (1)


Как ни странно, решение, похоже, состоит в том, чтобы удалить WS_VISIBLE из флагов стиля и показать окно вручную:

if (handle != NULL)
{
    ... // resizing the window's contents
    ShowWindow(handle, 1); /* Add this */
    UpdateWindow(handle);
}

Который я на 100% уверен, что уже пробовал, но вдруг работает. Что бы ни...

person T. J. Evers    schedule 29.07.2019