Autor Beitrag
Rolf1981
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: So 26.02.12 18:12 
Hallo zusammen,

da bin ich mal wieder mit einem (hoffentlich) kleinen Problem. Wäre klasse, wenn es dazu eine einfache Lösung gäbe und mir jemand weiterhilft.
Und zwar wird bei mir mithilfe von OnPaint ein Hintergrund für ein Spiel gezeichnet. Darauf befinden sich nun verschiedene Objekte, die sich bewegen und ebenfalls im OnPaint-Ereignis gezeichnet werden. Leider aber reagiert Form1 auf Mausereignisse wie MouseClick, MouseDown, MouseMove... überhaupt nicht mehr. Kann es daran liegen, dass ich auf Form1 zeichne? Und wenn ja, lässt sich das lösen/umgehen?

Dabke schinmal!

Gruß,

Rolf
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.02.12 18:54 
Am Zeichnen an sich liegt es nicht. Du musst da noch etwas anderes machen.

Ohne ein wenig Code (am besten auf ein kleines Beispielprojekt reduziert oder so) lässt sich da aber nicht viel sagen. :gruebel:
Rolf1981 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: So 04.03.12 19:52 
Hallo,

ok, ich konnte es zumindest eingrenzen. In der OnLoad-Methode des Formulars (Form1) steht folgender Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
pb.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); // Hier wird zu Beginn alles geladen, was für das OnPaint Ereignis wichtig ist
this.Controls.Add(pb);
pb.Width = 10000;
pb.Height = 10000;

Damit wird der Bereich, in welchem dann später die OnPaint-Methode regelmäßig zeichnet oder zeichnen kann, mit 10000x10000 definiert. Somit ist der Bildschirm also immer (mehr als) voll ausgefüllt. Reduziere ich z.B. diesen Bereich testhalber auf 100x100, dann reagiert der Bereich auf Mausklicks, auf dem nicht gezeichnet wird, der also außerhalb dieses Bereichs liegt.

Testhalber habe ich in das OnClick-Ereignis einfach mal geschrieben:
ausblenden C#-Quelltext
1:
2:
3:
4:
public void Form1_Click(object sender, EventArgs e)
{
    Close();
}

Mausklicks und Zeichnen auf diese Fläche geht offenbar nicht gleichzeitig. Das Programm müsste sich also bei einem Mausklick testhalber beenden, was es aber nicht macht.

Danke schonmal für weitere Tipps!

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 04.03.12 20:09 
Hallo Rolf1981,

wenn du eine PictureBox (oder ein anderes Control) auf die Form packst, dann wird ein Form-Click nur noch registriert, wenn du neben das Control auf die Form klickst. Du müßtest dann auch den Klick auf die PictureBox (bzw. andere Control) abonnieren.

Eine PictureBox als Hintergrundbild ist aber keine gute Idee (vor allem wegen der Performance), s.a. [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)
Zeichne besser das Bild direkt im Form.Paint-Ereignis (per DrawImage) - und bei einem großen Bild besser nur den benötigten Ausschnitt.
Rolf1981 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: So 04.03.12 20:22 
Hallo,

danke, aber ich zeichne schon im Form.Paint-Ereignis, genau aus den von dir genannten Gründen.
Das bezieht sich ja dann auf die gesamte Form und Mausklicks werden nicht mehr angenommen. Das ist das Problem...
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 04.03.12 21:01 
Dann mußt du aber auch die PictureBox (pb) komplett entfernen.

Ich glaube nämlich, du hast
ausblenden C#-Quelltext
1:
pb.Paint += new PaintEventHandler(this.Form1_Paint);					

nicht richtig verstanden. Hiermit zeichnest du in der PictureBox (auch wenn du diese Form1_Paint genannt hast - du hättest sie also besser "pb_Paint" nennen sollen).

Oder hast du jetzt doch einen anderen Code verwendet?