Listbox mit Checkbox



  • Hallo,

    ich wollte mal fragen ob jemand weiß, wie ich eine Listbox erstelle, die für jeden Eintrag eine Checkbox bereitstellt. Und wie kann ich dann die Chekcbox-States auslesen bzw. setzen?

    Danke schonmal im Voraus.



  • Hi,

    ich hab das Problem mal folgend gelöst, ich weiß nicht ob es eine bessere Lösung gibt, aber die geht auch. Ich füg jetzt nur mal die wichtigsten Funktionen ein (In der WinMain gibt es keine Änderungen).

    #define ANZAHL 4
    #define ID_LISTBOX 1
    
    int DrawItem(LPDRAWITEMSTRUCT lpDis);
    
    typedef struct
    {
     char cText[32];
     bool bSelected;
     /*
     sonstige Daten
     */
    }MYITEM, *LPMYITEM;
    
    MYITEM myItem[ANZAHL] = {"Item1",true,"Item2",false,"Item3",true,"Item4",true};
    
    //-----------------------------------------------------------------------------
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
     static    HWND hList;
    
     int       iIndex;
     LPMYITEM  lpMyItem;
    
     switch(message)
     {
      case WM_CREATE:
           //Listbox erzeugen
           hList = CreateWindow("listbox","",WS_VISIBLE|WS_CHILD|WS_BORDER|LBS_OWNERDRAWFIXED|LBS_NOTIFY
                        ,10,10,100,100,hwnd,(HMENU)ID_LISTBOX,hInst,0);
           //Einträge einfügen
           for(int i=0; i < ANZAHL; i++)
            SendMessage(hList,LB_ADDSTRING,0,(LPARAM)&myItem[i]);
           return(0);
    
      case WM_COMMAND:
           if(hList == (HWND)lParam) // Nachricht von Listbox?
            if(HIWORD(wParam)==LBN_DBLCLK) // Doppelclick?
            {
             iIndex = SendMessage(hList,LB_GETCURSEL,0,0);  // Index des ausgewählten Items abfragen
             lpMyItem = (LPMYITEM) SendMessage(hList,LB_GETITEMDATA,iIndex,0); // Dazu gespeicherter Zeiger abfragen
             lpMyItem->bSelected=!lpMyItem->bSelected;
             InvalidateRect(hList,0,TRUE); //Listbox neuzeichnen
            }
    
           return(0);
    
      case WM_DRAWITEM:
           if(wParam == ID_LISTBOX) // Wenn Listbox...
            return DrawItem((LPDRAWITEMSTRUCT)lParam); //...Eintrag neu zeichnen
           return(0);
    
      case WM_DESTROY:
    
           PostQuitMessage(0);
    
           return(0);
     }
     return DefWindowProc (hwnd, message , wParam, lParam);
    }
    
    //-----------------------------------------------------------------------------
    int DrawItem(LPDRAWITEMSTRUCT lpDis)
    {
     LPMYITEM         lpMyItem;
     COLORREF         txtColor, //Textfarbe
                      bgrColor; //Hintergrundfarbe
     HBRUSH           hBrush;
     RECT             rect;
    
     // Wenn keine Items vorhanden: abbrechen
     if(lpDis->itemID   == -1) return(0);
    
     lpMyItem = (LPMYITEM) lpDis->itemData;
    
     //Falls markiert
     if(lpDis->itemState & ODS_SELECTED)
     {
      txtColor  = RGB(255,255,255);
      bgrColor  = RGB(0,0,255);
     }
     else if(lpDis->itemState & ODS_DISABLED)  // Falls deaktiviert
     {
      txtColor = RGB(200,200,200);
      bgrColor  = RGB(255,255,255);
     }
     else
     {
      txtColor = RGB(0,0,0);
      bgrColor = RGB(255,255,255);
     }
    
     // Alten Eintrag überzeichnen
     hBrush = CreateSolidBrush(bgrColor);
     FillRect(lpDis->hDC,&lpDis->rcItem,hBrush);
     DeleteObject(hBrush);
    
     //Koordinaten für Kästcen berechnen
    
     rect        = lpDis->rcItem;
     rect.left   += 2;
     rect.top    += 2;
     rect.right  = lpDis->rcItem.left+lpDis->rcItem.bottom-lpDis->rcItem.top-2;
     rect.bottom = lpDis->rcItem.top+lpDis->rcItem.bottom-lpDis->rcItem.top-2;
    
     //Kästchen zeichnen
     hBrush = CreateSolidBrush(RGB(0,0,0));
     FrameRect(lpDis->hDC,&rect,hBrush);
     DeleteObject(hBrush);
    
     //X zeichnen wenn ausgewählt:
     if(lpMyItem->bSelected)
     {
      MoveToEx(lpDis->hDC,rect.left,rect.top,NULL);
      LineTo(lpDis->hDC,rect.right,rect.bottom);
    
      MoveToEx(lpDis->hDC,rect.left,rect.bottom,NULL);
      LineTo(lpDis->hDC,rect.right,rect.top);
     }
    
     // Text einrücken
     lpDis->rcItem.left+=18;
    
     //Modi bestimmen
     SetBkMode(lpDis->hDC,TRANSPARENT);
     SetTextColor(lpDis->hDC,txtColor);
    
     //Text ausgeben
     DrawText(lpDis->hDC,lpMyItem->cText,strlen(lpMyItem->cText),&lpDis->rcItem,DT_VCENTER|DT_SINGLELINE );
    
     return(1);
    }
    

    Ich hoffe es hat weiter geholfen!

    [ Dieser Beitrag wurde am 10.03.2003 um 20:49 Uhr von Cpp-Fan editiert. ]



  • So hätte ich es auch gemacht...

    cu para
    😃



  • Vielen Dank, hat alles gefunzt....


Anmelden zum Antworten