tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
1018
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von kscha
    kscha kscha ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Ort
    Freckenfeld
    Beiträge
    44
    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
     

  2. #2
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    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 :
    1
    2
    3
    
    cf.crTextColor = 0x000000FF;
    cf.dwMask = CFM_COLOR; // Maskenbit für Farbe setzen
    m_cText.SetSelectionCharFormat( cf );

    Ich hoffe, es hilft dir weiter.
    Geändert von Kachelator (11.02.04 um 10:48 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  3. #3
    Avatar von kscha
    kscha kscha ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Ort
    Freckenfeld
    Beiträge
    44
    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
    Kann mir jemand helfen ?

    Viele Grüße,

    Kai
     

  4. #4
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    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 :
    1
    2
    3
    4
    
    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.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  5. #5
    Avatar von kscha
    kscha kscha ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Ort
    Freckenfeld
    Beiträge
    44
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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

    Kai
     

  6. #6
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Klappt das denn mit der Selektion? *dumm frag*
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  7. #7
    Avatar von kscha
    kscha kscha ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Ort
    Freckenfeld
    Beiträge
    44
    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 :
    1
    2
    3
    4
    5
    6
    
    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
     

  8. #8
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Kopier dir den String in einen (temporären) CString.
    Code :
    1
    2
    3
    
    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.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  9. #9
    Avatar von kscha
    kscha kscha ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Ort
    Freckenfeld
    Beiträge
    44
    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 !

    Gruß, Kai
     

  10. #10
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Ach richtig! Du brauchst einen konstanten Pointer - das sollte doch in Ordnung sein, da du nur darin suchen willst, oder?

    Code :
    1
    
    LPCTSTR lpStr = LPCTSTR( strTemp ); // lpStr ist jetzt ein konstanter Pointer
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  11. #11
    Avatar von kscha
    kscha kscha ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Ort
    Freckenfeld
    Beiträge
    44
    LEIDER verlangt diese FINDTEXTEX-stucture einen "LPSTR" und deshalb kommt bei dem Code
    Code :
    1
    2
    3
    4
    
    CString strTemp = sequenz.GetBuffer(sequenz.GetLength());
    LPCTSTR lpStr = LPCTSTR (strTemp);
     
    shine.lpstrText = lpStr;
    auch wieder die Fehlermeldung "'const char *' kann nicht in 'char *' konvertiert werden"
    Dieses lpStr ist das, nach dem ich suchen will !

    Meinst Du ich kann das irgendwie mit einem char-Pointer lösen ? Aber dann ist dessen Inhalt auch weg, sobald ich "sequenz" leere, oder ?!
     

  12. #12
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Ich weiss leider nicht genau, was du vorhast und wofür die FINDTEXTEX genau gut ist. Wird den der Text verändert? Wenn nicht, kannst du die Konstantheit ja auch (quick and dirty) wegcasten. Aber nur, wenn du sicher bist, kein Unheil anzurichten!
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  13. #13
    Avatar von kscha
    kscha kscha ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Ort
    Freckenfeld
    Beiträge
    44
    Ich versuche mal so kurz wie möglich zu erklären, was ich vor habe:

    Ich lese eine Text-Datei zeichenweise aus (es handelt sich dabei um eine RNA-Sequenz... sowas wie "AGGCAGACCCG..."... aber das ist ja unwichtig). Und schreibe diese einzelnen Buchstaben in meine RichEditBox (über die CString-Membervariable m_sStruktur). In der Variablen "sequenz" speichere ich kurzzeitig eine ganz bestimmte Sequenz. Da das eben eine ganz bestimmte Sequenz ist, will ich sie in dem Wust von Buchstaben wieder raussuchen (mit FindText, oder von mir aus auch mit SetSel(start, ende), oder wie auch immer) und rot highlighten..... aber genau das kriege ich einfach um's Verrecken nicht hin !

    Vielleicht gehe ich die ganze Sache ja auch völlig falsch an, aber ich bin so langsam mit meinem Latein am Ende !
    Vielleicht fällt Dir ja noch irgendwas ein, was ich noch probieren könnte ?! Wie meinst Du das mit dem "wegcasten" ? Und welches "Unheil" könnte da denn passieren ? Einen Versuch wäre es bestimmt wert !
     

  14. #14
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Code :
    1
    2
    
    CString strTemp = sequenz.GetBuffer(sequenz.GetLength());
    LPTSTR lpStr = const_cast<LPTSTR>( LPCTSTR (strTemp) );
    Das da oben erzwingt eine Umwandlung in einen nichtkonstanten Pointer. Das ist quasi ein fieser Hack und sollte nur in Fällen gemacht werden, wenn man sicher sein kann, dass man keine Dummheiten macht. Ich benutze es gelegntlich, wenn ich mich mit einer API mit miesem Interface rumärgern muss. Kann sein, dass es bei dir ein ähnlicher Fall ist.

    Versuch es (auf eigene Gefahr) mal. Wenn es sich so kompilieren lässt, bist du schon mal einen Schritt weiter.


    Was deine Herangehensweise an das Sequenzproblem anbelangt: Um deinen Ansatz zu beurteilen, müsste ich mich richtig reinknien. Aber dazu fehlt mir leider die Zeit.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  15. #15
    Avatar von kscha
    kscha kscha ist offline Mitglied Bronze
    Registriert seit
    Jun 2003
    Ort
    Freckenfeld
    Beiträge
    44
    Halli Hallo !

    Also erst mal zwei Sachen vorweg:

    1. Das mit dem "unkonstanten" Pointer hat nicht geklappt ! Lies sich zwar übersetzen, ist aber zur Laufzeit abgeschmiert !
    2. Es war die ganze Zeit RICHTIG.... es hat eigentlich funktioniert, aber das ein oder andere "UpdateData" an der falschen Stelle (in unterschiedlichen Funktionen) hat die Formatierung wieder aufgehoben !

    Was habe ich jetzt gemacht ?
    --> Ich habe 'start' und 'ende' global definiert und rufe jetzt in jeder Funktion, die ein UpdateData benutzt, hinterher meine "m_cText.SetSelectionCharFormat"-Funktion auf !
    Das ist zwar absolut HÄSSLICHER Stil, aber es funktioniert..... und das ist mir nach mehr als zwei Tagen Rumtüftelei und Frust das Wichtigste
    Vielleicht habe ich irgendwann mal die Muse mich nochmal damit auseinander zu setzen und das noch schöner zu schreiben......

    Nochmal vielen vielen vielen Dank für Deine Unterstützung !

    Viele Grüße,

    Kai
     

Ähnliche Themen

  1. Flackern im CRichEditCtrl
    Von jokey2 im Forum VisualStudio & MFC
    Antworten: 9
    Letzter Beitrag: 14.05.07, 15:00
  2. CRichEditCtrl per Hand eingefügt.
    Von NinjaOne im Forum VisualStudio & MFC
    Antworten: 4
    Letzter Beitrag: 18.08.05, 20:11
  3. CRichEditCtrl und scrolling
    Von NinjaOne im Forum VisualStudio & MFC
    Antworten: 6
    Letzter Beitrag: 18.08.05, 20:09
  4. Font und Fontfarbe im CRichEditCtrl ändern
    Von NinjaOne im Forum VisualStudio & MFC
    Antworten: 5
    Letzter Beitrag: 29.07.05, 23:37
  5. MFC CRichEditCtrl
    Von Christian Fein im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 12.11.01, 12:41