Problem mit Listenfeld WINAPI

giwoody

Mitglied
Folgendes Problem:

Beim Aufruf des Dialoges muss erst in das Listenelement geklickt werden, bevor überhaupt etwas darin angezeigt wird. Danach möchte ich den ausgewählten Punkt aufrufen. Leider verdoppelt das Listenfeld beim anklicken die Einträge (CB_ADDSTRING)...

Mit welchem Befehl, kann ich die verdopplung der Listenelemente verhindern bzw. abstellen und den Inhalt automatisch anzeigen lassen ohne klicken auf die Liste?

Code:
for(int x=0;x<=1;x++) 
         { 
             
            User[0]='I'; 
            User[1]='C'; 
            User[2]='H'; 
            User[3]='\0'; 

            hwnd_CB=GetDlgItem(hwnd,IDC_Userliste); 
                
                
            SendMessage(hwnd_CB,CB_ADDSTRING,0,(long)&User[0]); 
            }

Danke im voraus
 
Beim initialiseren des Dialogs musst du den gewünschten Eintrag in der Liste selektieren mit CB_SETCURSEL. Oder wenn du Einträge hinzufügst und möchtest, dass der jeweils hinzugefügte Eintrag der aktuelle ist, musst du ihn mit CB_SETCURSEL nach dem Hinzufügen selektieren.


Was du mit der Verdopplung genau meinst, kann ich so nicht nachvollziehen. Wahrscheinlich fügst du die Einträge noch einmal zur Liste dazu beim Anklicken.
 
der fehler hat sich von selbst behoben! musste den aufruf des feldes unter WM_INITDIALOG aufrufen:

Code:
{	
	char User[4];
	User[0]='I';
	User[1]='C';
	User[2]='H';
	User[3]='\0';
	int x=0;
	switch (message)
	{
		case WM_INITDIALOG:	
			for(x=0;x<1;x++)
			{
			hwnd_CB=GetDlgItem(hwnd,IDC_Userliste);
                                                SendMessage(hwnd_CB,CB_ADDSTRING,0,(long)&User[0]);
                                               }		
			return TRUE ;
		
		case WM_COMMAND:
		switch (wParam)
		{
		case ID_USER_AUSWAHL:			
                     //hier soll dann die übergabe der auswahl stattfinden
			EndDialog (hwnd,1);
			return 0;
			case IDCANCEL:				
				EndDialog (hwnd,1);
				return TRUE ;
			case IDCLOSE:
				EndDialog (hwnd,1);
				return TRUE ;
			default:
				break;		
		}
	}
	return FALSE ;
}

so, vielleicht letzte frage

das listenfeld besteht aus 2 teilen (combo). der untere teil zeigt die auswählbaren teile, im oberen teil erscheint, nach dem anklicken, der ausgewählte teil.

wie fange ich die auswahl ab?
 
Zuletzt bearbeitet:
CB_GETCURSEL liefert den Index des selektierten Eintrags.

Mit diesem Index und CB_GETLBTEXT erhältst du den Text dazu.

Wenn du CB_SETITEMDATA verwendet hast bekommst du mit CB_GETITEMDATA diese speziellen Daten.
 
ist vielleicht unverschämt zu fragen, aber wie würde das im o.g. beispiel aussehen?

muss ich da mit GetMessage arbeiten?
 
Mit GetMessage holst du eine Message aus der Messagequeue.

Hier arbeitest du mit SendMessage, so wie du es in deinem Programm bereits machst.
Der Rückgabewert enthält das jeweilige Datum und ist abhängig von der Message.
Bei CB_GETCURSEL eben der Nullbasierte Index oder falls kein Eintrag selektiert ist CB_ERR.


Übrigens: das Forum ist schliesslich dazu da, Fragen zu stellen, wenn man was nicht versteht oder etwas dazu lernen möchte. Deswegen sollte man fragen, wenn man nicht weiter kommt, egal wie schwer oder einfach die Fragen sind. :-))
 
dorado hat gesagt.:
Übrigens: das Forum ist schliesslich dazu da, Fragen zu stellen, wenn man was nicht versteht oder etwas dazu lernen möchte. Deswegen sollte man fragen, wenn man nicht weiter kommt, egal wie schwer oder einfach die Fragen sind. :-))

:-)

ich glaube, da hab ich mich etwas mißverständlich ausgedrückt ...
wie, und ich meine den quelltext, muss ich das schreiben?
als erstes lasse ich mir den handle zu meinem listenfeld geben -- > "hwnd_CB"
hwnd_CB=GetDlgItem(hwnd,IDC_Userliste);

dann lasse ich mir in meiner liste der inhalt angezeigen:
SendMessage(hwnd_CB,CB_ADDSTRING,0,(long)&User[0]);

aber wie, bekomme ich das ausgewählte listenelement?
BILD

wie - also ein programmbeispiel wäre mir lieber :-) - bekomme ich den wert "ICH" zurückgeliefert? :(
 
Ich meinte eher das "ist vielleicht unverschämt zu fragen" ;-)


// Mit

LRESULT cbItem = SendMessage(hwnd_CB, CB_GETCURSEL, 0, 0);

// erhältst du den Index des selektierten Items oder CB_ERR falls nichts selektierts ist.

if(lbITem != CB_ERR)
{
char pszBuffer[256] = ""; // muss lang genug sein um den text aufzunehmen
// ansosnsten kann man mit CB_GETLBTEXTLEN zuerst die Länge des Strings abfragen
// und dann den entsprechenden Buffer reservieren.
// LRESULT len = SendMessage(hwnd_CB, CB_GETLBTEXTLEN, 0, 0);
SendMessage(hwnd_CB, CB_GETLBTEXT, (WPARAM) cbItem, (LPARAM) (LPCSTR) pszBuffer);
// CB_GETLBTEXT liefert die Länge des Strings als result von SendMessage zurück (falls benötigt).
// pszBuffer enthält jetzt den selektierten String
}
 
Zurück