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öglich

    woran 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 Controls

    Du 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
    }
    

Anmelden zum Antworten