c++ - 将窗口样式从标准更改为没有标题栏并返回

标签 c++ winapi

我正在编写一个应用程序(c++,win32),我想将主窗口创建为 a) 标准窗口,或 b) 没有标题栏但可调整大小/可移动,我想在运行时在两种样式之间切换时间。

我正在使用以下代码创建窗口:

bool   bare        = false ;
DWORD  style_bare  = WS_POPUP  | WS_SIZEBOX | WS_THICKFRAME ;
DWORD  style_std   = WS_OVERLAPPEDWINDOW     ;
DWORD  win_style   = bare ? style_bare : style_std ;
DWORD  win_exstyle = WS_EX_ACCEPTFILES | WS_EX_CLIENTEDGE | WS_EX_APPWINDOW;
...
HWND main = CreateWindowEx( win_exstyle ,  className , applName ,  win_style,  x, y, cx, cy, NULL, NULL, hInstance, NULL);

然后,在 MainWndProc() 中,更改样式

bare = ! bare ;
if ( bare ) 
    SetWindowLongPtr( hwnd , GWL_STYLE,   style_bare ) ;
else 
    SetWindowLongPtr( hwnd , GWL_STYLE,   style_std  ) ;
InvalidateRect( hwnd, NULL , TRUE ) ;

在“裸”模式下,我处理使裸窗口可移动的 WM_NCHITEST 消息,如下所示:

   if ( bare && WM_NCHITTEST == message )
   {
        LRESULT rc = DefWindowProc( hwnd, message, wParam, lParam ) ;
        if ( HTCLIENT  == rc ) return HTCAPTION  ;
        return rc ;
  }

当我在任一模式下创建窗口时,代码工作正常,但当我切换模式时,窗口按预期绘制,但不是“可选择的”... 当我点击它时,它移动到所有可能存在的窗口后面,当我关闭所有窗口找到我的 APP 并点击它时,桌面上的图标被选中。

我错过了什么......

最佳答案

在使用SetWindowLongPtr 改变窗口框架时不要忘记调用SetWindowPos。您的 SetWindowLongPtr 在额外窗口内存中的指定偏移处设置窗口框架的值。帧变化的信息被缓存。 SetWindowPos 将使其生效。

bare = !bare;
if (bare)
    SetWindowLongPtr(hwnd, GWL_STYLE, style_bare);
else
    SetWindowLongPtr(hwnd, GWL_STYLE, style_std);
SetWindowPos(hwnd,0,0,0,0,0, SWP_FRAMECHANGED| SWP_NOMOVE| SWP_NOOWNERZORDER| SWP_NOSIZE| SWP_NOZORDER| SWP_SHOWWINDOW);
InvalidateRect(hWnd, NULL, TRUE);

关于c++ - 将窗口样式从标准更改为没有标题栏并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56679873/

相关文章:

c++ - 可观察

c++ - 将 volatile 用于 WinAPI 线程之间的共享变量

c - 在线程函数中获取句柄

c++ - 使用自定义数据类型输入参数调用方法时 open62541 客户端失败

C++ pthread阻塞队列死锁(我认为)

c++ - 如何在 pyMIC 中为 Xeon Phi 编译 knn

winapi - RmGetList 始终返回 0x5 ERROR_ACCESS_DNIED

c++ - 访问 CV_32SC1 nx1 opencv 矩阵

delphi - SetWindowsHookEx 卡住我的键盘和鼠标,并发生其他奇怪的事情

windows - 如何在 win32 进程中显示 'memory used' 的百分比?