我正在尝试创建一个行为类似于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
之前禁用重绘,但不幸的是它没有多大帮助(。
我缺少更好的解决方案吗?
case WM_SYSCOMMAND:
UINT SysCommandCode = wParam & 0xFFF0;
if (SysCommandCode == SC_MAXIMIZE) {
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
break;
此外,建议从窗口样式中删除WS_MAXIMIZEBOX(创建时(。