Forum: PC-Programmierung WinAPI: "SetDlgItemText" Textattribute?


von mitleser (Gast)


Lesenswert?

Ich schreibe einen Text mit Hilfe von "SetDlgItemText" in das Textfeld 
einer DIalogbox. Wie kann ich Attribute wie z.B. Fett, oder eine andere 
Farbe in dem Text realisieren, um bestimmte Schlüsselwörter aus dem Text 
hervorheben?

Besispiel:
Diese Wort ist fett!

WinXP; VisualC6.0; WinAPI

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gar nicht. Die Textfelder, deren Text mit SetDlgItemText gesetzt werden 
können (statische und einfache Editfelder) unterstützen keine 
unterschiedlichen Textattribute für einzelne Textbestandteile.
Sie können nur den gesamten Text einheitlich formatiert darstellen.

Für Deine Hervorhebungen ist entweder ein RichText-Control zu verwenden 
(RichEdit), das Text im RTF-Format anzeigt, oder aber ein HTML-Control, 
das Du Dir aber irgendwoher besorgen musst.

Alternativ kannst Du ein OwnerDraw -Control verwenden, also ein 
Textcontrol, bei dem Du den WM_PAINT-Handler mit eigenem Code 
überlagerst.

von mitleser (Gast)


Lesenswert?

Oh je, dass hab ich befürchtet. Großen Aufwand wollte ich an der Stelle 
eigendlich nicht betreiben. Ich dachte so was wie "fett" oder 
"unterstreichen" ist vlt. mit Steuerzeichen (ähnlich wie -> \r\n) zu 
machen.

Trotzdem danke.
Wenn einer doch noch ne einfache Method kennt, dann immer her damit ;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

mitleser schrieb:
> Ich dachte so was wie "fett" oder
> "unterstreichen" ist vlt. mit Steuerzeichen (ähnlich wie -> \r\n) zu
> machen.

Wenn Du das standardmäßig verfügbare RichEdit-Control benutzt, dann ist 
das so (auch wenn die Steuerzeichen etwas anders aussehen), nur ist das 
Control mit anderen Funktionen zu verwenden als die einfachen 
Text-Controls.

Die MFC enthält mit CRichEditCtrl auch eine Klasse, die das Control 
kapselt, hier ein einfaches Tutorial dazu:

http://www.functionx.com/visualc/controls/richedit.htm

von Platinenschwenker .. (platinenschwenker)


Lesenswert?

mitleser schrieb:
> Oh je, dass hab ich befürchtet. Großen Aufwand wollte ich an der Stelle
> eigendlich nicht betreiben. Ich dachte so was wie "fett" oder
> "unterstreichen" ist vlt. mit Steuerzeichen (ähnlich wie -> \r\n) zu
> machen.
>
> Trotzdem danke.
> Wenn einer doch noch ne einfache Method kennt, dann immer her damit ;-)

Außer RichEdit bleibt auch die Möglichkeit (unter Umgehung von 
SetDlgItemText) den Text einfach per TextOut() an eine beliebige Stelle 
in den Dialog zu schreiben. Per SelectObject() den entsprechenden font 
in den Devicekontext wählen.

"The TextOut function writes a character string at the specified 
location, using the currently selected font, background color, and text 
color."

Vielleicht nicht der Königsweg, aber eine Möglichkeit.

von Peter II (Gast)


Lesenswert?

Platinenschwenker .. schrieb:
> Vielleicht nicht der Königsweg, aber eine Möglichkeit.

offentlich schiebt dann keiner mal ein Fenster über den Text.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Platinenschwenker .. schrieb:
> Vielleicht nicht der Königsweg, aber eine Möglichkeit.

Das muss dann aber in den WM_PAINT-Handler des Dialogs eingebunden 
werden, damit es nicht zu Abbildungsfehlern kommt. Sonst genügt ein 
Verschieben des Dialogs, ein Überdecken des Dialogs durch ein anderes 
Fenster, und der Text ist weg/kaputt.

von Platinenschwenker .. (platinenschwenker)


Lesenswert?

Peter II schrieb:
> Platinenschwenker .. schrieb:
>> Vielleicht nicht der Königsweg, aber eine Möglichkeit.
>
> offentlich schiebt dann keiner mal ein Fenster über den Text.

Das macht gar nix, TextOut() wird in einer

BeginPaint(hDlg, &ps);
  TextOut(hdc, 0, 0, chText, lstrlen(chText));
EndPaint(hDlg, &ps);

ausgeführt.   (innerhalb eines WM_PAINT: Ereignisses)

von Karl H. (kbuchegg)


Lesenswert?

Ist trotzdem keine so gute Idee.
Ich ärgere mich jedesmal grün und blau, wenn jemend so etwas macht und 
ich den Text (die Ausgabe des Programms) dann fein säuberlich abtippen 
muss, anstelle das ich ganz einfach in das Control hineinklicken und mir 
den Text mit Copy&Paste woanders hin kopieren kann.
Programmausgaben gehören im Regelfall in ein Read-Only Control 
ausgegeben. Du weißt nie, was dein Benutzer mit der Programmausgabe 
weiter machen möchte, also mach es ihm leicht das zu tun, was er tun 
will.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> anstelle das ich ganz einfach in das Control hineinklicken und mir
> den Text mit Copy&Paste woanders hin kopieren kann

Das ist bei einfachen static-Text-Controls leider nicht anders.

von Karl H. (kbuchegg)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Karl Heinz Buchegger schrieb:
>> anstelle das ich ganz einfach in das Control hineinklicken und mir
>> den Text mit Copy&Paste woanders hin kopieren kann
>
> Das ist bei einfachen static-Text-Controls leider nicht anders.

:-)
erwischt. An die hatte ich nicht gedacht. Ich hatte Text-Controls im 
Read-Only Modus im Sinn, weil ich die grundsätzlich für Ausgaben von 
berechneten Werten oder sonstigen Angaben nutze. Hat dann auch den 
Vorteil, dass man einen langen Dateinamen in einem kleinen Dialog immer 
noch durchscrollen kann, anstatt dass der über die Dialoggrenzen hinweg 
(unsichtbar) ausgegeben wird.

von Platinenschwenker .. (platinenschwenker)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> erwischt. An die hatte ich nicht gedacht. Ich hatte Text-Controls im
> Read-Only Modus im Sinn, weil ich die grundsätzlich für Ausgaben von
> berechneten Werten oder sonstigen Angaben nutze. Hat dann auch den
> Vorteil, dass man einen langen Dateinamen in einem kleinen Dialog immer
> noch durchscrollen kann, anstatt dass der über die Dialoggrenzen hinweg
> (unsichtbar) ausgegeben wird.

Dann könnte dir jenes besser gefallen, was im Anhang zu sehen ist. Ein 
read-only RichEdit Textfeld nach dem Start beschickt mit einem String, 
eine Formatierung an das Feld gesendet (rot, blau) und trotz dessen dass 
das Feld zu kurz ist lässt sich der Inhalt scrollen, selektieren, 
kopieren (mit CTRL-C). Doch irgendwie flexibler wie Textout(). ;)

Das Originalbeispiel lud einen "Wordpad" RTF Text in das Feld.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.