【问题标题】:MoveWindow - set minimum width/height?MoveWindow - 设置最小宽度/高度?
【发布时间】:2012-05-27 01:36:11
【问题描述】:

有没有办法强制窗口的最小尺寸(宽度和高度)?

我见过一些应用程序不允许将其窗口大小调整到一个点以下,并且不会闪烁或其他任何东西。此外,如果分辨率低于这些最小值,它们将不允许最大化,而是会自行恢复填充屏幕但从未最大化。

如何做到这一点?

【问题讨论】:

  • 尝试处理 WM_SIZING 并在它即将结束时调整其大小。
  • @chris 请发布一个示例并作为答案?
  • 查看answer
  • 下面是一个完整的对话框示例,它强制执行最小大小等:stackoverflow.com/a/5739620/5987 它使用WM_GETMINMAXINFO

标签: c++ winapi


【解决方案1】:

我自己没有这样做,但这样的事情应该可以工作:

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_SIZING:
        {
            RECT r = *((RECT *)lParam);

            if (r.right - r.left > MAX_WIDTH)
                ((RECT *)lParam)->right = r.left + MAX_WIDTH;

            if (r.bottom - r.top > MAX_HEIGHT)
                ((RECT *)lParam)->bottom = r.top + MAX_HEIGHT;

            break;
        }
    }

    return DefWindowProc (hwnd, msg, wParam, lParam);
}

基本上,如果窗口的矩形超过最大宽度或高度,它会调整它并将其发送出去,因此它不会导致闪烁。再说一次,我从来没有试过这个,所以我不完全确定。

正如 Luke 指出的那样,您可以通过处理 WM_GETMINMAXINFO 来设置默认值而不是重新发明轮子来节省大量工作。

【讨论】:

  • @GRIGORE-TURBODISEL,如果你发布你的调整,我可以更新我的答案,以帮助那些在未来寻找原生 winapi 解决方案的人。
  • 做了几个GetSystemMetrics() 以确保屏幕上有足够的空间来执行这些最低要求。还有一个lpfnWndProc,因为我花了一些时间搜索它,我试图看看最大化窗口时会发生什么。对不起,如果我听起来像个菜鸟,但我正处于桌面编程的第一天。
  • 仅供参考,处理此问题的“正确”技术是WM_GETMINMAXINFO 消息。
  • @Luke,谢谢。我看过这条消息,但我从未真正看过它。看完这篇文章就很清楚了。
【解决方案2】:

您可以使用 GetWindowRect 来检查窗口的大小,如果它比您想要的更大或更小,您可以使用 SetWindowLong 并添加 DS_FIXEDSYS 所以你会阻止窗口的大小

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 2023-01-07
    • 2018-11-08
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多