Hi!
Ich weiß es gibt schon ziemlich viele Beiträge zum Thema flackern.
Ich hab mir jetzt auch nicht jeden einzeln genauestens angeschaut, aber ich denke, dass keiner mein Problem dazu lösen könnte...
Also ich hab einen simplen Texteditor mit dem Wizard generiert, indem ich eine Klasse von CEditView abgeleitet habe. An den rechten Rand möchte ich eine Leiste zeichnen, das funktioniert auch schon ganz gut, außer, dass es etwas flackert.
OnPaint sieht folgendermaßen aus:
Code:
OnPaint()
{
int m_bottomline = 1;
CString m_format;
m_format = "%05i";
int m_topmargin = 1; // Current top margin
int m_topline = 0; // Current top line number
CPaintDC dcPaint( this );
COLORREF m_fgcol = 0, m_bgcol = 16318463;
CRect rect;
GetClientRect( &rect );
m_bgcol = RGB(209,255,176);
// We double buffer the drawing -
// preparing the memory CDC
CDC dc;
dc.CreateCompatibleDC( &dcPaint );
int saved = dc.SaveDC();
// Create GDI and select objects
CBitmap bmp;
CPen pen;
bmp.CreateCompatibleBitmap( &dcPaint, rect.Width(), rect.Height() );
pen.CreatePen( PS_SOLID, 1, m_fgcol );
dc.SelectObject( &bmp );
dc.SelectObject( &pen );
// Painting the background
dc.FillSolidRect( &rect, m_bgcol );
dc.MoveTo( rect.right - 1, 0 );
dc.LineTo( rect.right - 1, rect.bottom );
// Setting other attributes
dc.SetTextColor( m_fgcol );
dc.SetBkColor( m_bgcol );
dc.SelectObject( GetParent()->GetFont() );
rect.right = 100;
dcPaint.BitBlt( 0, 0, rect. right, rect.bottom, &dc, 0, 0, SRCCOPY );
CMemDC memDC(&dc, &rect);
//CMemDC pDC(&dc);
CnewceditviewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
dc.RestoreDC( saved );
CWnd:efWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
}
Ich hab außerem noch OnKeyDown überschrieben, weil es sonst gar nicht geht:
Code:
OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
this->InvalidateRect(NULL);
CEditView::OnKeyDown(nChar, nRepCnt, nFlags);
}
Jetzt ist halt das Problem, dass es bei fast jedem Zeilenumbruch flackert.
Ich hab schon probiert OnEraseBkgnd zu überschreiben, das geht nur teilweise, da
der Client-Bereich transpharent wird und es immer noch leicht flackert, wenn ich einen Zeilenumbruch mache.
Ich wäre echt für jeden Vorschlag wahnsinnig dankbar, da ich schon ziemlich viel Zeit in das Problem investiert habe und ich nicht mehr weiter komme.
Überhaupt wünsche ich alle frohe Ostern
Ich weiß es gibt schon ziemlich viele Beiträge zum Thema flackern.
Ich hab mir jetzt auch nicht jeden einzeln genauestens angeschaut, aber ich denke, dass keiner mein Problem dazu lösen könnte...
Also ich hab einen simplen Texteditor mit dem Wizard generiert, indem ich eine Klasse von CEditView abgeleitet habe. An den rechten Rand möchte ich eine Leiste zeichnen, das funktioniert auch schon ganz gut, außer, dass es etwas flackert.
OnPaint sieht folgendermaßen aus:
Code:
OnPaint()
{
int m_bottomline = 1;
CString m_format;
m_format = "%05i";
int m_topmargin = 1; // Current top margin
int m_topline = 0; // Current top line number
CPaintDC dcPaint( this );
COLORREF m_fgcol = 0, m_bgcol = 16318463;
CRect rect;
GetClientRect( &rect );
m_bgcol = RGB(209,255,176);
// We double buffer the drawing -
// preparing the memory CDC
CDC dc;
dc.CreateCompatibleDC( &dcPaint );
int saved = dc.SaveDC();
// Create GDI and select objects
CBitmap bmp;
CPen pen;
bmp.CreateCompatibleBitmap( &dcPaint, rect.Width(), rect.Height() );
pen.CreatePen( PS_SOLID, 1, m_fgcol );
dc.SelectObject( &bmp );
dc.SelectObject( &pen );
// Painting the background
dc.FillSolidRect( &rect, m_bgcol );
dc.MoveTo( rect.right - 1, 0 );
dc.LineTo( rect.right - 1, rect.bottom );
// Setting other attributes
dc.SetTextColor( m_fgcol );
dc.SetBkColor( m_bgcol );
dc.SelectObject( GetParent()->GetFont() );
rect.right = 100;
dcPaint.BitBlt( 0, 0, rect. right, rect.bottom, &dc, 0, 0, SRCCOPY );
CMemDC memDC(&dc, &rect);
//CMemDC pDC(&dc);
CnewceditviewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
dc.RestoreDC( saved );
CWnd:efWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
}
Ich hab außerem noch OnKeyDown überschrieben, weil es sonst gar nicht geht:
Code:
OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
this->InvalidateRect(NULL);
CEditView::OnKeyDown(nChar, nRepCnt, nFlags);
}
Jetzt ist halt das Problem, dass es bei fast jedem Zeilenumbruch flackert.
Ich hab schon probiert OnEraseBkgnd zu überschreiben, das geht nur teilweise, da
der Client-Bereich transpharent wird und es immer noch leicht flackert, wenn ich einen Zeilenumbruch mache.
Ich wäre echt für jeden Vorschlag wahnsinnig dankbar, da ich schon ziemlich viel Zeit in das Problem investiert habe und ich nicht mehr weiter komme.
Überhaupt wünsche ich alle frohe Ostern
Zuletzt bearbeitet: