Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Schriftfarbe in CListBox ändern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
19.03.2004, 14:55 Uhr
Philipp



Hallo,

ich habe in meiner MFC-Dialogfeldanwendung eine ListBox eingebaut, hab auch die dazugehörigen Variablen vom Typ CListBox... Das ganze soll eine Chatanwendung werden, wobei die einzelnen Nachrichten der Chatteilnehmer in der Listbox dargestellt werden. Das soll dabei in unterschiedlichen Farben passieren.

Ich muss es also hinbekommen, dass z.B. alle Nachrichten von User1 blau gezeichnet werden, und alle Nachrichten von USer2 rot. Hab die Funktionalität der Farben auch schon grundsätzlich integriert, d.h. die Anwendung weiß immer wenn sie eine neue Nachricht hinzufügt welche Farbe diese haben müsste!

Nur muss ich diese Farbe jetzt noch setzen können, wenn es geht dann gleichzeitig mit dem Hinzufügen eben dieser Nachricht. Das wäre dann die einfachete Methode.

Weiß da jemand wie man das realisieren könnte? Machen ja so einige Windows-Programme die ich kenne...

Philipp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.03.2004, 15:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


mahlzeit
Ich weiss nicht ob es auch anders geht aber du kannst z.b. OnCtlColor überladen.

in der funktion setzt du dann in abhängigkeit von z.b. zustandsvariablen die schriftfarbe mit SetTextColor;
das funzt wunderbar...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.03.2004, 17:13 Uhr
Philipp



Ja stimmt, davon hab ich auch schon in der MSDN gelesen.

Nur weiß ich nicht, wie ich dann wirklich für jeden String die Schriftfarbe ändern kann! Ich hab das jetzt so verstanden als wenn man in OnCtlColor nur eine Textfarbe angeben kann, die dann durchgehend für alle Strings der ListBox gilt, aber das bringt mir ja nix...

Wie also soll ich das machen??

Philipp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.03.2004, 17:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


eigentlich dämlich von mir das nicht gleich zu posten aber man ist ja immer faul...
ok vorsicht ungetestet....

C++:
HBRUSH MyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {

    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    if (pWnd->GetDlgCtrlID() == IDC_TRALALA){
                     //oder halt ne andere bedingung als status nehmen
                     //welche farbe wann auftritt weisst du ja besser als ich
                     if(status)pDC->SetTextColor(RGB(255,0,0)); //rot
                     else pDC->SetTextColor(RGB(0,0,255)); //blau
            }
}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.03.2004, 19:55 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Warum benutzt du nicht ein RichEditCtrl? Damit kann man schön einfach Text färben und für sowas kann man das auch benutzen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.03.2004, 23:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Flo
vermutlich weil man mit einem richedit nur schwer eine Liste simulieren kann...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.03.2004, 23:17 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Nö, so schwer ist das nicht. Man nimmt einfach \r\n als Listen-trennzeichen, mit div. Line-Funktionen (GetLine,LineIndex, etc) des RichEditCtrl's ist das simulieren einer liste dann nicht schwer
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.03.2004, 15:41 Uhr
Philipp



Danke ihr beide, ich werds mal mit ner RichEditCtrl versuchen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.03.2004, 21:57 Uhr
Philipp



So, ich hab mich nun mal an die RichEditCtrl rangewagt, klappt auch alles so wie vorher, nur bekomme ich die Schriftfarbe immer noch nicht geändert.

Hab ich das richtig verstanden, dass man erst den Text hinzufügt, ihn dann per SetSel() auswählt, und dann per SetSelectionCharFormat() und der dazugehörigen CHARFORMAT Struktur die Farbe verändert? Weil ich mache das eigentlich so, es funktioniert aber nicht!

Bei mir im Programm hab ich für ein RichEditCtrl 2 Membervariablen, vielleicht liegts daran: Die sind m_strTextOutput als CString, und m_ctrlTextOutput als CRichEditCtrl. Folgenden Code benutze ich zum ändern der Farbe, der Code wird jedesmal dann aufgerufen wenn eine neue ChatMessage von nem anderen Benutzer ankommt :


C++:
int CurrentNrChars=pDlg->m_strTextOutput.GetLength();

            pDlg->m_strTextOutput+=StringToAdd;
            pDlg->m_ctrlTextOutput.LineScroll(1);
            
            pDlg->UpdateData(false);
            pDlg->UpdateData(true);
            
            pDlg->m_ctrlTextOutput.SetSel(CurrentNrChars,pDlg->m_strTextOutput.GetLength());
                    
            CHARFORMAT lbCharFormat;
            lbCharFormat.cbSize=sizeof(lbCharFormat);
            lbCharFormat.dwMask=CFM_COLOR;
            
            long pos1=0, pos2=0;
            pDlg->m_ctrlTextOutput.GetSel(pos1,pos2);
            
            if(UserID>=253)
                lbCharFormat.crTextColor=RGB(255,255,255);
            else
            {
                // Den Benutzer mit der betreffenden ID finden
                int UserIndex=pDlg->ConnectedUsers.GetIndexByUserID(UserID);
                if(UserIndex<0 ||UserIndex>pDlg->iMaxUsers)
                    return;

                // Nun die Farbe abhängig vom User, der die Message geschrieben hat, abändern
                lbCharFormat.crTextColor=Color[pDlg->ConnectedUsers.pUserData[UserIndex].dwFontColor];
            }
            
            CString CurSelText=pDlg->m_ctrlTextOutput.GetSelText();
            
            int RetValue=pDlg->m_ctrlTextOutput.SetSelectionCharFormat(lbCharFormat);

            pDlg->m_ctrlTextOutput.GetSelectionCharFormat(lbCharFormat);
            
            pDlg->UpdateData(false);    



Hat einer ne Idee, warum das nicht geht? Die Selektion des Textes ist ok, er selektiert immer wirklich den text der neuen Message, das sehe ich einmal an der Variable CurSelText, und an pos1/pos2. Die Funktion SetSelectionCharFormat() gibt auch immer eine 1, d.h. Success, zurück. Ich weiß echt net woran das liegt. Könnte mir halt nur vorstellen, dass es daran liegt das ich den Text über den CString hinzufüge, und dann aber per CRichEditCtrl weiterarbeite...

Habt ihr ne Lösung?

THX
Philipp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.03.2004, 23:56 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


so der kelch geht an dich flo...
das richedit kann mir gestohlen bleiben das benutze ich nie
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: