我正在编写一个应用程序(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/