'Selektieren in CRichEditCtrl'

kscha

Mitglied
Hallo zusammen !

Mir brennen folgende Fragen auf der Seele:

1. Darf ich überhaupt einer member-Variablen einer CEdit-Box den Typ 'CRichEditCtrl' geben ?

Wenn ja:
2. Ich krieg's nicht hin, einen Bereich in der Box zu selektieren und dann die 'SetSelectionCharFormat ' durchzuführen ! Ich kriege als Rückgabewert immer wieder 0....d.h. die Funktion war nicht erfolgreich ! Ich konnte aber keine Fehler entdecken !
Hier mal ein kleiner Auszug aus meinem Programm:

struct _charformat cf;
int start = 15;
int ende = 150;
....
m_cText.SetSel ( start, ende );
cf.crTextColor = 0x000000FF;
m_cText.SetSelectionCharFormat( cf );

Kann mir jemand weiter helfen und mir sagen, warum das nicht funktioniert ?

Darüber wäre ich sehr dankbar

Viele Grüße,

Kai
 

Kachelator

Peter Jerz
Zu 1.:
Ich denke schon.

Zu 2.:
Aus der MSDN:
Call this function to set the character formatting attributes for the text in the current selection in this CRichEditCtrl object. Only the attributes specified by the dwMask member of cf are changed by this function.
Aus dem zweiten Satz geht hervor, dass du anscheinend noch ein Maskenbit setzen musst, damit die Funktion weiss, welches Attribut die SetSelectionCharFormat() ändern soll - in deinem Fall das Bit für die Farbe.

Probier mal das:
Code:
cf.crTextColor = 0x000000FF;
cf.dwMask = CFM_COLOR; // Maskenbit für Farbe setzen
m_cText.SetSelectionCharFormat( cf );

Ich hoffe, es hilft dir weiter.
 
Zuletzt bearbeitet:

kscha

Mitglied
Hallo !

Das hat leider so nicht geklappt !
Selbst wenn ich das dwMask-Flag auf CFM_COLOR setze funktioniert es nicht ! :(
Ich kann mir das einfach nicht erklären !

Es kann ja auch nicht sein, daß durch ein "UpdateData" die Selektierung wieder auf schwarz gesetzt wird, da ja von vornherein die Funktion 'm_cText.SetSelectionCharFormat(cf)' eine NULL zurückliefert ! ("Nonzero if successful; otherwise, 0.")

Ich bin am Verzweifeln :mad:
Kann mir jemand helfen ?

Viele Grüße,

Kai
 

Kachelator

Peter Jerz
cbSize
Size in bytes of this structure. Must be set before passing the structure to the rich edit control.
Das ist aus der MSDN (CHARFORMAT). Ist mir eben noch aufgefallen. Hast du das eingetragen vor dem Aufruf von SetSelectionCharFormat()?

Sollte theoretisch so klappen:
Code:
cf.crTextColor = 0x000000FF;
cf.cbSize = sizeof( CHARFORMAT ); // struct-Größe setzen
cf.dwMask = CFM_COLOR; // Maskenbit für Farbe setzen
m_cText.SetSelectionCharFormat( cf );

"Nonzero if successful; otherwise, 0."
Es kann sein, dass die Funktion es als Erfolg auffasst, wenn man ihr scheinbar nichts zu tun gibt und sie genau das erledigt.
 

kscha

Mitglied
Also..... ich muß leider weiterhin nerven :-(

Indem ich die normale Edit-Box durch eine RichEditBox ersetzt habe und in der InitInstance-Funktion 'AfxInitRichEdit' aufrufe, habe ich es jetzt wenigstens erreicht, daß die Funktion SetSelectionCharFormat(cf) eine EINS zurück liefert :) D.h. sie tut immerhin schon was

ABER: Mit meinem folgenden Code...

Code:
m_cText.SetSel(anfangSD-1, anfangSD-1  + (sequenz.GetLength()));
               // anfangSD ist hier 149
               // sequenz ist ein von mir erzeugter CString
cf.crTextColor = 0x000000FF;
cf.cbSize = sizeof( CHARFORMAT ); 
cf.dwMask = CFM_COLOR | CFM_BOLD;
cf.dwEffects = CFE_BOLD;
m_cText.SetSelectionCharFormat(cf);

...tut sich in meiner Box trotzdem gar nichts ! Weder eine Selektion, noch ändert sich die Farbe, noch wird die Schrift dick !

Ich weiß jetzt echt nicht mehr weiter !

Trotzdem viele Grüße und vielleicht fällt Euch noch was dazu ein :confused:

Kai
 

kscha

Mitglied
Also, wenn ich in meinem Code von oben

m_cText.SetSel(0, -1);

eingebe, dann funktioniert's wunderbar D.h. er markiert den kompletten Inhalt der RichEditBox, macht ihn fett und rot :)
Da ich aber KEIN Ergebnis kriege, wenn ich mit meinen Variablen arbeite, muß es logischerweise irgendwie an denen liegen !

Aber um das herauszufinden, bin ich wohl auf mich allein gestellt !
Auf jeden Fall möchte ich mich gaaanz herzlich für Dein Interesse und Dein Engagement bedanken ;)

....Aber noch eine Frage zum Schluß: Ich habe folgenden Code

Code:
01  LPTSTR lpStr = sequenz.GetBuffer(sequenz.GetLength());
02  shine.lpstrText = lpStr;
03  sequenz = "";

04  m_cText.FindText(0, &shine);
05  m_cText.SetSel(shine.chrgText);

"shine" ist in dem Fall ein FINDTEXTEX, um den String "sequenz" in meiner RichEditBox zu finden.
Jetzt die Frage: Wie kann ich es verhindern, daß in Zeile 03 'shine.lpstrText' ebenfalls geleert wird ? Weil in dem Fall kann er ja nichts finden und nichts selektieren, wenn er keinen Suchstring mehr hat !

Viele Grüße und nochmals DANKE,

Kai
 

Kachelator

Peter Jerz
Kopier dir den String in einen (temporären) CString.
Code:
CString strTemp = sequenz.GetBuffer(sequenz.GetLength());
LPTSTR lpStr = LPCTSTR( strTemp );
// weiter wie gehabt
Vielleicht kannst du auch direkt mit dem CString weiterarbeiten anstelle von lpStr. Schau dir einfach mal die Member von CString an.
 

kscha

Mitglied
Das geht irgendwie nicht !

Bei "LPTSTR lpStr = LPCTSTR (strTemp);" sagt er:

'const char *' kann nicht in 'char *' konvertiert werden

Und bei ""LPTSTR lpStr = LPTSTR (strTemp); sagt er:

'class CString' kann nicht in 'char *' konvertiert werden

Gibt's noch irgendwie eine andere Möglichkeit ? So langsam macht mich dieses Problem echt fertig ! :confused:

Gruß, Kai
 

Kachelator

Peter Jerz
Ach richtig! Du brauchst einen konstanten Pointer - das sollte doch in Ordnung sein, da du nur darin suchen willst, oder?

Code:
LPCTSTR lpStr = LPCTSTR( strTemp ); // lpStr ist jetzt ein konstanter Pointer