Warum flimmert es? :-(
-
Hallo,
ich hab ein Programm bei dem ich im Hauptfenster bei jedem Mausmove ein Rechteck an verschiedene Positionen schieben will, je nachdem wo sich der Mousecursor grade befindet.
Ich machs bisher so:in mousemove: Koordinaten setzten, Invalidate Rect aufrufen für die bereiche die nicht mehr gültig sind.
in ondraw: Zeichnen des Bildes und des neupositionierten Rechtecks.
Aber leider flimmert das ganze wie der Wahnsinn
und irgendwann wird sogar ne unaufgefangene Exception ausgelöst und das Fenster bleibt nur noch weiss
.Was muß ich denn ändern damit es nicht mehr flimmert?
-
hi!
Daran ist InvalidteRrct schuld. ließ dein Rechteck einfach in dein Speicer ein.
Erstell einfach eine Membervariable CDC* und mit PatBlt solltete es fuzten
mfg *mike*
-
Ich hab das gleiche Problem, nur das bei mir über den Bildschirm verstreut mehrere Teile neu gezeichnet werden müssen.
Weiß jemand wie man da das flimmern herausbekommt ?
-
Rechtsklick auf den Desktop -> Eigenschaften -> Effekte -> Disable Fensterinhalt beim Ziehen anzeigen

[ Dieser Beitrag wurde am 24.09.2002 um 08:12 Uhr von toosten editiert. ]
-
Ihr dürft nicht direkt auf den Bildschirm zeichnen.
Ich geb euch mal nen CodeSchnipsel:void CCBTestView::OnDraw(CDC* pDC) { CCBTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); RECT r; CDC memDC; CBitmap bmp; CBitmap* bmpOld; GetClientRect(&r); memDC.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC,r.right,r.bottom); bmpOld=memDC.SelectObject(&bmp); { RECT r2(r); --r2.left; ++r2.right; --r2.top; ++r2.bottom; memDC.Rectangle(&r2); } // Hier in das memDC reinzeichnen CPetrinetView::OnDraw(&memDC); pDC->BitBlt(0,0,r.right,r.bottom,&memDC,0,0,SRCCOPY); memDC.SelectObject(bmpOld); } BOOL CCBTestView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return true; //return CPetrinetView::OnEraseBkgnd(pDC); }
-
Hi Nemesyzz,
Dein Code funzt supa.
Wie läuft das ganze aber bei einer dialogfeldbasierten Anwendung ?
-
Da kommt der Code einfach in die OnPaint funktion.
Beispiel(einfügen eines Hintergrundbildes):
void CGameDlg::OnPaint() { CPaintDC dc(this); CPaintDC* pDC = &dc; BITMAP bmBackground; bmBackground.GetObject(sizeof(bmBackground),&bmBackground); //Größe und Adresse von Hintergrund --> BITMAP bm CDC memDC; memDC.CreateCompatibleDC(pDC); //SpeicherDC initialisieren memDC.SelectObject(&Bild[0]); //Hintergrundbild --> Speicher RECT Rect; GetClientRect(&Rect); pDC->StretchBlt(0,0,Rect.right,Rect.bottom,&memDC,0,0, bmBackground.bmWidth,bmBackground.bmHeight,SRCCOPY); CDialog::OnPaint(); }damit sollte es funktionieren.
ndT Wolf