CtlColor in RichEdit wird nicht aufgerufen

NMO

Grünschnabel
Hi!

Mir ist aufgefallen, dass die Methode CtlColor in einem CRichEditCtrl oder auc CRichEditView nicht aufgerufen wird. Kann mir einer sagen, warum das so ist und was ich dagegen machen kann
 
WM_CTLCOLOR wird nur für einfache Steuerelemente verwendet, aber nicht bei solchen komplexen Controls, wie dem RichEdit-Control. Dagegen machen kann man nichts, außer vielleicht Windows neu zu programmieren :)
Was willst du denn eigentlich tun? Falls du die Hintergrundfarbe ändern willst: Dafür bringt die Klasse CRichEditCtrl mit Methode "SetBackgroundColor()" mit.

Gruß
MCoder
 
Aha, danke. :)

Ich möchte nicht den ganzen Clientbereich anfärbeln, geht das mit SetBackgroundColor()
 
Mit SetBackgroundColor() kannst du nur den gesamten Clientbereich einfärben. Falls du den Hintergrund abhängig vom angezeigten Text einfärben willst, geht das über EM_SETCHARFORMAT. Hier kleines Beispiel, das die erste Zeile einfärbt:
C++:
m_rtfEdit.SetWindowText(_T("RTF TEST TEST\r\nRTF TEST TEST\r\nRTF TEST TEST"));

CHARFORMAT2  chf;
chf.cbSize      = sizeof(chf);
chf.dwMask      = CFM_BACKCOLOR;
chf.dwEffects   = 0;
chf.crBackColor = RGB(255,255,224);

m_rtfEdit.SetSel(0, 15);
m_rtfEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&chf);
Ansonsten musst du eine eigene Klasse vom CRichEditCtrl ableiten und auf die WM_PAINT bzw. WM_ERASEBKGD Nachrichten reagieren.

Gruß
MCoder
 
Also erstmals vielen Dank, MCoder, für deine Mühe und Geduld. :)
Also ich möchte schon die gesamte Zeile anmalen, deshalb hab ich mir deinen Tip mit EraseBkg und Paint zu Herzen genommen.
Funktioniert auch ganz gut, nur nicht ganz perfekt :). Problem ist nämlich, dass der Caret nicht mehr richtig funktioniert bzw. keine Zeichen mehr auf den Clientbereich ausgegeben werden ( ich verwende überhaupt eine RichEdit-View).
Das ist der gesamte Code, den ich hinzugefügt habe und befindet sich in CRichEditView.
Im Grunde mach ich nichts anderes, als einen Grünen Balken zu malen:

Code:
BOOL CRichEdit2View::OnEraseBkgnd(CDC* pDC)
{
	// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
 
    COLORREF crFgcol = 0, crBgcol = RGB(209,255,176);
    CRect rect;
    GetClientRect(&rect);
    // We double buffer the drawing -

    // preparing the memory CDC
    CDC dc;
    dc.CreateCompatibleDC(pDC);


    // Create GDI and select objects
    CBitmap bmp;
	CPen    pen;
    bmp.CreateCompatibleBitmap( pDC, rect.Width(), rect.Height() );
    pen.CreatePen( PS_SOLID, 1, crFgcol );
    CBitmap *pOldBitmap = dc.SelectObject( &bmp );
    CPen    *pOldPen    = dc.SelectObject( &pen );

 

    // Painting the background
	 dc.FillSolidRect( &rect, RGB(255,255,255) ); // komplett
    CRect rcBar(rect);
    rcBar.top = 100;
	rcBar.bottom = 120;

    dc.FillSolidRect( &rcBar, crBgcol );  // Rand
    dc.MoveTo( rect.right - 1, 0 );

  // dc.LineTo( rect.right - 1, rect.bottom );
    pDC->BitBlt( 0, 0, rect. right, rect.bottom, &dc, 0, 0, SRCCOPY );
    // Aufräumen
    dc.SelectObject( pOldBitmap );

    dc.SelectObject( pOldPen );
    return TRUE;
}

HBRUSH CRichEdit2View::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    pDC->SetBkMode(TRANSPARENT);
    return NULL;
}

void CRichEdit2View::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein.
	// CRichEditView::OnPaint() soll zum Zeichnen von Meldungen nicht aufgerufen werden.
}

MCoder, wäre echt super, wenn du für dieses Problem noch einen Tipp hättest, den könnte ich nämlich dringend gebrauchen. :)
 
Hab gerade selber noch ein wenig experimentiert. Ich denke, beim RichText-Control (oder -View) kommt man beim Überschreiben der Zeichnen-Events recht nachhaltig in Konflikt mit den Ausgaben des Controls selbst.
Ich wüsste jetzt nicht, wie man außer Steuerung der Inhalte (Zeichen- bzw. Absatzformatierung), die Ausgabe beeinflussen kann.

Gruß
MCoder
 
Zurück