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....