2017-04-13 77 views
2

我想创建一个窗口,其行为与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之前禁用重新绘制,但不幸的是它没有多大帮助)。

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

+2

为什么不从窗口样式中删除WS_MAXIMIZEBOX? – kobik

+1

无论如何,你的解决方案#2是一个非常糟糕的主意。 – KonstantinL

+2

除了这点之外,* cmd.exe * **可以被最大化(至少在Windows 10上)。 – IInspectable

回答

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

此外,建议从窗口样式(创建时)中删除WS_MAXIMIZEBOX。

+0

完全忽略了WS_MAXIMIZEBOX风格。那就是诀窍。谢谢! – user966939