|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 27.09.2003, 11:30 Titel: MFC - Flimmer-Freies Zeichnen |
|
|
Hallo allerseits,
Ich hab' da ein kleines Problem mit Visual C++ 6.0 und MFC.
Ich habe einen Timer, der alle 100 Millisekunden eine MyDraw-Prozedur aufruft, welche das ganze Dialogfeld (ausgenommen das Menü und der Fensterrahmen) "bemalt"!
Dann habe ich die OnPaint-Prozedur so eingerichtet, dass sie bei Bedarf (also wenn das Fenster nicht gerade minimiert ist) zusätzlich die MyDraw-Prozedur aufruft.
Der Fenster-Inhalt wird beim bewegen des Fensters angezeigt (Win XP) und alles wird schön neugezeichnet.
Nun zu meinem Problem:
Wenn ich das Fenster jedoch ein bisschen außerhalb des Bildschirms bewege (Sprich: unter die Taskleiste schiebe. Ich nenne es "In die Farbe eintauchen."), dann gibt es beim herausziehen des Fensters aus diesem Bereich ein unschönes flackern!
Und zwar sieht man, wie für einen kurzen Moment die Standard Hintergrundfarbe erscheint (grau) und anschließend mit der Bitmap übermalt wird.
Wie kann ich dieses Flackern elegant beseitigen, ohne die Systemauslastung überzustrapazieren?
Ich habe schomn ein wenig mit der Funktion OnEraseBkgnd probiert, doch bisher ohne Erfolg.
Entweder fängt mein Computer in extrem an zu stocken, oder es flimmert und man sieht den Bildaufbau!
Ich hoffe ihr könnt mir mit eurem unendlichen Wissen helfen.
p.s. Ich habe schon eine Art BackBuffer. Das heißt meine ganzen Grafikobjekte werden zunächst auf einen MemDC geblittet und anschließen wird dieser MemDC auf den Bildschirm augegeben. |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 27.09.2003, 15:37 Titel: |
|
|
Das Problem ist soweit so gut gelöst!
Hier der Code...
Timer ruft alle 100 Millisekunden diese Prozedur auf:
m_theTetris.MyDraw(&dc);
OnPaint sieht so aus:
Code: | void CTetrisDlg::OnPaint()
{
CPaintDC dc(this); // Gerätekontext für Zeichnen
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Symbol in Client-Rechteck zentrieren
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Symbol zeichnen
dc.DrawIcon(x, y, m_hIcon);
}
else
{
m_theTetris.UpdateFrontBuffer(&dc); //Das Fenster wird aktualisiert!
CDialog::OnPaint();
}
} |
Und OnEraseBkgnd sieht so aus:
Code: | BOOL CTetrisDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE; // Kein Zeichnen der BUTTONFACE-Farbe auf das Fenster nötig!
} |
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|