Bitmaps ausgeben mit CreateGraphics()
-
Hallo allerseits, absoluter Anfänger erbittet Hilfe:
Ich möchte in meinem Visual C++ Programm Grafikdateien anzeigen und dachte, dies würde am einfachsten mit CreateGraphics() funktionieren - das will aber nicht:
Graphics ^ g; g = this->CreateGraphics(); Bitmap bitmap = gcnew Bitmap("test.jpg"); g->Graphics->DrawImage(bitmap, 10, 10);
Wirft wegen der letzten Zeile einen:
Error C2227: left of '->DrawRectangle' must point to class/struct/union/generic typeEs scheint, als würde normalerweise "PaintEventArgs e" verwendet, um Graphiken in einer Form anzuzeigen, doch ich will - wenn möglich - den Weg über CreateGraphics() gehen, da ich keine Ahnung von Event-Programmierung habe und das ganze auch nur ein kleines Programmierprojekt ist, das einfach nur funktionieren soll.
Dank im Voraus!
-
Zeichnen sollte man nur in OnPaint machen, da es anders selen Sinn macht...
Also Du ziehst z.B: ein Panel auf Dein Fenster und machst einen doppel-Klick darauf... dann wird automatisch eine OnPaint-Methode für dieses Panel erstellt.
Jetzt nur noch folgendes eingeben und fertig:Bitmap^ bmp = gcnew Bitmap("aaa.bmp"); e->Graphics->DrawImage(bmp, 100, 100);
-
Super, das funktioniert! Danke für die schnelle Hilfe.
-
Ich muss zum Thema Graphik nochmals nachfragen - ich verwende nun ein Panel und rufe es mit Hilfe eines Timers innerhalb kurzer Abstände auf:
public: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler( this, &Form1::panel1_Paint); panel1->Invalidate(); } public: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { e->Graphics->DrawImage(rasen, 1, 1); }
Problem 1: Jedes Mal, wenn das Panel aufgerufen wird, löscht es den gesamten Screen - dadurch muss ich jedes Mal alles neu anzeigen lassen, es flickert, ich kann kein bitblt verwenden..
Als einfache Lösung lasse ich eine recht große Hintergrundgrafik weg. Dadurch ist das Flickern mehr oder weniger behoben. Bleibt aber Problem 2: Der CPU-Verbrauch meines kleinen Programms steigt stetig an bis alles blockiert ist (umso mehr DrawImage-Aufrufe ich in die panel1_Paint-Routine stecke, umso schneller). Ich nehme an es liegt an
panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler( this, &Form1::panel1_Paint);
Ich bräuchte also einen anderen Weg, um das Panel aufzurufen.
-
Zuerst solltest Du den "panel->Paint" Event nicht jedesmal beim Timer-Tick registrieren... dies führt zu immer mehr aufrufen Deiner Paint Routine!
Wenn Du wirklich eine "schnöne" Grafik zeichnen willst, solltest Du das Panel (oder Control) ableiten und folgendes machen:
- "Add...|Class|CLR|User Control"Im Konstruktor sollte folgendes gaanz am Anfang stehen:
this->SetStyle(ControlStyles::AllPaintingInWmPaint, true); this->SetStyle(ControlStyles::DoubleBuffer, true); this->SetStyle(ControlStyles::ResizeRedraw, true); this->SetStyle(ControlStyles::UserPaint, true);
Dann kannst Du das "OnPaint" überschreiben:
virtual void OnPaint(System::Windows::Forms::PaintEventArgs ^e) override { // do your painting }
Jetzt ersetzte Du einfach das "Panel" in Deinem Windows-Forms durch Dein eigenes (am einfachsten im Source-Code den Klassennamen ersetzen).