1

我正在用 C 语言编写窗口管理代码。当设置了某些标志时,我想要一个最大化的窗口,不能通过标题栏拖动窗口来调整其大小。有没有办法将最大化的窗口“锁定”在最大化状态?

4

2 回答 2

2

试试这个

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。我以为是众所周知的。

瓦尔特

于 2014-09-07T09:46:38.140 回答
2

valter 的回答显示了如何在该阶段拦截用户操作并取消窗口状态更改。然而,这不会直接处理通过 Win API 进行的状态更改(例如ShowWindow)。

Windows API 为您提供了另一个选项,可以更好地控制窗口状态/位置的变化。它也更灵活:例如,它允许在窗口位置上应用应用程序定义的约束。选项是WM_WINDOWPOSCHANGING消息,它是处理程序。窗口接收一个指向结构的指针,它可以修改以调整所需的状态和位置。在那里强制最大化状态,因此可以处理更广泛的场景。

在处理此消息时,修改 WINDOWPOS 中的任何值都会影响窗口的新大小、位置或 Z 顺序中的位置。应用程序可以通过设置或清除 WINDOWPOS 的标志成员中的适当位来防止更改窗口。

您还可以在 Raymond Chen 的博客上阅读此消息:使用 WM_WINDOWPOSCHANGING 拦截窗口状态更改

这里也有一些关于 SO 的问题,这个问题看起来很接近你的问题,答案也提供了一个代码片段:检测窗口恢复操作即将开始

于 2014-09-07T12:48:22.307 回答