Kästchen "hinter" vorhandene Schrift malen?!

Ravebaby

Erfahrenes Mitglied
Kästchen in den Hintergrund einer vorhandenen Schrift malen?!

Hallo,

ich habe eine Liste von Wörtern. Sobald man mit der Maus über die Wörter fährt, sollen diese markiert sein. Bisher geschieht dies durch einen Rahmen der sich um das Wort legt. Und zwar benutze ich dafür ein Rectangle mit einem durchsichtigen Brush, da sich sonst das Rectangle über die Schrift legen und diese verdecken würde. Mein Code dazu:
Code:
LOGBRUSH logBrush;
logBrush.lbStyle = BS_HOLLOW;  //transparent
CBrush brush;
brush.CreateBrushIndirect(&logBrush);
pDC->SelectObject(brush);
pDC->Rectangle(xRectangle, yInc - 19, widthRectangle, yInc);
Nun möchte ich jedoch nicht nur einen Rahmen um das ausgewählte Wort zeichnen, sondern es komplett mit einer Farbe hinterlegen. Wie kann ich das tun? Sobald ich eine Farbe für das Rectangle wähle überdeckt es meine Schrift...
Gibt es da vielleicht einen "Hintergrundmodus"?!

Vielen Dank für jede Hilfe

Grüße Rave
 
Zuletzt bearbeitet:
Wie bringst du denn die Wörter auf's Fenster, mittels Textausgabefunktionen (GDI) oder in einem Static-Control? Im ersteren Fall zeichne erst das farbige Rechteck und darüber noch mal den Text und im zweiten Fall setze die Hintergrundfarbe des Controls (via WM_CTLCOLOR).
 
man, man, man... ist ein riesen Codewulst geworden. Und der Stift tut einfach nicht so, wie ich es will...

Also ich male erstmal ein Rechteck über den selektierten Ordner...
Code:
CDC* pDC = this->GetDC();
CBrush darkBrush;
darkBrush.CreateSolidBrush(RGB(0,0,100));
pDC->SelectObject(darkBrush);
pDC->Rectangle(xStartBorder, yInc - 19, xEndBorder, yInc);
darkBrush.DeleteObject();

Dann möcht ich den Namen in weißer Schrift wieder über das dunkle Rechteck malen, was leider nicht funktioniert. Er zeigt einfach nichts an. Die Variable die ich ausgebe enthält jedoch den richtigen Wert:
Code:
HPEN pen = CreatePen(PS_SOLID, 2, RGB(0, 255, 255)); 
pDC->SelectObject(pen); 
CRect rect;
rect.left = xStartBorder;
rect.top = yInc - 19;
rect.right = xEndBorder;
rect.bottom = yInc;
pDC->DrawText(filename, &rect, 0);

Komischerweise klappt das mit dem weißen Stift, wenn ich das zuvor selektierte Objekt wieder deselektiere:
Code:
// delete the last rectangle
// with a white pen for the border of the rectangle
HPEN whitePen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255)); 
pDC->SelectObject(whitePen); 
CBrush lightBrush;
//and a white filling of the rectangle
lightBrush.CreateSolidBrush(RGB(255,255,255));
pDC->SelectObject(lightBrush);
pDC->Rectangle(m_xStartBorderMemo, m_yIncMemo - 19, m_xEndBorderMemo, m_yIncMemo);
lightBrush.DeleteObject();

Wieso klappt es hier, nicht aber bei der Ausgabe des Dateinamens?! :confused:
 
Mit was für einem Font arbeitest du denn? Mit dem Pen kann man zeichnen, aber keinen Text ausgeben. Mache doch einfach folgendes:
Code:
pDC->SetTextColor(RGB(255,255,255));
Dann sollte die Schrift in weiß erscheinen. Allerdings mußt du dann mit
Code:
pDC->SetBkMode(TRANSPARENT);
den Hintergrund schützen oder die Hintergrundfarbe des Textes anpassen.

Mfg

langer
 
Was den Text betrifft, folge bitte der Antwort von langer1801.

Noch ein paar Anmerkungen:

1. Wenn du schon mit der MFC arbeitest, solltest du auch versuchen, durchgängig mit MFC-Klassen zu arbeiten. Also anstatt HPEN besser die Klasse CPen verwenden.

2. Jeden GDI-Typ (Brush, Font, Pen etc.), den du mit SelectObject() auswählst, musst du Ende wieder restaurieren. Man speichert das ursprüngliche Object ( pOld... ) und wählt es am Ende wieder aus.

3. Zu jedem GetDC() gehört ein ReleaseDC().

Der nachfolgende Code beinhaltet das eben Geschriebene.
Falls er funktioniert, stammt er von mir, ansonsten weiß ich nicht, wer ihn geschrieben hat. ;)

Code:
CDC* pDC = GetDC();

//  Rechteck zeichnen

CBrush darkBrush(RGB(0,0,100));
CPen   penFrame(PS_SOLID, 2, RGB(255, 255, 255))
CBrush *pOldBrush = pDC->SelectObject(&darkBrush);
CPen   *pOldPen   = pDC->SelectObject(&penFrame);

pDC->Rectangle(xStartBorder, yInc - 19, xEndBorder, yInc);

// Text ausgeben

pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));

// TODO - Evtl. Font setzen

CRect rect;
rect.left   = xStartBorder;
rect.top    = yInc - 19;
rect.right  = xEndBorder;
rect.bottom = yInc;

pDC->DrawText(filename, &rect, 0);

// Aufräumen

pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);

ReleaseDC(pDC);
 
Noch eine Anmerkung:
Normalerweise werden alle Zeichenausgaben in der Routine OnDraw erledigt. Wenn das bei dir nicht so ist, dann vergiß die nächsten Zeilen.
Aber die Funktion OnDraw übergibt einen Zeiger auf der DC (OnDraw(CDC *pDC);).
dann brauchst du auch keinen neuen Zeiger, den du dir mit
Code:
 CDC* pDC = this->GetDC();
geholt hast. Ich hatte gestern dasselbe Problem, aber nur, weil ich durch einen Denkfehler auf eine falsche Fährte gelockt wurde. Auch ich hatte mir mit GetDC() einen DC besorgt, aber da gab's auch nur Probleme.
Sollten die Hinweise von MCoder und mir nicht genügen, dann poste doch mal den Code der gesamten Funktion, dann sieht man mehr.

Mfg

langer
 
Zuletzt bearbeitet:
Vielen vielen Dank für all die nützlichen Tipps
Dann werd ich nun endlich doch noch ein etwas besserer MFC Programmierer ;)
 
Zurück