Einzelnen Beitrag anzeigen

nsamaster

Registriert seit: 12. Jun 2002
Ort: BRD umd die ecke links und dann immer gerade aus
31 Beiträge
 
#4

Re: SubMenüs in fremden Applikationen

  Alt 12. Sep 2006, 17:41
Hallo! Hier der Code.

Die erste Procedure erstellt ein Menü in einer anderen Anwendung, inklusive SubMenü.
Wenn ich den Code in eine Procedure übernehmen will, welche ein SubMenü anlegt geht da leider irgendetwas schief...
Ich weiß nicht was...

Die Aufrufe der Procedure sollte klar sein, HWND ist das Handle der Applikation, in welche das Menü rein soll.

@Olli:

Die Proceduren stecken in einer DLL, welche noch von anderen Programmen aufgerufen werden kann. Es sollte sich irgendwann um ein Plugin für eine bestimmte Applikation handeln, welche dann auch nur mit dieser funktioniert.

Delphi-Quellcode:

...
Type
  TChar128 = array[0..128] of Char;
...

// Diese Funktion erstellt auch nur ein Menü, allerdings habe ich hier
// zeigen wollen wie man in den einzelnen Menü's Untermenüs einfügt.
// An einer Prozedure für Untermenüs wird gearbeitet.
procedure nAddMenu(wnd: hwnd; MainMenuName: TChar128);
  var
    I: Integer;
    Menu, MyMenu, hMnu2: HMENU;
    Buffer: array [0..128] of Char;
    mii: TMenuItemInfo;
  begin
    Menu := GetMenu(Wnd); // Menü-Handle ermitteln
    zeroMemory(@Buffer, SizeOf(Buffer));
    if Menu <> 0 then
    begin
      I := 0;
      while I < GetMenuItemCount(Menu) do // wenn Menü vorhanden, dann weiter
      begin
        GetMenuString(Menu, I, Buffer, SizeOf(Buffer), MF_BYPOSITION);
        if Buffer = MainMenuName then // Wenn eigener Menüeintrag vorhanden
          Break; // Abbruch!
        Inc(I);
      end;
      if I < GetMenuItemCount(Menu) then
        Exit;

      MyMenu := CreateMenu; // Hauptmenüpunkt erstellen

      AppendMenu(MyMenu, MF_STRING or MF_ENABLED, 40001, 'Test0&1'); // Menüeintrag
      AppendMenu(Menu, MF_STRING or MF_POPUP, UINT(MyMenu), MainMenuName); // Menüname

      hMnu2 := CreatePopupMenu(); // Untermenü erstellen
      AppendMenu(hMnu2, MF_STRING, 40002, 'Untermenü2'); // Untermenüeinträge

      // Das Untermenü erhält den Text "Weiter"
      // Hier wird die Bezeichnung des Untermenüs definiert.
      // Mit AppendMenu (s.o.) wird in hMnu2 die eigentlichen Items eingefügt
      mii.cbSize := sizeof(TMenuItemInfo);
      mii.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
      mii.wID := 40003;
      mii.hSubMenu := hMnu2;
      mii.dwTypeData := PAnsiChar('Untermenü');
      AppendMenu(MyMenu, MF_STRING or MF_BYPOSITION or MF_POPUP, hMnu2, 'Weiter');

      // zweites Untermenü
      hMnu2 := CreatePopupMenu;
      // diesmal mit zwei Einträgen
      AppendMenu(hMnu2, MF_STRING, 40005, 'TEST NUN ABER');
      AppendMenu(hMnu2, MF_STRING, 40006, 'Weiter');

      // Untermenü definieren.
      mii.cbSize := sizeof(TMenuItemInfo);
      mii.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
      mii.wID := 40004;
      mii.hSubMenu := MyMenu;
      mii.dwTypeData := PAnsiChar('test3');
      AppendMenu(MyMenu, MF_STRING or MF_BYPOSITION or MF_POPUP, hMnu2, 'Test 03');
    end;
  end;

procedure AddSubMenu(wnd: hwnd; InMainMenu: TChar128; MenuItem: TChar128; ID: Integer);
var
  I, J: Integer;
  MenuHnd, MyMenu, hMnu2: HMENU;
  Buffer: array [0..128] of Char;
  MenuInfo: TMenuItemInfo;
begin
  MenuHnd := GetMenu(wnd); // Menu-Handle ermitteln
  zeroMemory(@Buffer, SizeOf(Buffer)); // Buffer initialisieren
  if MenuHnd <> 0 then // Wenn Menu-Handle gefunden wurde dann weiter
  begin
    I := 0; // Zähler für MenuItems
    J := GetMenuItemCount(MenuHnd); // Items des Menu's "MenuHnd" ermitteln und in "J" speichern
    while I < J do // Solange der Zähler "I" kleiner ist als die Anzahl
                    // der Menüs dann weiter
    begin
      GetMenuString(MenuHnd, I, Buffer, SizeOf(Buffer), MF_BYPOSITION); // Menünamen ermitteln und in "Buffer" speichern
      If Buffer = MenuItem Then // InMainMenu gefunden...
      begin
        Break;
      end
      Else begin
        hMnu2 := CreatePopupMenu();
        AppendMenu(hMnu2, MF_STRING, 40002, 'Untermenü2'); // Untermenüeinträge

        MenuInfo.cbSize := SizeOf(TMenuItemInfo);
        MenuInfo.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
        MenuInfo.wID := ID;
        MenuInfo.hSubMenu := hMnu2;
        MenuInfo.dwTypeData := MenuItem;
        InsertMenuItem(MenuHnd, 1, FALSE, MenuInfo);
      end;
      inc(I);
    end;
  end;
end;
  Mit Zitat antworten Zitat