Fackern bei Bitmap Manipulation verhindern
-
Hallo,
ich zeichne ein Bitmap mit DrawImage in ein Panel. Wenn ich nun das Bitmap bearbeite muß ich es ja danach mit Refresh neu zeichnen. Dabei entsteht ein häßliches Flackern des Bildes.
Wie kann man das vermeiden?Gruß
Steffen
-
-
Danke, aber das bezieht sich alles auf C# und ich arbeite mit Visual C++ 2008 Express.
Wenn ich nach C++ und Double Buffering google find ich nicht viel brauchbares.
In den Eigenschafften meines "form" kann ich die Eigenschaft "DoubleBuffered" auf true setzen, das im Form enthaltene Panel flackert dann aber immer noch.
In den Eigenschaften des Panels wird aber "DoubleBuffered" nicht angezeigt. Wenn ich den Code direkt eingebe (analog zum "form" : this->myImagePanel->DoubleBuffered = true;) bekomme ich den Compilerfehler "Windows::Forms::Control::DoubleBuffered::set": Auf mögliche Funktion(en) kann nicht zugegriffen werden.".
Gruß
Steffen
-
Was in C# geht, geht auch in C++/CLI , beide neutzen das .Net Framework und bei beiden Sprachen sind die Methoden etc. identisch.
Wenn Du jemanden brauchst, der Dir das für C++/CLI vorkaut, musst Du ein wenig warten. (Dough_HH macht sowas z.B. gerne.)
-
@Knuddlbaer Da nützt das warten auch nix mehr, ich kaue nix mehr vor... :p
-
Vielleicht einen kleinen Tip?
MfG Steffen
-
Du musst ein Control *ableiten* und dort das Double-Buffering aktivieren und im dieser abgeleiteten Klassen zeichnen!
-
Jochen Kalmbach schrieb:
Du musst ein Control *ableiten* und dort das Double-Buffering aktivieren und im dieser abgeleiteten Klassen zeichnen!
Ursprünglich zeichte ich mein Bitmap auf ein Panel (btw: sollte ich besser eine PictureBox nehmen).
Nun habe ich versucht ein "doubleBufferedPanel" von Panel abzuleiten.
Ich bin wie folgt vorgegangen:
Projekt->Klasse hinzufügen->Visual C++->C++ Klasse: Hinzufügen.
Klassenname: doubleBufferedPanel, Basisklasse: System::Windows::Forms::Panel
Fertigstellen.Es wir eine doubleBufferedPanel.cpp und eine doubleBufferedPanel.h erstellt (muss ich die jetzt irgendwo mit include einbinden?).
Wenn ich nun die Deklaration meines Panel:
private: System::Windows::Forms::Panel^ testPanel;
durch:
private: System::Windows::Forms::doubleBufferedPanel^ seamPathImagePanel;
ersetze, kommt der Fehler:doubleBufferedPanel: Ist kein Element von 'System::Windows::Forms'
Was mache ich falsch?
MfG Steffen
-
Die Frage ist doch, in welchen Namensraum hast Du doubleBufferedPanel definiert?
Wenn Du da nichts besonderes definiert hast, brauchsr Du kein FQN:private: System::Windows::Forms::doubleBufferedPanel^ seamPathImagePanel;
=>
private: doubleBufferedPanel^ seamPathImagePanel;
-
witte schrieb:
Die Frage ist doch, in welchen Namensraum hast Du doubleBufferedPanel definiert?
Wenn Du da nichts besonderes definiert hast, brauchsr Du kein FQN:private: System::Windows::Forms::doubleBufferedPanel^ seamPathImagePanel;
=>
private: doubleBufferedPanel^ seamPathImagePanel;
Danke, aber das hilft mir irgendwie nicht weiter.
Kann ein FQN denn schaden?
Egal, ich bekommen in jedem Fall die Fehlermeldung, dass "'DoubleBufferdPanel': Ist kein Element von 'System::Windows::Forms' ist.Praktisch alle Beispiele im Internet bzw. der Hilfe-Funktion von Visual C++ beziehen sich bei _diesem_Thema auf c#. Mir fällt es extrem schwer, dass auf c++ umzustricken.
Hat jemand mal ein Beispiel für die Ableitung (umd Verwendung) eines Controls in _c++_
Verzweifelte Grüße
Steffen
-
Ich wollte nur sagen, dass wenn Du eine Klasse aus dem System::Windows::Forms-Namensraum ableitest, diese abgeleitete Klasse nicht automatisch in diesem System::Windows::Forms-Namensraum sich befindet.
Was hast Du denn bis jetzt gebaut?
-
witte schrieb:
Ich wollte nur sagen, dass wenn Du eine Klasse aus dem System::Windows::Forms-Namensraum ableitest, diese abgeleitete Klasse nicht automatisch in diesem System::Windows::Forms-Namensraum sich befindet.
Was hast Du denn bis jetzt gebaut?Also mein "Haupt"-Namensraum (sorry, für die manchmal delitantischen Ansagen, im bin hier noch blutiger Anfänger) heist "SeamPathDemo", jedenfalls steht in meiner Hauptprojektdatei (SeamPathDemo.cpp):
#include "stdafx.h"
#include "Form1.h"using namespace SeamPathDemo;
Inhalt der Datei DoubleBufferdPanel.h
#pragma once
namespace SeamPathDemo
{
ref class DoubleBufferdPanel : public System::Windows::Forms::Panel
{
public: DoubleBufferdPanel(void);
};
}Inhalt der Datei DoubleBufferdPanel.cpp:
#include "StdAfx.h"
#include "DoubleBufferdPanel.h"using namespace SeamPathDemo;
DoubleBufferdPanel::DoubleBufferdPanel(void)
{}
und im Form1.h wollte ich jetzt ein:
private: System::Windows::Forms::Panel
durch ein:
private: System::Windows::Forms::DoubleBufferdPanel
ersetzen.