2017-04-13 3 views
2

Ich versuche ein Fenster mit einem ähnlichen Verhalten wie cmd.exe zu erstellen, wobei ich die Maximierung des Fensters nicht unterstützen möchte, da ich nur vollständig sichtbare Textzeilen (vertikal) anzeigen kann. Ich habe bisher mit zwei Lösungen kommen:Blockfenster maximieren die Funktionalität? (Komplett)

Lösung 1:

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

Lösung 2:

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

Leider ist die erstere nur dann wirksam, wenn der Benutzer explizit die Maximieren-Schaltfläche klickt in die Titelleiste oder in einem Kontextmenü. Es wird nicht blockiert, wenn der Benutzer zum Beispiel einfach auf die Titelleiste doppelklickt.

Das Problem mit der letzteren Lösung ist für mich, dass Scrollbars verschwinden, bis Sie das Fenster manuell verändern (durch Ziehen der Seiten). Manchmal kann es auch vorkommen, dass das Fenster blinkt, bevor die Fenstergröße wiederhergestellt wird (ich habe versucht, das Neuzeichnen zu deaktivieren, bevor ich WM_SYSCOMMAND/SC_RESTORE gesendet habe, aber leider hat es nicht viel geholfen).

Gibt es eine bessere Lösung, die ich vermisse?

+2

Warum nicht WS_MAXIMIZBOX aus dem Fenster Stil entfernen? – kobik

+1

Wie auch immer, Ihre Lösung # 2 ist eine sehr schlechte Idee. – KonstantinL

+2

Neben dem Punkt, aber * cmd.exe * ** kann ** maximiert werden (zumindest unter Windows 10). – IInspectable

Antwort

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

Auch wird empfohlen, WS_MAXIMIZEBOX aus dem Windows-Stil (bei der Erstellung) zu entfernen.

+0

Der WS_MAXIMIZEBOX-Stil wurde komplett übersehen. Das hat den Trick gemacht. Vielen Dank! – user966939