Probleme mit Listbox



  • Hi.
    Ich evrsuche seit 2-3 tagen einen Eintrag in eine Erstellte ListBox einzugeben.
    hab stundenlang bei google gesucht aber es will einfach nicht funzen.
    hier mal mein code

    #define LISTBOX_01	1
    
    HWND ctrl_field[ANZ_CTRL];
    
    ...
    
    case WM_CREATE:
    {
    	ctrl_field[LISTBOX_01] = CreateWindow("listbox", "", WS_VISIBLE|WS_CHILD|WS_BORDER|LBS_OWNERDRAWFIXED|LBS_NOTIFY, 10,10,100,100,hWnd,NULL,hInstance,0); 
    	SendMessage(ctrl_field[LISTBOX_01], LB_ADDSTRING, 0, (LPARAM)"text");
    	return 0;
    }
    
    ...
    

    kann mir bitte jemand weiterhelfen?



  • Hello, versuch LBS_OWNERDRAWFIXED mit LBS_HASSTRINGS ersetzen.



  • supi!
    es funzt, danke 🙂



  • gibts da eigentlich auhc ne möglichkeit, ein parameter oder ne funktion das man ein eintrag vorselektieren kann?

    also, ich benutze die ListBox zum auslesen von bestimmten dateien.
    wenn *.obj im vrezeichniss C.\... sind, werden diese in die listbox eingetragen.
    nun möchte ich, wenn eine besztimmte datei gefunden, vorselektieren.

    ist das möglich?





  • hm.
    hab mir das mal angeschaut aber komme nicht so recht vorran.
    ich muss doch erst in die liste einfügen und dann den eintrag quasi selectieren mit LB_SETSEL, oder?



  • ja zu erst die liste befüllen und dann entweder LB_SETCURSEL o. LB_SETSEL.

    jeh nachdem welches du brauchst.



  • Ah, okay.
    hatte das entweder überlesen oder falsch verstanden, deswegen kam nix brauchbares zustande.

    aber mal ne frage.

    ich hab mir ne struktur gemacht

    typedef struct
    {
    	std::string cFilename;
    	bool bSelected;
    }ListItem, *pListItem;
    

    wenn ich nun werte in die listbox eintrage werden diese passend dazu in die variable zu

    ListItem *LItem;
    LItem=new ListItem[...]
    ...
    

    eingetragen.
    wenn ich nun die ausgabe des selektierten index will, mache ich das momentan mit

    int ListIndex=0;
    if(lParam==(LPARAM)ctrl_field[BUTTON_02])
    {
    	ListIndex=SendMessage(ctrl_field[LISTBOX_01], LB_GETCURSEL, 0, 0);
    	if(HIWORD(wParam)==BN_CLICKED)
    		MessageBox(NULL, LItem[ListIndex].cFilename.c_str(), "Ausgabe..",MB_OK);
    }
    

    was ja auch funktioniert.
    ist das auf diese art und weise "legitim" oder gibt es da noch ne sauberere alternative.
    kenne mich nun mit winapi sachen nicht sonderlich aus, da ich bis jetzt eigentlich nur opengl in c-konsole geschrieben habe.



  • nun du könntest deine strucktur auch an das jeweilige Element selbst klemmen.
    kuck dir mal LB_GETITEMDATA / LB_SETITEMDATA an.

    ListItem *LItem = new ListItem;
    
    LItem->cFilename = "";
    LItem->bSelected = TRUE;
    
    SendMessage(hWndControl,LB_SETITEMDATA,(WPARAM)iItem,(LPARAM)LItem);
    
    ListItem *lpLItem = (ListItem*)SendMessage(hWndControl,LB_GETITEMDATA,(WPARAM)iItem,(LPARAM)0);
    
    lpLItem->bSelected = FALSE;
    

Anmelden zum Antworten