删除 C++ Win32 中的标准窗口框架

Posted

技术标签:

【中文标题】删除 C++ Win32 中的标准窗口框架【英文标题】:Remove the standard window frame in C++ Win32 【发布时间】:2013-01-23 18:37:02 【问题描述】:

我看到this documentation on MSDN。

我正在尝试移除窗口的标准框架。我成功地将框架扩展到客户区,但是下面的 sn -p 不起作用。我的窗口看起来和没有它时完全一样......

if (message == WM_CREATE)

    RECT rcClient;
    GetWindowRect(hWnd, &rcClient);

    // Inform the application of the frame change.
    SetWindowPos(hWnd, 
                 NULL, 
                 rcClient.left, rcClient.top,
                 (rcClient.right - rcClient.left), (rcClient.bottom - rcClient.top),
                 SWP_FRAMECHANGED);

有人可以帮帮我吗?

【问题讨论】:

代码中的任何内容实际上都没有改变框架,它只是告诉定位算法它做了并重新计算了一些值。您需要更改实际的窗口样式才能更改窗口的样式。 我在 MSDN 上看到了这个 sn-p... 但是你真的完成了样本所说的其余部分吗?正如评论所说,您粘贴的代码只是告诉窗口您更改了框架,但实际上并没有改变任何东西。 我已经完成了该页面上 sn-p 之上的所有操作。请看链接;然后你会看到只有那个代码,在它下面,一个带有更改框架的屏幕截图。 请显示您的代码也改变了窗口样式,因为显然缺少一些东西。 【参考方案1】:

我认为您可以通过在创建窗口时将 WS_OVERLAPPED(而不是 WS_OVERLAPPEDWINDOW)作为 dwStyle 参数传递给 CreateWindowEx 来做到这一点。

【讨论】:

【参考方案2】:

真的很简单,只要去你的窗口过程,然后WM_NCCALCSIZE消息,当WPARAM为TRUE时返回0

// Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)

    switch (msg)
    
    case WM_NCCALCSIZE:
        if (wparam == TRUE) return 0;
        break;
    
    ...


作为澄清,您显示的代码用于强制以前的代码

【讨论】:

以上是关于删除 C++ Win32 中的标准窗口框架的主要内容,如果未能解决你的问题,请参考以下文章

C++ Win32界面编程中的窗口风格要点总结

C++ Win32 窗口重叠事件

c++ - Win32 窗口在第一次绘制后冻结(directx 11)

Win32 C++ 在类中创建窗口和过程

带有多个菜单栏的 Win32 中的 Windows 应用程序?

Win32Api - 窗口名称属性