【问题标题】:CreateWindowEx creates old (Windows 7) style border on Windows 10CreateWindowEx 在 Windows 10 上创建旧 (Windows 7) 样式边框
【发布时间】:2019-07-16 08:54:37
【问题描述】:

每当我使用CreateWindowEx(...) 创建一个窗口(具体参数可以在下面的代码中找到)时,它都会像旧式窗口一样显示:

仅当我在远程桌面上启动它,关闭连接并重新连接时,它才会更改为所需的 Windows 10 样式:

这是否与应用程序在执行此操作时收到的几条WM_SETTINGCHANGE 消息有关?

显然,我希望窗口在创建时具有现代风格,而不是在处理某些消息之后。

我尝试了WS_... 样式参数的不同组合。奇怪的是,该应用程序仅以WS_OVERLAPPEDWINDOW | WS_VISIBLE 可靠地显示。

我在两个命令中都尝试过ShowWindow(带有各种参数)和UpdateWindow

我也尝试过使用目标平台和工具集,但无济于事(使用 VS2015、v140)。

代码sn-p:

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);
}

【问题讨论】:

  • 只是猜测,但您可能需要应用程序清单。
  • @SebastianRedl 我已按照指南在 VS2015 中添加清单,但要么我做错了,要么没有效果。

标签: c++ createwindowex window-style


【解决方案1】:

奇怪的是,解决方案似乎是从样式标志中删除WS_VISIBLE,并手动显示窗口:

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

我 100% 确定我已经尝试过,但突然就奏效了。随便...

【讨论】:

    猜你喜欢
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多