WC_COMBOBOX (Dropdown-Liste) mit der Maus auswählen funktioniert nicht
-
Hallo zusammen!
Ich habe ein etwas komplexeres Problem und finde leider nichts gescheites darüber im Internet.
Ich habe zwei Hauptfenster: im einen rendere ich etwas mit DirectX9 während ich in dem anderen Windows-GUI Elemente wie SysListView32, Buttons usw. drin hab um das Rendern zu steuern...
Nun habe ich auf dem Kontrollfenster eine Combobox (genauer gesagt eine Dropdownliste) erzeugt.
SelectListTest=CreateWindowEx(NULL,WC_COMBOBOX,TEXT(""),WS_CHILD|CBS_DROPDOWNLIST|WS_VISIBLE,10,10,100,100,hWnd,NULL,GetModuleHandle(nullptr),NULL); SendMessage(SelectListTest,CB_ADDSTRING,0,reinterpret_cast<LPARAM>((LPCTSTR)TEXT("Testauswahl 1"))); SendMessage(SelectListTest,CB_ADDSTRING,1,reinterpret_cast<LPARAM>((LPCTSTR)TEXT("Testauswahl 2"))); SendMessage(SelectListTest,CB_ADDSTRING,2,reinterpret_cast<LPARAM>((LPCTSTR)TEXT("Testauswahl 3")));
und so weiter..
Das komische ist: wenn ich diesen Code in ein rohes Gerüst (ein neues Projekt also) einer Win32 Anwendung einbaue, funktioniert alles einwandfrei.
Wenn ich das aber nun in dem Kontrollfenster einbaue, kann ich es nur mit der Tastatur steuern. Schlimmer noch: beim Auswählen eines Items mit der Maus hängt sich das Programm kurzzeitig auf
Hier noch ein Screenshot zum Verständnis:
http://img4.fotos-hochladen.net/thumbnail/beispielh3jxsdfza2_thumb.jpgUnd hier noch die Nachrichtenverarbeitungsschleife:
// Daten MSG msg,msg2; ZeroMemory(&msg,sizeof(msg)); ZeroMemory(&msg2,sizeof(msg2)); while(msg.message!=WM_QUIT) { // Renderfenster if(PeekMessage(&msg,hWnd,NULL,NULL,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } // Kontrollfenster if(PeekMessage(&msg2,hEingabe,NULL,NULL,PM_REMOVE)) { TranslateMessage(&msg2); DispatchMessage(&msg2); } // Rendern Grafik.m_lpDevice->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,NULL); Grafik.m_lpDevice->BeginScene(); Hintergrund.Zeichnen(hWnd); if(Status.GetStatus()==STATUS_VORRUNDE) { VDisplay.Zeichnen(hWnd); Overlay.Zeichnen(hWnd); Rundenanzeige.Zeichne(hWnd,TEXT("Vorrunde")); } ZeitVerwalter.ZeichneUhrzeit(hWnd); Grafik.m_lpDevice->EndScene(); Grafik.m_lpDevice->Present(NULL,NULL,NULL,NULL); }
Ich bin sehr dankbar für jegliche Hilfe oder einen Hinweis der zur Lösung des Problems beitragen könnte
Vielen Dank,
Johannes Schneider.
-
Deine Messageloop darf nicht nur die Nachrichten von diesen zwei Fenstern bearbeiten.
Die ComboBox erzeugt dynamisch ein Dropdown, und diese Nachrichten werden nicht abgehaolt.
Warum holst Du nicht grundsätzlich alle Nachrichten mit PeekMessage ab?
-
Dank ihnen habe ich das Problem nun behoben: vielen Dank!!
An alle die ähnliche Probleme haben:
Ich habe meine (zuvor "selbstentworfene") Nachrichtenverarbeitungsschleife nun so angepasst, dass sie einfach alle Nachrichten mit PeekMessage abfängt und verarbeitet:if(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); }
Hier ist der MSDN Artikel zu PeekMessage mit NULL als HWND-Parameter:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.85).aspx