Einzelne Zeilen in Listbox (Editbox) kolorieren ? ? ?



  • Hi,
    ich habe schon seit langer Zeit ein Problem bei dem ich nicht weiter komme..
    Ich will nur einzelne Zeilen in einer Listbox (oder Editbox) in verschiedenen Farben kolorieren.
    D.h. z.B. eine Zeile in rot die ander in blau usw.
    Kennt ihr da vielleicht eine Lösung.

    PS: In anderen Sprachen wie Dephi ist das ja auch so einfach, dann muss das doch auch mit C & WinAPI gehen oder nicht?

    Ciao | Fred



  • Wünsche dir dass andere besser Nachrichten haben, aber:

    Ich habe bisher nur bei einem Kollegen gesehen, dass er eine CListBox soweit umgemodelt hat, dass die Zeilen in unterschiedlichen Farben ausgegeben wurden. Ist aber echte Handarbeit. Da dieser Kollege auch in Recherche recht fit ist, musst du wohl selbst basteln. images/smiles/icon_sad.gif

    Aber wie gesagt: Vielleicht hat er doch was übersehen.



  • Das ist ja echt sehr sehr schade images/smiles/icon_sad.gif images/smiles/icon_sad.gif images/smiles/icon_sad.gif
    Verstehe echt nicht warum das so schwer ist..
    Die Farben macht das ganze doch erst übersichtlich!

    Tja, wenn jemand mal ein Beispiel findet wie so etwas dennoch manuell geht, dann postet es bitte hier hin.

    Cu | Fred



  • Nana, so schwer ist das nun auch nicht.
    Man muss lediglich alles selber zeichnen:

    // Erstellen...
    hControl = CreateWindowEx(...,WS_VISIBLE|WS_CHILD|LBS_HASSTRINGS|LBS_OWNERDRAWFIXED,...);
    
    // Dann WM_DRAWITEM im Eltern-Fenster abfangen
    // in lParam verstecken sich die Infos über das was gezeichnet werden soll und zwar in Form von DRAWITEMSTRUCT
    case WM_DRAWITEM:
        {
            DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT*)lp;
            if( dis->hwndItem == hControl ) {  // Prüfen welche Listbox gezeichnet wird
                COLORREF bgColor;
                // Falls Eintrag selektiert dann roter Hintergrund, sonst grün
                if( dis->itemState & ODS_SELECTED )
                    bgColor = RGB(255,0,0);
                else
                    bgColor = RGB(0,255,0);
                // Rechteck für Hintergrund zeichnen
                HBRUSH hbr = CreateSolidBrush(bgColor);
                FillRect(dis->hDC,&dis->rcItem,hbr);
                DeleteObject(hbr);
                // Den Text des Items nehmen und mit Textout darstellen
                char buf[100];
                SendMessage(hControl,LB_GETTEXT,dis->itemID,(long)buf);
                SetBkColor(dis->hDC,bgColor);
                TextOut(dis->hDC, dis->rcItem.left, dis->rcItem.top, buf, strlen(buf));
            }
            return 0;
        };
    

    [ 12.10.2001: Beitrag editiert von: Dr. Greenthumb ]



  • @green

    Das meinte ich mit Handarbeit. images/smiles/icon_wink.gif



  • OK heißen Dank für den SourceCode.

    Werde das ganze jetzt mal testen images/smiles/icon_wink.gif

    Cu | Fred



  • da ich letztes mal dreimal fragen musste, ob man das bitte in die faq machen kann:
    BITTE IN DIE FAQ
    BITTE IN DIE FAQ
    BITTE IN DIE FAQ


Anmelden zum Antworten