Zeichnen mit mouse_down event?

Aj2010

Mitglied
hab da nen neuen lösungsansatz. kann man auf einen direkten punkt im bild zugreifen um genau diesen einen in schwarz zu verändern? oder rot oder was auch immer?
 

Spyke

Premium-User
Es gibt beim BItmap die Methode SetPixel.
Oder halt über das Graphics Objekt zeichnen.
 
Zuletzt bearbeitet:

Aj2010

Mitglied
ja, soweit bin ich nun auch schon gekommen ^^ ich geb euch mal die methoden. problem ist, dass der kompiler bei der move methode einfach meine if bedingung ignoriert...

Code:
private: System::Void pictureBox1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
			 if(e->Button == System::Windows::Forms::MouseButtons::Left) {
				mouseDown = true;
					 Color c;
				     int x = e->X + vScrollBar1->Value;
					 int y = e->Y + hScrollBar1->Value;
				 //point->Add(gcnew SchreibKoordinaten(e->X,e->Y));
					 zeichnen->FillRectangle(Brushes::Black, x, y, x, y);
					// pictureBox1->Image = zeichnen;
				 }
		 }
 private: System::Void pictureBox1_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
			  //point[anzahl_gezeichnet]->setKoord(e->X, e->Y);
			  if(mouseDown) {
				 Color c;
				 int x = e->X + vScrollBar1->Value;
				 int y = e->Y + hScrollBar1->Value;
				 //point->Add(gcnew SchreibKoordinaten(e->X,e->Y));
				 zeichnen->FillRectangle(Brushes::Black, x, y, x, y);
				 //pictureBox1->Image = zeichnen;
			  }
			  else {
			  }
		 }
private: System::Void pictureBox1_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
			 if(e->Button == System::Windows::Forms::MouseButtons::Left) {
				if(mouseDown) {
					 Color c;
					//point->Add(gcnew SchreibKoordinaten(e->X,e->Y));
					 int x = e->X + vScrollBar1->Value;
					 int y = e->Y + hScrollBar1->Value;
					 zeichnen->FillRectangle(Brushes::Black, x, y, x, y);
					 pictureBox1->Image = dynamic_cast<Image^>(zeichnen);
					 mouseDown = false;
					 anzahl_gezeichnet++;
				}
			 }
		 }

gibts da ne schnellere Variante?

Hab grad gemerkt, dass wenn ich das Fenster kleiner mache und scrolle, dass er immernoch im Oberen bereich zeichnet, als wenn ich nie gescrollt hätte...

das darf nicht passieren... Weiß dafür jemand ne Lösung?
 
Zuletzt bearbeitet:

Aj2010

Mitglied
Problem gelöst. lag an
Code:
bool^ mouseDown

kann mir denn trotzdem jemand sagen, obs ne schnellere Variante gibt, wie ich in realtime auf dem bild zeichne?
 

Nico Graichen

Erfahrenes Mitglied
2 Punkte:
1. Man kann Beiträge editieren und muss nicht für jeden Satz einen Post erstellen!
2. Hast du den Inhalt der Netiquette vergessen? Wenn ja, bitte nochmal nachlesen! Und dann auch dran halten
 

Spyke

Premium-User
Die SetPixel und GetPixel sind im allgemeinem langsamer, schneller gehts wenn du über das Graphics objekt zeichnest.
 

Aj2010

Mitglied
2 Punkte:
1. Man kann Beiträge editieren und muss nicht für jeden Satz einen Post erstellen!
2. Hast du den Inhalt der Netiquette vergessen? Wenn ja, bitte nochmal nachlesen! Und dann auch dran halten

Ja ok. Entschuldige bitte. Aber was ist die Netiquette?

Spyke, du meinst doch sicher die funktion mit dem FillRectangle, richtig? funktioniert die aktualisierung dann auch direkt per einfügen in die PictureBox? Ich hab ja das Problem ich muss das auch wieder Rückgängig machen können. und da Bietet sich eine PixelMethode an, da ich dann alles einfach in ein Objekt speichern kann und der User es dann wieder Rückgängig machen kann.

Dann hab ich das Problem, wenn das Fenster kleiner ist als das Bild, werden bei mir ja Scrollleisten eingefügt. Die funktionieren auch. Problem ist aber, dass die Koordinaten beim verschieben des Bildausschnittes trotzdem bei 0,0 anfängt. Was das ganze natürlich erschwert...

Ivch hab den Beitrag 23 jetzt mal Editiert. Dort ist der Aktuelle Code für das Zeichnen... Bei dem MouseUp Ereignis ist jetzt einfach das ganze Bild weg... ^^
 
Zuletzt bearbeitet:

Aj2010

Mitglied
neuer Ansatz

So, ich hab mal heute noch ne Runde gesucht und wie erwartet nichts Passendes gefunden. Hab dafür aber einen interessanten Ansatz gefunden, was natürlich die Performance steigert und ich weniger Variablen für die geänderten Pixel brauche.

Zuerst einmal hab ich meinen Code etwas lesbarer gemacht und hab die Methoden abgewandelt.

Ich hab nun eine zweite pictureBox über die erste gelegt. Wenn ein Image in die erste PictureBox gelegt wird, wird in der darüber liegenden eine Leere Bitmap erzeugt, welche die Maaße des Bildes hat.

Soweit so gut. Nun ist das Problem, diese pictureBox muss Durchsichtig sein. Zumindest die Bitmap. Ich will dann auf dieser Bitmap direkt schreiben, da es weit weniger Performance benötigt. Kann mir da jemand nen hinweis geben?

Das mit der pictureBox2->Backcolor eine Transparente Farbe geben klappt nicht.

Die steuering passiert dann auf der pictureBox2