RichEdit (Hintergrund Zeichnen) Zeilen herforheben



  • Hall, ich versuche zZ gerade in einem RichEdit Steuerelement den Hintergrund neu zu zeichnen, indem ich die Zeilenhöhe (wie auf eine Blatt Papier) zeichne.

    allerdings klappt das nicht so ganz. denn sobald ich in der nachrichtenschleife des RichEdit WM_PAINT abfange und anfange zu Zeichnen, wird das Steuerelement transparent, und nimmt nur bedingt tastaturbefehle an.

    kann mir da jemand helfen?

    hier noch der code den ich verwende.

    case WM_PAINT:
    {
    	PAINTSTRUCT  ps ;
    	HDC hDc = BeginPaint(hWnd, &ps);
    
    	TEXTMETRIC tm ;
    	GetTextMetrics (hDc, &tm) ;
    	long lLineHeigth 	= tm.tmHeight + tm.tmExternalLeading ;		//Zwischenzeilenhöhe ermitteln
    
    	HGDIOBJ hPen = NULL;
    
    	LOGBRUSH lb; 
    	lb.lbColor	= COLORREF_LIGHTGREY;
    	lb.lbStyle	= BS_SOLID;
    	lb.lbHatch	= HS_HORIZONTAL;
    
    	hPen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID, 1, &lb, 0, NULL); 
    
    	HGDIOBJ hPenOld = SelectObject(hDc, hPen); 
    
    	MoveToEx(hDc, ps.rcPaint.left,  ps.rcPaint.top + lLineHeigth, NULL); 
    	LineTo(hDc, ps.rcPaint.right,  ps.rcPaint.top + lLineHeigth);
    
    	//----------------------------------------------------------------------------------------------------
    	//										Aufräumen
    
    	DeleteObject(SelectObject(hDc, hPenOld)); 
    
    	EndPaint(hWnd, &ps);
    }
    break;
    


  • Ich glaube Du hast den Sinn eines RIchEdit Controls noch nicht so ganz verstanden, oder?



  • 😕 Textverarbeitung 😕


  • Mod

    Man kann eigentlich WM_PAINT nicht subclassen!
    Dadurch wird der Paint DC manipuliert. Und so schon gar nicht. Du müsstest ja dem Control die Möglichkeit geben sich selbst zu zeichnen.
    Außerdem ist ein RTF COntrol mehrzeilig. Wo berücksichtigst Du das?



  • Außerdem ist ein RTF COntrol mehrzeilig. Wo berücksichtigst Du das

    du meinst weil ich blos eine Linie zeichne? vorerst überhaupt nicht 😉

    gibt es auch wo anderst keine möglickeit die linien hinzuzufügen?
    WM_CREATE, WM_SIZE ...



  • Du könntest per CreateCompatibleDC ein Device Context bekommen, dort ein HBITMAP reinladen, dann mit WM_PRINT dem RichEdit-Control sagen, dass es in dein DC reinmalen soll, danach noch Linien drübermalen und am Ende das ganze irgendwo hin blitten.



  • und am Ende das ganze irgendwo hin blitten

    danke erstmal für den gedankenhinweis 👍

    aber das ist komplettes neuland für mich, was du da beschreibst.
    kannst du das ende mal ein wenig genauer beschreiben 🙄
    und was meinst du mit blitten 😕



  • Mit blitten meine ich die Funktion BitBlt benutzen.

    Sowas in der Richtung:

    case WM_CREATE:
    	HWND richeditcontrol = CreateWindow(_T("RICHEDIT"), ...
    
    //bitmap erzeugen in das gemalt wird
    case WM_SIZE:
    	HDC hdc = GetDC(hwnd);
    	HBITMAP bitmap = CreateCompatibleBitmap(hdc, LOWORD(lParam), HIWORD(lParam));
    	ReleaseDC(hdc);
    
    //richedit control in das bitmap malen lassen
    case WM_PAINT:
    	HDC hdc = BeginPaint(hwnd, &ps);
    	HDC cdc = CreateCompatibleDC(hdc);
    	SelectObject(cdc, bitmap);
    	SendMessage(richeditcontrol, WM_PAINT, (WPARAM)cdc, PRF_CLIENT | PRF_ERASEBKGND);
    //linie malen
    	POINT p[2];
    	p[0].x = 0;
    	p[1].x = xsize;
    	p[0].y = p[1].y = 10;
    	PolyLine(cdc, p, 2);
    //ergebnis in das angezeigte Fenster malen
    	BitBlt(hdc, x, y, xsize, ysize, cdc, 0, 0, xsize, ysize, SRCCOPY);
    	endpaint(hdc, &ps);
    

    Das zeigt erstmal nur die Grundidee. Die Variablen bitmap und richeditcontrol müssen natürlich irgendwie statisch sein, damit man sie später in WM_PAINT benutzen kann.
    Wahrscheinlich willst du noch andere Parameter bei Zeile 13 einstellen, damit ChildWindows mit gemalt werden. PolyLine in Zeile 19 funktioniert nur, wenn du vorher einen Pen (oder war es Brush?) per SelectObject(cdc, bla); einlädst, am besten DC_PEN und dann mit SetDCPenColor die Farbe festlegst, das steht aber in der Doku.



  • In Zeile 15 muss natürlich WM_PRINT geschickt werden, nicht WM_PAINT.



  • Warum willst Du überhaupt was zeichnen??? Du hast doch ein *Rich* Edit Control??? Fülle es entsprechend, dann solltest Du doch auch dort alles machen können...


  • Mod

    Ich kann mich Jochen nur anschließen.
    Zudem wird hier immer alles bei jeder kleinen Änderung gerendert...


Anmelden zum Antworten