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/)
-   -   OwnerDrwaMenu und Tastaturshortcuts (https://www.delphipraxis.net/51191-ownerdrwamenu-und-tastaturshortcuts.html)

Luckie 8. Aug 2005 01:31


OwnerDrwaMenu und Tastaturshortcuts
 
Ich zeichne meine Menüs selber, weil ich Bitmaps davor angezeigt haben will.
Delphi-Quellcode:
WM_MEASUREITEM:
      begin
        mi := PMEASUREITEMSTRUCT(lParam);
        case mi.CtlType of
          ODT_MENU:
            begin
              mi.itemWidth := 150;
              mi.itemHeight := 18;
            end
        end;
      end;
    WM_DRAWITEM:
      begin
        di := PDRAWITEMSTRUCT(lParam);
        case di.CtlType of
          ODT_MENU:
            begin
              SetBkMode(di.hDC, TRANSPARENT);
              if (di.itemState and ODS_SELECTED = ODS_SELECTED) then
              begin
                di.rcItem.Left := di.rcItem.left + 20;
                FillRect(di.hDC, di.rcItem, GetSysColorBrush(COLOR_HIGHLIGHT));
                SetTextColor(di.hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
                DrawText(di.hDC, PChar(di.itemData), lstrlen(PChar(di.itemData)), di.rcItem, DT_SINGLELINE or DT_LEFT or
                  DT_VCENTER);
              end
              else
              begin
                di.rcItem.Left := di.rcItem.left + 20;
                FillRect(di.hDC, di.rcItem, GetSysColorBrush(COLOR_MENU));
                SetTextColor(di.hDC, GetSysColor(COLOR_MENUTEXT));
                DrawText(di.hDC, PChar(di.itemData), lstrlen(PChar(di.itemData)), di.rcItem, DT_SINGLELINE or DT_LEFT or
                  DT_VCENTER);
              end;
              if (di.itemState and ODS_GRAYED = ODS_GRAYED) then
              begin
                FillRect(di.hDC, di.rcItem, GetSysColorBrush(COLOR_BTNFACE));
                SetTextColor(di.hDC, GetSysColor(COLOR_GRAYTEXT));
                DrawText(di.hDC, PChar(di.itemData), lstrlen(PChar(di.itemData)), di.rcItem, DT_SINGLELINE or DT_LEFT or
                  DT_VCENTER);
              end;
              di.rcItem.Left := di.rcItem.left - 20;
              MenuBmp(hDlg, di.rcItem, di.itemID, di.hDC);
            end;
        end;
      end;
Jetzt steht dazu im PSDK:
Zitat:

To get keyboard accelerators to work with bitmap or owner-drawn menu items, the owner of the menu must process the WM_MENUCHAR message. For more information, see Owner-Drawn Menus and the WM_MENUCHAR Message.
Sprich, ich muss die Nachricht WM_MENUCHAR selber behandeln. Im PSDK steht dazu:
Zitat:

An application that processes this message should return one of the following values in the high-order word of the return value.

MNC_IGNORE Informs the system that it should discard the character the user pressed and create a short beep on the system speaker.
MNC_CLOSE Informs the system that it should close the active menu.
MNC_EXECUTE Informs the system that it should choose the item specified in the low-order word of the return value. The owner window receives a WM_COMMAND message.
MNC_SELECT Informs the system that it should select the item specified in the low-order word of the return value.
Näheres im MSDN: http://msdn.microsoft.com/library/de...m_menuchar.asp

Da es sich bei mir um einen Dialog handelt, dachte ich, müsste es so aussehen:
Delphi-Quellcode:
    WM_MENUCHAR:
      begin
        SetWindowLong(hDlg, DWL_MSGRESULT, MakeLong(loword(wParam), MNC_SELECT));
      end;
Nur leider tut sich da nichts. Zur Erklärung was passieren sollte: Öffnet man ein Menü mit der Alt-Taste und dem unterstrichenen Buchstaben, kann man in dem dort aufklappenden Menü einen Item auswählen, in dem man den entsprechend unterstrichenen Buchstaben des Menüitems wählt. Zum Beispiel: Alt+D öffnet das Dateimenü und ein weiter Druck auf den Buchstaben 'S' wählt den Menüpunkt 'Speichern' aus.

Olli 8. Aug 2005 12:33

Re: OwnerDrwaMenu und Tastaturshortcuts
 
Schicke mir mal deinen Code zu und ich gucke mal drüber.

Luckie 8. Aug 2005 12:37

Re: OwnerDrwaMenu und Tastaturshortcuts
 
Geht nicht ganz so einfach, ich teste das gerade am Usermanager. Aber ich werde heute iom Laufe des Tages noch mal ein Demoprojekt machen.

Olli 8. Aug 2005 12:44

Re: OwnerDrwaMenu und Tastaturshortcuts
 
Dann schick mir halt den Code vom Usermanager. Wo ist das Problem? Hattest mir doch sowieso mehrfach angeboten, den zuzuschicken. Soll mir dann auch egal sein. Keine Angst, ich verkaufe ihn nicht :mrgreen: ... ich persönlich habe mehr Angst, daß man ihn mir klauen könnte und dann weitergibt, was ich wiederum dir gegenüber verantworten müßte. Deswegen habe ich bisher abgelehnt. Wenn dann auf jeden Fall per Email schicken!

Luckie 8. Aug 2005 12:46

Re: OwnerDrwaMenu und Tastaturshortcuts
 
Hehe, das meinte ich nicht. Es wäre bestimmt einfacher für dich, wenn du den ganzen Code drumrum nicht hättest. Ich schnüre dann mal das Packetchen.

Olli 8. Aug 2005 12:50

Re: OwnerDrwaMenu und Tastaturshortcuts
 
Na so schlimm wird der Code drumherum ja nicht sein :lol: ... oder doch? :zwinker:

Luckie 8. Aug 2005 12:56

Re: OwnerDrwaMenu und Tastaturshortcuts
 
Nun ja, Motzi hat das ein oder andere etwas verschönert. ;)

Er ist unterwegs. Zwei Sachen gleich noch:
1. Normalerweise werden die Bitmaps von menüs ja so etwas erhaben dargestellt, wenn man mit der Maus über den Item fährt, das habe ich auch noch nicht. Und
2. Die vertiefte Darstellung von deaktivierten Items. Die sind bei mir bisher einfach grau.

Ich weiß auchn icht, wie es unter XP mit Themes aussieht. :roll:

Olli 8. Aug 2005 13:02

Re: OwnerDrwaMenu und Tastaturshortcuts
 
Zitat:

Zitat von Luckie
Nun ja, Motzi hat das ein oder andere etwas verschönert. ;)

