Flackern
-
hi,
ich zeichne in eine TreeView eine verschiebbare horizontale Linie. Immer wenn ich die verschiebe, flackert es extrem.
ich habe versucht das ganze mit WM_SETREDRAW zu umgehen, das geht aber nicht:
(das Gerüst der Funktion habe ich aus nem Proj ausm INet)[code]void CPropertyTreeClassView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) { // was das ganze hier so recht zu sagen ist ist mir nicht ganz klar // siehe http://www.mimec.org/articles/mctree NMCUSTOMDRAW* pNMCustomDraw = (NMCUSTOMDRAW*)pNMHDR; NMTVCUSTOMDRAW* pNMTVCustomDraw = (NMTVCUSTOMDRAW*)pNMHDR; switch (pNMCustomDraw->dwDrawStage) { case CDDS_PREPAINT: *pResult = CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: *pResult = CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT; break; case CDDS_ITEMPOSTPAINT: { HTREEITEM hItem = (HTREEITEM)pNMCustomDraw->dwItemSpec; CRect rcItem = pNMCustomDraw->rc; if (rcItem.IsRectEmpty()) { // nothing to paint *pResult = CDRF_DODEFAULT; break; } SendMessage(WM_SETREDRAW, 0); CDC dc; dc.Attach(pNMCustomDraw->hdc); // ---------------------------------------------- // sooooooo, ab hier beginnt der Zeichenspaß :D // ---------------------------------------------- // damit die Line genau im Fenster liegt CRect Rect; GetWindowRect(&Rect); // Rect ist zur Zeit noch in Bildschirm und nicht in Fensterkoordinaten angegeben Rect.bottom -= Rect.top; Rect.top = 0; Rect.left = ColPos-LineWidth; Rect.right = ColPos; // Farbe festlegen CBrush Brush(DisplacePos != 1?DisplaceLineColor:LineColor); // und zeichnen dc.FillRect(&Rect,&Brush); dc.Detach(); SendMessage(WM_SETREDRAW, 1); RedrawWindow(0, 0, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_UPDATENOW); } *pResult = CDRF_DODEFAULT; break; default: *pResult = CDRF_DODEFAULT; } }[/code]das resultiert nämlich nur darin, das die Linie gar nicht (bzw. nur ganz kurz) gezeichnet wird.
spricht, Meister!!

-
Lass bitte den ganzen Quark mit
SendMessage(WM_SETREDRAW, 0);und ganz besonders diesen Code weg:
SendMessage(WM_SETREDRAW, 1); RedrawWindow(0, 0, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_UPDATENOW);Du bist während des Customdraw in der WM_PAINT Routine. Du kannst Dich darin nicht ein erneutes Zeichnen sofort erzwingen und vor allem nach belieben den Redraw ein und ausschalten.
Was hast Du Dir den bei diesem Code gedacht?
-
ESS_CB schrieb:
Immer wenn ich die verschiebe, flackert es extrem.
vieleicht dieses Flackern wegzubekommen??

-
Du malst im Moment direkt auf den Screen. Versuche mal in einen MemDC zu malen und am Ende mit BitBlt den Kram auf den Schirm zu bringen.
Hier ein hint:
http://www.google.de/search?hl=de&q=Offscreen+Drawing+DC+CreateCompatibleDC&meta=
-
Also um so mehr ich mir diesen Code ansehe, umso schlimmer ist er.
Wieso malst Du eigentlich über das rectangle hinaus, dass Du im custom draw angeboten bekommst?
Wieso GetWindowRect? GetClientRect wäre korrekt.Regel: Das Customdraw gibt Dir die Koordinaten in die Du Zeichnen sollst. Es wäre fatal über diese Bereiche hinaus zu zeichnen.
-
@Martin Richter
ESS_CB schrieb:
ich zeichne in eine TreeView eine verschiebbare horizontale Linie.
meinst du nicht dass das eher bescheiden aussieht, wenn diese Linie nur so groß ist wie die aktuellen Items, ach ja ja ja ....

ach übrigens, weißer (!!) Herr, das Flickern ist davon auch noch lange nicht weg!
-
Ich werde wahnsinnig, selbst wenn ich das Linienzeichnen komplett weglasse, und nur die Items neuzeichne flackert es noch. Aber bei nem ListControl flackert doch auch nichts, wenn ich die Reiter verschiebe und trotzdm wandert der TExt mit ??!!!

-
Dann bleibt die Frage was Du in Deinem Mausmove Code machst. Führst Du dort ein Invalidate auf das ganze Fenster durch? Dann würde es mich nicht wundern, dass es flackert.
-
ok, hat sich.
thx wenn ich nur die entsprechenden Bereiche invalidate() gehts außreichend gut.