Problem beim Einfügen eines Items in eine Listbox



  • Im Resource-Editor hab ich mir ganz normal einen Dialog erstellt in dem eine Combobox mit der ID: IDC_COMBO1 und eine Listbox mit der ID: IDC_LIST1 vorhanden ist.
    Beim Init des Dialoges versuche ich nun jeweils ein Item zu jedem Control hinzuzufügen. Hier kurz der Code:

    HWND hCb = GetDlgItem(hDlg, IDC_COMBO1);
    SendMessage(hCb, CB_INSERTSTRING, 0, (LPARAM)"LB TEST");
    
    HWND hLb = GetDlgItem(hDlg,IDC_LIST1);
    SendMessage(hLb, LB_INSERTSTRING,0,(LPARAM)"LB TEST");
    

    Das Problem ist, daß das Item in die Listbox eigefügt wird, aber in der Combobox nicht, obwohl die ID der Combobox stimmt. Nach 3 Stunden Suchen im Internet hab ich noch immer keine Lösung für das Problem gefunden, und wollte hier mal nachfragen ob mir wer weiterhelfen könnte.



  • Hat die ComboBox den Style CBS_HASSTRINGS? Ist es auch ne ComboBox und keine ComboBoxEx?



  • Danke für die Antwort.

    Es ist eine Combobox und keine ComboBoxEx.
    Ich hab nun manuel im Resource file noch CBS_HASSTRINGS eingefügt. Die Definition der Combobox sieht nun so aus:
    COMBOBOX IDC_COMBO1,47,108,38,12,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_HASSTRINGS

    Funktionieren tuts trotzdem nicht. In den Properties der Combobox im Dialogeditor von VisualStudio gibt es auch noch ein Feld mit Namen "Has Strings". Dies ist per default false und kann nicht geändert werden. Vielleicht kann man ja überhaupt keine String-Items einfügen?



  • Kann es sein, dass du in der Nachrichtenschleife nicht überprüfst, ob es sich um eine DialogMessage handelst und somit ungeprüft Translate - und DispatchMessage aufrufst?
    Also besser eher so etwas:

    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0))
    {
    	if(!IsDialogMessage(msg.hwnd, &msg))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    }
    

    Ist aber nur eine Vermutung..

    Edit : GetForegroundWindow() sollte hier nicht nötig sein.



  • Solche Dialoge haben doch ähnlich wie eine message box einen eigenen Message loop. Glaube nicht dass es daran liegt. So erzeuge ich mir den Dialog:

    DialogBox(hInst, MAKEINTRESOURCE(IDD_MYDIALOG), hWnd, MyDialog);
    


  • Alles klar, ich dachte das sei ein nichtmodaler Dialog, vielleicht auch noch als Erweiterung einer Fensteranwendung.
    Ich habe mich nur an ein Problem mit eben Comboboxen vor ein paar Jahren erinnert, das imho genau auf diesen fehlerhaften Code zurückzuführen war.



  • Ich erinnere mich düster, daß die Combobox zusammengesetzt ist aus einem Edit-Feld und einer Listbox (die sich je nach Bedarf verstecken kann) ist - und du müsstest dir jetzt den Listbox-Teil der Combobox heraussuchen, um solche Nachrichten absetzen zu können.
    (aber es ist zu lange her, um sich noch an die exakte Lösung zu erinnern)



  • Dafür gibt es ja die CB_ - Nachrichten. Intern werden als Reaktion die korrespondierenden LB_Nachrichten an die Listbox des Controls versandt.

    Sorry, aber eine Lösung habe ich auch nicht.

    Als dumme Frage hinterher: Das Editfeld ist standardmäßig leer, um es zu füllen ist eine Nachricht CB_SETCURSEL fällig. Du schaust dir ja nicht nur das Control an und denkst dir: Mist wieder nicht geklappt und schließt den Dialog, oder?



  • Oh mann, ja das wars.
    Ich hab in der Tat immer auf die vermeintlich leere Combobox geclickt. Da aber nie ein Drop-Down erschienen ist, obwohl ich als Typ Dropdown angegeben habe, dachte ich mir immer daß die Liste leer ist. 😡
    Ich hab die Größe der Combobox nun im Resource-File geändert, und siehe da die DropBox ist da. Jetzt muß ich nur noch herausfinden wie man eine Checkbox per SendMessage ankreuzt und meine GUI ist fertig. 🙂
    Danke nochmal für die Hilfe yahendrik



  • Ich wollte gerade Folgendes zum Ausprobieren vorschlagen:

    SendMessage hCb, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>("LB TEST");
    

    ComboBox_AddString müsste dann auch gehen.
    Aber schön, dass du eine Lösung gefunden hast.


Anmelden zum Antworten