Frage zu WinAPI WM_MOVE!



  • Hallo,
    wenn man ein Fenster verschiebt, mittels der Titelleiste und dabei an den oberen Bildschirmrand kommt, kann man das Fenster ja in den Vollbildmodus bringen. Da kommt ja diese Animation wobei der rahmen sich auf das ganze Fenster ausbreitet(unter windows 10). Ich hoffe ich konntes verständlich erklären, da dies nicht wirklich meine stärke ist. Wenn ich mein Fenster nicht über die Titelleiste sondern über eine andere weise bewege. Wie kann ich dann den selben effekt provuzieren.

    Hätte zuerst an

    SendMessage(Handle, WM_MOVE, 0, 0);
    

    gedacht, aber das funktioniert so nicht. Kann mir einer eventuell dabei helfen?

    Danke im voraus



  • Auf welche Weise bewegst du denn das Fenster? Der "normale" Weg ist, WM_NCHITTEST abzufangen und ggf. HTCAPTION zurückzugeben.

    Das Verhalten ist dann genau das Gleiche, als wenn man das Fenster über die Titelleiste bewegt.

    Und Vollbildmodus? Das Fenster ist anschließend maximiert, die Titelleiste jedoch noch zu sehen - "Vollbild" würde ich das nicht nennen (oder ich habe dein Problem völlig falsch verstanden...).



  • Ne genau das ist was ich wollte und ich bewege es über MoveWindow().
    Also soll ich praktisch über SendMessage HTCAPTION übergeben und die message WM_NCHITTEST abfangen, also das die WndProc diese nicht weiterleitet, richtig?
    Oder hab ich jetzt alles falsch verstanden?



  • Was ich geschrieben habe, funktioniert natürlich nur, wenn das Fenster mit der Maus bewegt werden soll - das Fenster kann dann über den Client-Bereich gesteuert werden.

    Nur maximieren ist einfach:

    ShowWindow(/*window hande*/,SW_MAXIMIZE);
    

    SW_RESTORE setzt es dann auf die urspüngliche Größe zurück.

    Du bringst also das Fenster per MoveWindow in die Position und kannst es anschließend mit dem Aufruf maximieren. Diese Größenänderung wird "animiert" dargestellt.



  • Okay, jetzt bin ich n bisschen verwirrt.
    Ich schreib mal vereinfach meinen Code.

    while (Linke Maustaste gedrückt)
    {
    MoveWindow(hWnd, x-Position der Maus, y-Position der Maus,  0, 0, true);
    }
    

    Daraus will ich jetzt während des bewegens den selben effekt erzeugen wie bei der titelleiste.
    Was ich bisher verstanden hab ist nur das:

    while (Linke Maustaste gedrückt)
    {
    PostMessage(hWnd, HTCAPTION, 0, 0);
    MoveWindow(hWnd, x-Position der Maus, y-Position der Maus,  0, 0, true);
    }
    

    Ich will ja das das "event" dafür eben von windows kommt, also das ich dies nur auslöse, dass ich nicht selber schreiben muss, wenn die maus oben ist und losgelassen wird, dann mache vollbild.
    Weil wie ich es in den Vollbild modus mache weiß ich, nur eben nicht wie ich den das programm denken lasse ich würde die titelleiste bewegen.

    Und mit vollbild mein ich nicht bden echten ohne Taskleste etc.



  • Du meinst Aero Snap, oder? Das wäre ein Stichwort, mit dem man vielleicht was findet.



  • Hier wollte das auch einer. Aber laut einem Kommentar gibt es keine API für Aero Snap. Der bastelt sich da irgendwas selber hin, was annähernd so aussieht.



  • Sorry für den Dreifachpost.

    Du kannst Windows sagen, dass sich die Maus gerade in der Titelleiste befindet. Wenn du dann die Maus an den oberen Rand ziehst, snappt er so als wenn die Maus wirklich in der Tittelleiste wäre. Entspricht das dem, was du erreichen willst?

    case WM_NCHITTEST:
    {
    	// Füge hier noch ein If ein, damit das HTCAPTION nur dann zurückgegeben wird, wenn du gerade das Fenster bewegst. Ansonsten ruf DefWindowProc auf.
    	return HTCAPTION;
    
    	break;
    }
    


  • Sorry für die späte antwort, dnke das hat mir sehr geholfen, leider nicht beim programm, da ich mit einem Framework arbeite das diese events leider schon vor mir verarbeitet, allerdings hat es mir geholfen das ganze ein bisschen besser zu verstehn.



  • Freut mich, wenn dir wenigstens ein Licht durch meinen Beitrag aufgegangen ist 🙂

    Bietet dir das Framework keine Möglichkeit an, selbst einzugreifen bei bestimmten Fenster-Nachrichten?


Anmelden zum Antworten