Problem mit BS_DEFPUSHBUTTON
-
Hi Leutz!
Folgendes: Ich habe ein Fenster, das ich als Dialog verwende (also mit CreateWindow() erstellt). Darauf befinden sich mehrere Buttons, eine ListBox und ein Eingabefeld. Einer der Buttons wurde mit BS_DEFPUSHBUTTON erzeugt und ist dementsprechend auch bei der Laufzeit des Programms markiert (also fetter Rand). Wenn ich aber nun z.B. in der Listbox bin, oder gar keine Komponente meines Fensters den Fokus hat, und ich Enter drücke, passiert gar nichts. Nur wenn ich vorher den Fokus auf den Button mit SetFocus() setze gehts. Um diesen Effekt immer zu erreichen, setze ich den Fokus nun jedes mal wenn das WM_COMMAND für den Button ausgeführt wurde wieder auf den Button. Aber eigentlich sollte dieser Button ausgeführt werden wenn ich, egal wo, auf dem Fenster Enter drücke.
Versteht ihr was ich meine?
Ich dachte erst es läge an meinem Message-Loop, den Fehler konnte ich auch beheben (sieht jetzt wie unten aus) nur liegt das Problem wohl noch woanders.
So sieht mein Code (Auszüge) aus:
[...] //Fenster erzeugen hWin = CreateWindowEx (0, szAppName, "", WS_CAPTION | WS_SYSMENU | WS_BORDER | WS_SIZEBOX, 0, 0, 400, 200, NULL, NULL, hInstance, NULL); hList = CreateWindowEx(WS_EX_CLIENTEDGE ,"listbox", NULL, WS_CHILD | WS_VISIBLE | ES_LEFT | WS_VSCROLL | LBS_NOINTEGRALHEIGHT , 0, 0, 185, 140, hWin, (HMENU) LIST, hInstance, NULL) ; SendMessage(hList, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); hButton1 = CreateWindowEx(0, "button", "&Ok", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 1, 185, 100, 25, hWin, (HMENU) BUTTON1, hInstance, NULL) ; SendMessage(hButton1, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); hButton2 = CreateWindowEx(0, "button", "&Cancel", WS_CHILD | WS_VISIBLE, 300, 185, 100, 25, hWin, (HMENU) BUTTON2, hInstance, NULL) ; SendMessage(hButton2, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); [...] SetFocus(hButton1); //Fokus setzen while(GetMessage(&msg, NULL, 0, 0)) { //Abfangen von Dialog Messages if(!IsDialogMessage(GetForegroundWindow(), &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } [...] //In der WndProc... case WM_COMMAND: if(hWnd == hWin) { if(LOWORD(wParam) == BUTTON1) { MessageBox(NULL, "Test", "", 0); SetFocus(hButton1); //Erneutes setzen } } return 0;Könnt ihr mir helfen??
Danke & Gruss,
code_pilot :p
-
Ich weiß, in der WinAPI ist das mit Fokus und bestimmte Tasten belegen immer so ein Problem. Wenn Du unbedingt auf der Entertaste den Button aktivieren willst, würde sich das z.B. schonmal mit
RegisterHotKey()
lösen lassen.
-
Keine Ahnung, ob's daran liegt, aber setz doch mal bei IsDialogMessage anstelle von GetForegroundWindow() das Handle deines Hauptfensters (also hWin) ein.
-
Du solltest am besten die DefDlgProc benutzen.
(Dazu muss man beim Registrieren der Fensterklasse cbWndExtra noch auf DLGWINDOWEXTRA setzen)Dann wird der Fokus immer wieder hergestellt und du brauchst es nicht immer seltst machen wie nach der MessageBox.
-
Hallo, danke erstmal ich werds mir mal anschauen... ach ja HotKeys haben mich sowieso schonmal interessiert

~cp
-
und dem Button noch die ID IDOK geben. Hotkeys brauchst du für diesen Fall nicht.
-
Warum das?
Ich kann das define doch nennen wie ich will oder wie oder wat (oder wer oder warum und ... wieso eigentlich oder wie oder wat ...)~cp

-
BS_DEFPUSHBUTTON ist nur der Startzustand. Wenn du einen anderen Button anklickst, bekommt dieser den DEFPUSHBUTTON-Status. Wenn die Listbox den Focus bekommt, wird der Button mit der ID IDOK zum DEFPUSHBUTTON.
-
Anstatt BUTTON1 schreibst du einfach IDOK hin. (das ist schon definiert)
-
Stimmt, so is dat. Ich würde dir außerdem empfehlen, für den Dialog ein Resource-Skript zu erstellen. Dann brauchst du erstens nicht die ganzen CreateWindow's in deinem Code, und zweitens sieht der Dialog dann auf jedem System und bei jeder Auflösung gleich aus. Zur Zeit ist der Dialog bei 600x800-Auflösung riesig.