【问题标题】:Block window maximize functionality? (Completely)阻止窗口最大化功能? (完全地)
【发布时间】:2017-09-09 04:14:33
【问题描述】:

我正在尝试创建一个行为类似于 cmd.exe 的窗口,特别是我不想支持最大化窗口,因为我只显示完全可见的文本行(垂直) .到目前为止,我提出了两种解决方案:

解决方案 1:

case WM_SYSCOMMAND:
            if (wParam == SC_MAXIMIZE) {
                return 0;
            }
            return DefWindowProc(hWnd, message, wParam, lParam);
            break;

解决方案 2:

case WM_SIZE:
        if (wParam == SIZE_MAXIMIZED) {
            SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
            return 0;
        }
        break;

不幸的是,前者仅在用户明确单击标题栏或上下文菜单中的最大化按钮时才有效。例如,如果用户只是双击标题栏,它不会阻止它。

对我来说,后一种解决方案的问题在于它会导致滚动条消失,直到您手动调整窗口大小(通过拖动侧面)。此外,您有时会在窗口大小恢复之前看到窗口闪烁(我确实尝试在发送WM_SYSCOMMAND/SC_RESTORE 之前禁用重绘,但不幸的是它没有太大帮助)。

有没有更好的解决方案我错过了?

【问题讨论】:

  • 为什么不从窗口样式中删除 WS_MAXIMIZEBOX?
  • 无论如何,您的解决方案 #2 是个非常糟糕的主意。
  • 题外话,但cmd.exe 可以最大化(至少在Windows 10上)。

标签: c user-interface winapi


【解决方案1】:
case WM_SYSCOMMAND:
    UINT SysCommandCode = wParam & 0xFFF0;
    if (SysCommandCode == SC_MAXIMIZE) {
        return 0;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
    break;

还建议从 windows 样式中删除 WS_MAXIMIZEBOX(创建时)。

【讨论】:

  • 完全忽略了 WS_MAXIMIZEBOX 样式。那成功了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多