Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi NONVCL: Dialog und Accelerator (https://www.delphipraxis.net/35144-nonvcl-dialog-und-accelerator.html)

OLLI_T 3. Dez 2004 08:43


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:
    If (TranslateAccelerator(AccelWnd,Accel,Msg)=0) Then Begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    End;
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 ...

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

OLLI_T 3. Dez 2004 11:21

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!

Assarbad 5. Dez 2004 21:58

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?

Luckie 6. Dez 2004 01:21

Re: NONVCL: Dialog und Accelerator
 
So sollte das Hauptprogramm aussehen:
Delphi-Quellcode:
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.
Die Shortcuts werden dabei aus einem Acceleratortable aus der Resource geladen.
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 11:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz