Combobox abfrage ??CBN_EDITCHANGE??
-
Hallo,
bisher habe ich den inhalt einer combobox immer durch drücken auf einen button o.ä. per GetItemText() ausgelesen, jetzt möchte ich aber sofortig auf das auswählen eines items der combobox regieren
z.b. eine combobox hat den inhalt 1,2,3 und ich möchte, dass sich sobald 3 ausgewählt wurde ein dialogfenster öffnet
-> in der msdn habe ich "CBN_EDITCHANGE" gefunden, aber ich verstehe nicht ganz wo in meinem programm ich das einbauen müsste
schonmal vielen dank für jegliche hilfe
mfg Lukas
-
Du musst in deiner WindowProc/WndProc auf WM_COMMAND reagieren.
Mal grob (ungeprüft) müsste das ungefähr so aussehen:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_COMMAND: // In HIWORD(wParam) steht z.B. CBN_EDITCHANGE // In LOWORD(wParam) steht eine evtl. vergebene ID des Controls // In lParam steht das Handle des Controls if (HIWORD(wParam)==CBN_EDITCHANGE) { MessageBox(NULL,TEXT("CBN_EDITCHANGE ist aufgetreten!"),TEXT("Bla"),MB_OK); } break; case xyz: .... default: return DefWindowProc(hWnd,uMsg,wParam,lParam); break; } return 0; }
-
case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); if (wmEvent==CBN_EDITCHANGE) { MessageBox(NULL,_T("Aufgetreten"),_T("Fehler"),MB_OK); }also eigentlich hatte ichs schon genau so aber da passiert nichts
wo muss ich angeben von welcher combobox CBN_EDITCHANGE kommt?MfG Lukas
edit: es geht jetzt mit CBN_SELCHANGE laut msdn müsste das andre auch gehn aber ok ...
hab noch ne frage -> ich bin auf anraten hier im forum von bloodshed dev c++ zu vc++2010 express umgestiegen leider gelingen mir jetzt die einfachsten sachen nichtmehr
ich frage mit:
char entry[20]; GetWindowText(selectuserCombo, entry, sizeof(entry));den inhalt einer combobox ab -> unter dev c++ klappt der code einwandfrei
unter vc++ bekomme ich beim compilieren den fehler:
error C2664: 'GetWindowTextW': Konvertierung des Parameters 2 von 'char [20]' in 'LPWSTR' nicht möglichworan kann das liegen?
-
Das ist ein häufiges Problem

In Visual Studio ist seit einiger Zeit per default Unicode-Unterstützung an (damit arbeitet Windows seit Windows 2000 rum intern)Du hast also 2 Möglichkeiten:
1. Du schaltest Unicode ab (In den Projekteigenschaften den Zeichensatz auf Multibyte stellen)2. Du machst dein Projekt Unicode-fähig, ganz grob:
// Das hier... char bla[500]; // ...durch dieses ersetzen: TCHAR bla[500]; // statt z.B.: MessageBox(NULL,"Hallo!","Titel",MB_OK); // nun: MessageBox(NULL,TEXT("Hallo!"),TEXT("Titel"),MB_OK); // oder auch: MessageBox(NULL,_T("HallO!"),_T("Titel"),MB_OK);
-
welche mögllichkeit ist "besser"?
-> kann es zu problemen kommen, wenn ich multibyte benutze?
ich denke es ist sicherlich sinnvoller unicode zu benutzen ... die menschen werden sich ja schon was dabei gedacht haben.-> gibt es noch andere änderungen auser _T(x)?
-> kann ich unter unicode problemlos die <string> klasse benutzen?MfG lukas
-
Die TCHAR-Variante ist meiner Meinung nach besser.
Quellcode der TCHAR benutzt, kann nämlich sowohl mit Multibyte als auch mit Unicode kompiliert werden. Und bei aktiviertem Unicode spart man zumindest das Windows sich die Strings erst selbst in Unicode konvertieren muss.TCHAR wird ohne Unicode zu char
TCHAR wird mit Unicode zu wchar
Bei _T() bzw. TEXT() hat man denselben Effekt.Mit dem C++ std::string kenne ich mich nicht wirklich aus, aber ich glaube da gibt es auch sowas wie tstring (oder zumindest wstring bei Microsoft Compilern)?
-
In diesem Fall hätte auch ein GetWindowTextA(...) das Problem locker gelöst

-
ich denke ich wähle lösung 1 so wie ich das sehe hat string.h probleme mit TCHAR
trotzdem vielen dank für eure hilfe
MfG Lukas
-
hallo
Ich hab doch nochmal ne verständinssfrage bei meiner ersten frage.LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_COMMAND: // In HIWORD(wParam) steht z.B. CBN_EDITCHANGE // In LOWORD(wParam) steht eine evtl. vergebene ID des Controls // In lParam steht das Handle des Controls if (HIWORD(wParam)==CBN_EDITCHANGE) { MessageBox(NULL,TEXT("CBN_EDITCHANGE ist aufgetreten!"),TEXT("Bla"),MB_OK); } break; case xyz: .... default: return DefWindowProc(hWnd,uMsg,wParam,lParam); break; } return 0; }der code funktioniert einwandfrei -> wird aber immer aufgerufen, wenn in irgendeiner combobox ein eintrag verändert wird -> was jedoch, wenn ich mehrere comboboxen habe? wie kann ich da eine unterscheidung treffen?
MfG Lukas
-
// In LOWORD(wParam) steht eine evtl. vergebene ID des Controls
// In lParam steht das Handle des ControlsDu kannst also entweder den Comboboxen verschiedene IDs geben (Bei Controls wird bei CreateWindow() der hMenu-Parameter benutzt um eine ID zu setzen)
#define COMBOBOX1_ID 120 // .... CreateWindowEx(...,(HMENU)COMBOBOX1_ID,...); // if (LOWORD(wParam)==COMBOBOX1_ID) { // Combobox1 hats ausgelöst.. }...oder du vergleichst das Handle:
HWND meineCombobox1=CreateWindowEx(....); // .. if (meineCombobox1==(HWND)lParam)) { // Combobox1 hats ausgelöst }