WM_SIZE eines Dialogfensters behandeln
-
Hallo,
wenn ich habe in meinem Dialogfenster auf die Minimze-Schaltfläche klicke, wird es minimiert, analog wenn ich die Restore-Schaltfläche betätige wird es wiederhergestellt. Ich würde es nun gerne so realisieren, daß wenn die Minimze-Schaltfläche betätigt wird das Fenster nur soweit verkleinert wird, daß es die Größe des darinbefindlichen Buttons annnimmt, den Button verschiebe ich in die linke obere Clientarea und man kann bei sehr kleinem Dialogfenster dann immer noch den Button benutzen. Wenn man nun die Restore-Schaltfläche betätigt soll der Dialog wieder seine ursprüngliche Größe erhalten. Ich habe jetzt versucht im Eventhandler des Dialogs die Nachricht WM_SIZE zu behandeln, die Ereignisse SIZE_MINIMIZED und SIZE_RESTORED treten auch ein, jedoch kann ich die Größe des Fensters nicht beeinflussen. Testhalber hab ich das mal so gemacht:case WM_SIZE: if(wParam == SIZE_MINIMIZED){ MoveWindow(hWnd, 0, 0, 200, 50, TRUE); } return 0;Der einzige Effekt den ich feststellen konnte war, daß das minimierte Fenster nun nicht mehr links unten sondern links oben dargestellt wurde, also ist MoveWindow ja irgendwie behandelt worden. Was mache ich falsch oder vielmehr wie geht es richtig, vieleicht habe ich ja über WM_SIZE ja den falschen Ansatz gewählt, jedoch fällt mir keine andere Möglichkeit ein.
-
Behandle WM_SYSCOMMAND! Leite die Nachricht nicht weiter und mach was Du gerne möchtest...
-
Ich habe mal ein MFC-Test-Projekt aufgemcacht und ein wenig 'rumprobiert. So klappt es halbwegs (kannst du ja einfach auf WinAPI umsetzen):
void CTestPreventMinimizeDlg::OnSize(UINT nType, int cx, int cy) { if(nType==SIZE_MINIMIZED) { ShowWindow(SW_RESTORE); SetWindowPos(&wndTop,0,0,100,80,SWP_SHOWWINDOW); }else { CDialog::OnSize(nType, cx, cy); } }Allerdings wird das Fenster minimiert und direkt im Anschluss wiederhergestellt. Nicht so optimal...
EDIT: Ok, Martins Vorschlag hört sich dann doch besser an...

-
Yo danke erstmal an alle.
@Martin hier mein Code:case WM_SYSCOMMAND: if((wParam & 0xFFF0) == SC_MINIMIZE){ MoveWindow(hWnd, 10, 10, 100, 50, TRUE); return 1; } break;das Fenster hat nun die Größe und Position wie es sein soll, leider hat nun die Minimizeschaltfläche nicht in die Restoreschaltfläche gewechstelt (was ja durch das "return 1;" zu erwarten war), und ich kann mein Fenster nicht mehr in die Originalgröße versetzten, wie kann ich "manuell" den Wechsel der Schaltfläche einleiten?
-
Wenn das Fenster wirklich minimiert ist, hat es ja auch keine "Restore-Schaltfläche", wie sollte man die auch sehen?

Vielleicht solltest du einfach die Minimieren-Schaltfläche doppelt missbrauchen und ebenfalls zum Wiederherstellen verwenden (wenn "minimiert" dann wiederherstellen und umgekehrt). Finde ich vertretbar.
-
_matze schrieb:
Wenn das Fenster wirklich minimiert ist, hat es ja auch keine "Restore-Schaltfläche", wie sollte man die auch sehen?

Es ist ja ein Dialogfenster und der Dialog wird beim minimieren im Hauptfenster in die linke untere Ecke verkleinert, hat aber noch Überschrift und Restorschaltfläche, aber nicht wenn ich den Code so benutze wie ich ihn gepostet habe, da bleibt die Minimierenschaltfläche erhalten, normalerweise wird sie gegn die Restoreschaltfläche ausgetauscht. Wenn mir nichts besseres einfällt muss ich eben eine globale Variabele abwechselnd auf 0 und 1 setzten und so die Minimierenschaltfläche für beide Funktionen gebrauchen. Diese Lösung erscheint mir aber wenig professionel. Also irgenwie wird doch der Austausch durchgeführt, das kann doch nicht so shwer sein?
-
Du kannst ja den Stil WS_MINIMIZEBOX entfernen...
-
Martin Richter schrieb:
Du kannst ja den Stil WS_MINIMIZEBOX entfernen...
Ja das kann ich, aber wie erhalte ich dann an der Stelle die Restoreschaltfläche?
-
Du musst ganz sicher keine globale Variable dafür verwenden!
-
hustbaer schrieb:
Du musst ganz sicher keine globale Variable dafür verwenden!
Das mag sein, kannst du mir auch eine Lösungen für mein Problem angeben?
Z.Z hab ich es so realisiert, das ich sowohl die Minimize als auch die Maximize Schlatfläche "Zweckentfremde", die Minimizeschaltfläche verkleinert mir den Dialog soweit das nur der Button noch sichtbar ist, die Maximizeschlatfläche stellt den Dialog wieder her. Als globale Variable habe ich nun widht = Breite des Dialogs, height = Höhe des Dialogs, jeweils für meine restorfunktion, und minimize_toggle als boolean damit die Funktionen nicht doppelt hintereinander ausgeführt werden.
-
Statt einer globalen solltest du lieber eine Membervariable verwenden.
-
Ja das meinte ich.
Und wenn du kein "Dialog-Objekt" hat dessen Membervariablen du verwenden könntest, dann kannst du es so machen wie es für WinAPI Programme vorgesehen ist, nämlich mit Set/GetWindowLong. Das ist etwas mehr Aufwand, vor allem wenn du dialoge mit der "DIALOG" window class verwendest, oder anders gesagt: wenn du nicht schon eine eigenen window class verwendest.
-
Ok Leute ich schreib mein ganzes Programm in C und Winapi ich weiß jetzt nicht ob ihr von C++ redet oder ob ich da generell ein Wissensdefizit habe. Aber der Dialog wurde mit dem Resoucenedito erstellt und der hat halt einen Eventhandler, wenn ich jetz noch Elemente des Dialogs subclasen muss um das richtig zu machen solls mir auch recht sein, also Aufwand ist jetzt nicht unbedingt die Hürde sondern ehr fehlende Kenntnisse, wie ich ansetzen muss.