[C++] Checkbox in Listbox

Jacal

Mitglied
Hallo,
wie kann ich mit der WinAPI eine Checkbox in eine Listbox einfügen? Aus den MSDN-Angaben werde ich leider nicht schlau :(
Ich benutze den MinGW-Compiler.

Beste Grüße,
Jacal.
 
Das ist leider keine offizielle Control (in MFC gibt's eine Hilfsklasse, die die Arbeit erledigt). Da musst du selber ran:

Eine normale Listbox mit Owner-Draw-Items. Innerhalb des WM_PAINT-Aufrufes musst du dann selbst die Checkboxen zeichnen, rechts daneben den Item-Text (siehe dazu DrawFrameControl).
Auch auf die Klicks musst du reagieren, und zusätzlich den Checkbox-Status irgendwo per Item speichern (LB_SETITEMDATA bietet sich an).
 
Schade, soetwas hatte ich befürchtet :(

Is es dann eventluell möglich, Checkboxes in eine Scrollbar zu integrieren, oder auch nicht?
 
Ok, also ich habe das ganze jetzt nach dieser Methode gelöst.

Nur gibt es dabei ein Problem in diesem Teil:
Code:
case WM_DRAWITEM:
       if(wParam == ID_LISTBOX) // Wenn Listbox...
        return DrawItem((LPDRAWITEMSTRUCT)lParam); //...Eintrag neu zeichnen
       return(0);

Mein Dialog-Window sendet komischerweiße die Nachricht WM_DRAWITEM nicht, welchen ich brauche, da in diesem Fall lParam die Nachrichten für LPDRAWITEMSTRUCT beinhaltet.

Gibt es eine möglichkeit manuell eine LPDRAWITEMSTRUCT zu erstellen oder den Dialog dazu zwingen, die Message DRAWITEM für meine Listbox zu senden?

Mfg, Jacal

Edit:
Ich habe jetzt einmal versucht, WM_DRAWITEM manuell zu senden, doch das Programm stürzt dabei jedesmal ab :(
Hat jemand eine Ahnung, woram das liegen könnte?

Code:
int ItemAnz= GetListBoxInfo(GetDlgItem(hDlg,IDC_AIV_LIST));
RECT lRect={ 15, 15, 140, 100 };
DRAWITEMSTRUCT di={ ODT_LISTVIEW, IDC_AIV_LIST, ItemAnz, ODA_DRAWENTIRE, ODS_DEFAULT,
GetDlgItem(hDlg, IDC_AIV_LIST), hdc, lRect, 0 };
SendMessage(hDlg,WM_DRAWITEM, (WPARAM)IDC_AIV_LIST, (LPARAM)&di );
 
Zuletzt bearbeitet:
Damit WM_DRAWITEM bei der Listbox kommt, musst du ein paar Styles aktiv haben:

Das müsste LBS_OWNERDRAWFIXED sein. Und ich meine, es muss auch explizit LBS_HASSTRINGS mit dabei sein.
 
Damit WM_DRAWITEM bei der Listbox kommt, musst du ein paar Styles aktiv haben:

Das müsste LBS_OWNERDRAWFIXED sein. Und ich meine, es muss auch explizit LBS_HASSTRINGS mit dabei sein.

Funktioniert leider immer noch nicht:
Code:
LISTBOX              IDC_AIV_LIST,     15, 15,140,100, ES_AUTOVSCROLL | WS_HSCROLL | LBS_HASSTRINGS | LBS_STANDARD | LBS_OWNERDRAWFIXED
 
Zuletzt bearbeitet:
Zurück