我正在C中编写窗口管理代码。当设置了某些标志时,我希望有一个最大化的窗口,该窗口不能通过拖动标题栏来调整大小。有没有办法将最大化窗口"锁定"在最大化状态?
试试这个
case WM_SYSCOMMAND:
if(IsMaximized(hwnd) && ((wParam & 0xFFF0) == SC_RESTORE || (wParam & 0xFFF0) == SC_MOVE)){
return 0;
}
break;
编辑
完整的代码
switch(message){ //handle the messages
...
...
case WM_SYSCOMMAND:
...
break;
....
default: //for messages that we don't deal with
return DefWindowProc(hwnd, message, wParam, lParam);
}
return DefWindowProc(hwnd, message, wParam, lParam);
这是默认的WindowProcedure。我以为这是众所周知的。
valter
valter的回答显示了如何在该阶段拦截用户操作并取消窗口状态更改。然而,这不会直接处理通过Win API进行的状态更改(例如ShowWindow
)。
Windows API为您提供了另一个选项,可以更好地控制窗口状态/位置的更改。它也更灵活:例如,它允许对窗口位置应用应用程序定义的约束。选项是WM_WINDOWPOSCHANGING
消息及其处理程序。窗口接收一个指向结构的指针,该指针可以修改以调整所需的状态和位置。因此,在那里强制最大化状态可以处理更广泛的场景。
在处理此消息时,修改WINDOWPOS中的任何值都会影响窗口的新大小、位置或Z顺序。应用程序可以通过设置或清除WINDOWPOS的标志成员中的适当位来阻止对窗口的更改。
您也可以在Raymond Chen的博客上阅读这条消息:使用WM_WINDOWPOSCHANGING拦截窗口状态更改。
这里还有一些关于SO的问题,这个问题看起来和你的很接近,答案也提供了一个代码片段:检测窗口恢复操作即将开始