Entwickler-Ecke

WinForms - Windows Forms: Wie male ich etwas in den MDI-Clientbereich?


hydemarie - Di 26.06.18 10:33
Titel: Windows Forms: Wie male ich etwas in den MDI-Clientbereich?
Mal was ganz Neues: Ich mache was mit C#. :D

Ich würde gern eine kleine Desktopanwendung mit Windows Forms schreiben (beziehungsweise: bin schon recht weit gekommen), die auf der MDI-Technik basiert. (Hintergrund: Es wird eine Art Texteditor mit frei schwebenden Fenstern. SDI und 'ne Tableiste wären da kontraproduktiv.) Während das Auf- und Zumachen von Clientfenstern kein großes Problem darstellt, wofür ich C# einfach mal loben möchte - mein erster Entwurf in Delphi hat mehr Code für den gleichen Effekt gebraucht, vielleicht bin ich aber auch einfach nur kacke in Delphi -, stellt mich ein technisch eigentlich gar nicht relevantes Thema noch vor ein Rätsel:

Ich wäre gern in der Lage, im Clientbereich des MDI-Fensters mit der Maus ein Rechteck zu malen. Also:


Quelltext
1:
2:
3:
4:
5:
6:
+----[ Titelleiste ]--------------------[_][X]
+--------------------------------------------+
|                                            |
| [ Clientbereich ]                          |
|                                            |
+--------------------------------------------+


Bei Rechtsklick setze ich X, Y und "isDragging". So lange "isDragging" == true, soll bei jeder Mausbewegung ein Rechteck gemalt werden. Ich möchte also sozusagen das mit der Maus "aufgezogene" Rechteck visualisieren.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
{
    // Anders als StartX und StartY, die beim Rechtsklick
    // gesetzt wurden, sind TargetX und TargetY so lange
    // veränderbar, bis die Maus aufhört, sich zu bewegen.
    if (isDragging) {
        iTargetX = e.X;
        iTargetY = e.Y;

        // TODO:
        // Male Rechteck von iStartX/iStartY zu iTargetX/iTargetY,
        // ersetze dabei das vorherige Rechteck.
    }
}


Vermutlich muss ich irgendwas mit einem CPen machen, aber wie kriege ich das so hin, dass das nicht stehen bleibt, sondern mit jedem MouseMove neu gezeichnet wird?


Th69 - Di 26.06.18 12:13

Hallo,

Stichwort: Paint-Ereignis, s. z.B. meine Antwort unter Zeichenbereich eines Panels, "Animation" von Kreisen [https://www.entwickler-ecke.de/viewtopic.php?p=711974#711974] (bes. der Link).


hydemarie - Di 26.06.18 12:29

Hmm, ich hab' ja kein Panel. Aber der Link hilft mir schon weiter, danke...


Th69 - Di 26.06.18 14:21

Geht es dir um den Clientbereich des Hauptfensters oder um eines der MDI-Childfenster?

Für ersteres s. Have fun with the MDI client area [https://www.codeproject.com/Articles/28268/Have-fun-with-the-MDI-client-area] (s.a. MdiClient [https://msdn.microsoft.com/de-de/library/system.windows.forms.mdiclient(v=vs.110).aspx]) und ansonsten hast du ja eine Form-Instanz des MDI-Childfensters (s.a. MdiChildren [https://msdn.microsoft.com/de-de/library/system.windows.forms.mdiclient.mdichildren(v=vs.110).aspx]).

Ob Panel oder Form ist egal, hauptsache es ist ein Control, dann hat es auch das Paint-Ereignis (auch wenn nicht alle Windows-Controls dieses unterstützen).


hydemarie - Di 26.06.18 14:51

Es geht tatsächlich um den Clientbereich des Hauptfensters. Ich möchte sozusagen neue Clientfenster in das Hauptfenster "malen" können, statt sie bloß "zu erstellen", etwa so wie im Anhang. Sinn: Sobald ich die Maus loslasse, soll da, wo der "Vorschaurahmen" ist, das neue ClientWindow erscheinen ... :)

Ich komme erst übermorgen dazu, wieder etwas am Code zu machen, aber ich bin auf jeden Fall sehr dankbar für deine Tipps.


Delete - Do 28.06.18 10:08

- Nachträglich durch die Entwickler-Ecke gelöscht -


hydemarie - Do 28.06.18 11:43

Weder noch! :) Ich möchte tatsächlich nur einen Rahmen darstellen, um den Bereich zwischen "hier wurde die Maus gedrückt" und "hier ist die Maus gerade" rechteckig darzustellen. Beim Loslassen soll der Rahmen verschwinden und durch ein MDI-Fenster ersetzt werden.


Ralf Jansen - Do 28.06.18 14:43

Beispielprojekt im Anhang


hydemarie - Do 28.06.18 16:57

:shock:

Genau das wollte ich programmieren! Danke, Ralf!