Naja, weiß nicht ob mir dazu aktuell nicht etwas die Zeit fehlt, aber deine Probleme schaue ich mir mal an.

Es ist angekommen.

Zitat:

Zitat von Luckie
1. Normalerweise werden die Bitmaps von menüs ja so etwas erhaben dargestellt, wenn man mit der Maus über den Item fährt, das habe ich auch noch nicht. Und
2. Die vertiefte Darstellung von deaktivierten Items. Die sind bei mir bisher einfach grau.

Ich denke dafür gibt es genau eine Funktion, bin aber nicht mehr sicher. Immerhin liegt es auch schon wieder 4 Jahre zurück, daß ich mit dem damaligen PSDK auf du und du war ;) - beim neuen reicht die Zeit aktuell einfach nicht für so intensive Studien.

Zitat:

Zitat von Luckie
Ich weiß auchn icht, wie es unter XP mit Themes aussieht. :roll:

Müßte ich mal testen *g*

Es handelt sich doch ums Hauptmenü, denke ich mal? Oder ist es offensichtlich?

Luckie 8. Aug 2005 13:11

Re: OwnerDrwaMenu und Tastaturshortcuts
 
Es handelt sich um das Menü des Hauptfensters, sollte aber auch offensichtlich sein, da es zu Testezwecken nur aus drei Punkten besteht. Das original Menü ist noch in der Ressource drinne, nur eben im Moment nicht mit dem Hauptfenster verknüpft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 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