![]() |
NONVCL: Dialog und Accelerator
Guten Morgen Allerseits!
Ich werd noch bekloppt! :wall: In einem Dialog sollen diverse Einstellungen, die graphisch dargestellt werden, schnell via Tastatur ausgewählt werden. Also hab ich munter meine Ressourcen um eine Accelerator Tabelle erweitert und die Mainloop des Programms entsprechend aufgebohrt. AccelWnd ist das Handle des Fensters, das den Tastendruck verarbeiten soll.
Delphi-Quellcode:
Funktioniert bis dahin alles wunderbar. Der Accelerator hat ein gültiges Handle und das Hauptfenster meiner Anwendung bekommt Post in Form einer WM_COMMAND Message. Dieses Fenster wird übrigens mit CreateWindowEx erzeugt ...
If (TranslateAccelerator(AccelWnd,Accel,Msg)=0) Then Begin
TranslateMessage(Msg); DispatchMessage(Msg); End; Das Dumme ist nur, dass die Accelerator-Geschichte für eine Dialog gedacht, ist der vom Hauptfenster mit DialogBoxParam geöffnet wird. Tja und an dieser Stelle schweigt der Accelerator. Hat sich was mit WM_COMMAND. (Wobei ESCAPE und ENTER wunderbar funktionieren). Was ist da los? Wollen Accelerator und Dialoge nicht miteinander? :gruebel: Vielen Dank schon mal Der OLLI |
Re: NONVCL: Dialog und Accelerator
Habe einen Workaround gestrickt, der mir alle WM_CHAR Messages brav an eine Prozedur weiterleitet. :-D
Trotzdem würde mich brennend interessieren, ob Dialoge nix mit Accelerators anfangen können! |
Re: NONVCL: Dialog und Accelerator
Schonmal versucht mit TranslateAccelerator() und IsDialogMessage() in Folge eine eigene Message-Loop für den Dialog aufzubauen? Also statt der Loop, die von DialogBoxParam() und Konsorten vorgegeben werden?
|
Re: NONVCL: Dialog und Accelerator
So sollte das Hauptprogramm aussehen:
Delphi-Quellcode:
Die Shortcuts werden dabei aus einem Acceleratortable aus der Resource geladen.
begin
{ tooltips } InitCommonControls; CreateDialog(hInstance, MAKEINTRESOURCE(100), 0, @dlgfunc); { load acceltable } hAccelTbl := LoadAccelerators(hInstance, MAKEINTRESOURCE(4000)); while true do begin if not GetMessage(msg, 0, 0, 0) then break; { no accel was pressed, go ahead } if TranslateAccelerator(hApp, hAccelTbl, msg) = 0 then { it is no dialog message, go ahead } if IsDialogMessage(hApp, msg) = FALSE then begin TranslateMessage(msg); DispatchMessage(msg); end; end; ExitCode := msg.wParam; end. WM_COMMAND dann entsprechend:
Delphi-Quellcode:
WM_COMMAND:
begin { accel for closing the dialog with ESC } if wParam = ID_CANCEL then SendMessage(hDlg, WM_CLOSE, 0, 0); { button and menu clicks } if hiword(wParam) = BN_CLICKED then begin case LoWord(wParam) of IDC_BTNABOUT: MyMessageBox(hDlg, APPNAME, INFO_TEXT, 2); IDC_BTNCLOSE: SendMessage(hDlg, WM_CLOSE, 0, 0); end; end; { accelerators } if hiword(wParam) = 1 then begin case loword(wParam) of ID_ACCEL_CLOSE: SendMessage(hDlg, WM_CLOSE, 0, 0); end; end; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz