Cstatic Ausgabe flackert
-
Ich habe eine CStatic Klasse abgeleitet, so dass ich in das Fenster Daten Plotten kann. Genauergesagt plotte ich Matrizen, bzw. den Farbwert an (x,y). Das mache ich über zwei for-Schleifen. Dabei flackert allerdings der Bildschirm deutlich.
Ich würde daher viel lieber die Farbinformationen in ein Bild schreiben, dass dann im ganzen auf den Bildschirm gebracht wird.
Wie macht man das ?
Matthias
-
Du brauchst einen MemDC, in den Renderst du die Daten und blittest dann das Ergebnis dann in dein Steuerelement.
Mit CreateCompatibleDC kriegst du so einen DC. Irgendwo im FAQ ist da glaube auch ein Artikel dazu
-
Ich habe es ausprobiert mit folgendem Code - der mir allerdings nur nichts anzeigt:
void CGraphCtrl::OnPaint() { CPaintDC dc(this); // device context for painting CRect rc; GetClientRect(rc); CDC* pDCMem; pDCMem = new CDC; pDCMem->CreateCompatibleDC(&dc); [...] pDCMem->SetPixel(ix,iy,c); [...] dc.BitBlt(0,0,rc.Width(),rc.Height(),pDCMem,0,0,SRCCOPY); delete pDCMem; }was ist daran jetzt falsch ?
Matthias
-
Verwende doch einfaqch CMemDC aus www.codeproject.com das ist IMHO einfacher und vor Allem funktioniert es.
Vergiss bitte nicht einen WM_ERASEBKGND Handler einzubauen.
-
Martin Richter schrieb:
Verwende doch einfaqch CMemDC aus www.codeproject.com das ist IMHO einfacher und vor Allem funktioniert es.
Vergiss bitte nicht einen WM_ERASEBKGND Handler einzubauen.Dazu habe ich diesen Artikel gefunden:
http://www.codeproject.com/vcpp/gdiplus/what_is_a_basename_.aspAber wie zeichne ich den dann, und mit welchem dc ? Genau der Punkt fehlt in dem Beispiel, zumindest sehe ich ihn nicht.
Matthias
-
schau mal in der MSDN nach CDC::CreateCompatibleDC da gibts ein Code-Beispiel, evtl hilft dir das

-
pospiech schrieb:
Dazu habe ich diesen Artikel gefunden:
http://www.codeproject.com/vcpp/gdiplus/what_is_a_basename_.aspAber wie zeichne ich den dann, und mit welchem dc ? Genau der Punkt fehlt in dem Beispiel, zumindest sehe ich ihn nicht.
Also wenn ich nach CMemDC suche finde ich das:
http://www.codeproject.com/gdi/flickerfree.aspUnd die Nutzung ist auch in dem Beispiel drin:
void CExampleView::OnDraw(CDC* dc) { CMemDC pDC(dc);Und ob nun OnDraw oder OnPaint spielt hier nun auch keine Rolle!
-
Martin Richter schrieb:
Also wenn ich nach CMemDC suche finde ich das:
http://www.codeproject.com/gdi/flickerfree.aspUnd die Nutzung ist auch in dem Beispiel drin:
void CExampleView::OnDraw(CDC* dc) { CMemDC pDC(dc);Danke für den Hinweis. Allerdings funktioniert die zip Datei nicht, da sie fehlerhaft ist.
Mit folgendem Code
void CGraphCtrl::OnPaint() CPaintDC dc(this); // device context for painting CRect rc; GetClientRect(rc); CMemDC pDC(&dc, &rc);funktioniert es jetzt.
Allerdings ist das flackern noch nicht vollständig verschwunden.
Es blitzt bei jedem repaint einmal hell auf, und dass dann mehrmals (~5 Hz) pro Sekunde.Woran könnte das noch liegen?
Der komplette Code von OnPaint ist dabei folgender
void CGraphCtrl::OnPaint() { CPaintDC dc(this); // device context for painting CRect rc; GetClientRect(rc); CMemDC pDC(&dc, &rc); double value; if ((m_PixelNumberX>0) && (m_PixelNumberY > 0)) { for (int ix=0; ix <= m_PixelNumberX; ix++) { for (int iy=0; iy <= m_PixelNumberY; iy++) { CPoint p; COLORREF c=0; // Set Value to Scale 0..1 value=PlotData[ix][iy]/MaxValue; if (value<0){value=0;} // Set Color According to settings c=RGB((BYTE)(value*255),(BYTE)(value*255),(BYTE)(value*255)); pDC.SetPixel(getX(ix),getY(iy),c); } } } }Matthias
-
Ich tippe mal darauf, dass Du einfach nicht liest was in dem Artikel geschrieben steht.
Hast Du einen WM_ERASEBKGND Handler eingebaut der TRUE returniert?
-
Martin Richter schrieb:
Ich tippe mal darauf, dass Du einfach nicht liest was in dem Artikel geschrieben steht.
Hast Du einen WM_ERASEBKGND Handler eingebaut der TRUE returniert?Du meinst folgendes ?
BOOL CGraphCtrl::OnEraseBkgnd(CDC* pDC) { return FALSE; //return CStatic::OnEraseBkgnd(pDC); }Wobei im nächsten Artikel
http://www.codeproject.com/vcpp/gdiplus/what_is_a_basename_.aspwieder genau das Gegenteil steht, nämlich dass man TRUE zurückgeben sollte.
Wobei beides bei mir keinen sichtbaren Unterschied macht.Matthias