Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 242951 (4387)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Menüs mit Api erzeugen
Philipp Sternberg
| Datum:25.05.02 11:24 (ps@burghardt-ib.de) |
Hallo, damit ich ein Menü z.B.(Datei Berabeiten) usw. auch in RebarControl setzen und dem Menu auch kleine Bitmpas und ähnliches zuordnen kann wollte ich mit den Apifunktionen Menüs erstellen. Dazu muss ich die Struktur MENUITEMINFO ausfüllen, danch kann ich ein MenüItem einem Menü hinzufügen. Mit Hilfe einer Prozedur fülle ich diese Struktur nun aus. Wenn ich dann die Funktion let MenuHandle& = @CreateApiMenu() 'user32.dll:CreateMenu @InsertMenuItem (MenuHandle&,0,1,@addR(MENUITEMINFO#)) 'user32.dll:InsertMenuitemA ausführe, dann schlägt die Funktion fehl und mit Hilfe von user32.dll:GetLastError bekomme ich Fehler Nummer 87. Im MSDN steht bei Fehler 87: The parameter is incorrect. ERROR_INVALID_PARAMETER Na schön nur welcher Parameter ist das ???? Einer der 4 von InsertMenuItem oder einer der Werte aus MENUITEMINFO oder hab ich was ganz grundliegend falsch gemacht ?? Danke für eure Antworten Philipp
Uwe ''Pascal'' Niemeier
| Datum:25.05.02 14:00 (Pascalxd@owl-online.de) |
Hallo Philipp! Wenn eine API-Funktion nach einer Struktur verlangt, musst du nicht erst den Zeiger darauf ermitteln; die Bereichsvariable im Quelltext *ist* bereits der Pointer. Also muss es so heissen: InsertMenuItem(MenuHandle&,0,1,MENUITEMINFO#) (eben ohne @Addr) Wer's genau wissen will: @Addr(Bereich#) liefert einen Pointer auf die Speicherstelle, an der der Pointer von Bereich# steht... HTH Pascal
Philipp Sternberg
| Datum:25.05.02 15:16 (ps@burghardt-ib.de) |
Oh Danke, die Frage hatte mich auch schon anderweitig beschäftigt, ich dachte in diesem Fall hätte das seine Richtigkeit, da ich bei direkter Übergabe des Bereichs eine Exception EAcces Violation auftritt. In denm Fall bedutet das wahrscheinlich aber nur, dass die funktion an sich zwar startet, ich jedoch irgendwelchen Unsinn in die Struktur initialisiert hatte und die Funktion darauf mit "Absturz" reagiert Bis dann, Philipp
Uwe ''Pascal'' Niemeier
| Datum:25.05.02 17:17 (Pascalxd@owl-online.de) |
Hallo Philipp! Stimmt denn der Wert von cbSize (müsste 44 sein) ? Oder verwendest du die Windows.ph? Darin sind die CreateMenu-API's falsch definiert :-{ Hier noch eine einfache Möglichkeit, freie Menüs ohne MENUITEMINFO# zu erzeugen:
    def CreateMenu(0) !"USER32","CreateMenu"

    popup "Projekt"
       appendmenu 2001,"Neues Projekt"
       appendmenu 2002,"Projekt öffnen"
       appendmenu 2003,"Projekt speichern"

    Menu&=~GetSubMenu(&hmenu,0)
    ~RemoveMenu(&hMenu,0,1024)
    ~DrawMenuBar(%hwnd)

    MenuA&=~GetSubMenu(&hmenu,0)
    ~RemoveMenu(&hMenu,0,1024)
    ~DrawMenuBar(%hwnd)

    MenuB&=CreateMenu()
    a$="Test"
    ~InsertMenu(MenuB&,0,~MF_STRING | ~MF_POPUP,MenuA&,addr(a$) )
    ~SetMenu(dlg&,MenuB&)
BTW: Ob's generell möglich ist, Rebars mit eigenen Menüs zu versehen, habe ich noch nicht probiert. Müsstest du dazu nicht Handles der einzelnen Bänder haben? HTH Pascal
Philipp Sternberg
| Datum: 26.05.02 18:28 (ps@burghardt-ib.de) |
ich habs noch nicht ausprobiert das menu in die Rebar zu setzen, ein Bandandle zu bekommen sollte aber kein Problem sein, da man das Band ja selbst erstellt. Meine MENUITEMINFO hat übrigens ne Größe von 48. Damit funktionieren meine Menüs bestens !
    struct MenuItemInfo = cbSize&,fMask&,fType&,fState&,wID&,hSubMenu&,hbmpChecked&,hbmpUnchecked&,dwItemData&,dwTypeData&,cch&,hbmpItem&
    proc InsertMenuItemEx
    parameters Menu_handle&,fMask&,fType&,fState&,wID&,hSubMenu&,hbmpChecked&,hbmpUnchecked&,dwItemData&,hbmpItem&,ItemText$,Menu_Pos%
    declare back&
    dim MenuItemInfo#,MenuItemInfo
    let MenuItemInfo#.cbSize& = 48
    let MenuItemInfo#.fMask& = fMask&
    let MenuItemInfo#.fType& = fType&
    let MenuItemInfo#.fState& = fState&
    let MenuItemInfo#.wID& = wID&
    let MenuItemInfo#.hSubMenu& = hSubMenu&
    let MenuItemInfo#.hbmpChecked& = hbmpChecked&
    let MenuItemInfo#.hbmpUnchecked& = hbmpUnchecked&
    let MenuItemInfo#.dwItemData& = dwItemData&
    let MenuItemInfo#.dwTypeData& = @addR(ItemText$)
    let MenuItemInfo#.cch& = @len(ItemText$)
    let MenuItemInfo#.hbmpItem& = hbmpItem&
    let back& = @InsertMenuItem (Menu_handle&,Menu_Pos%,1,MenuItemInfo#)
    dispose MenuItemInfo#
    return back&
    endproc
Mit folgendem Aufrufen lässt sic dann auch tatsichlich eii MenüPunkt erzeuegen:
    let Menu_Leiste& = @CreateMenuEx()
    @SetMenu(%hwnd,Menu_Leiste&)

    'Menü "Datei" erzeugen
    let Menu_Datei& = @CreatePopupMenu()

    'Menüpunkt "Datei" erzeugen, das Menü "Datei" dranbinden und alles initialisieren
    InsertMenuItemEx Menu_Leiste&,(~MIIM_ID | ~MIIM_FTYPE | ~MIIM_STRING | ~MIIM_SUBMENU),0,(~MFS_ENABLED),100,Menu_Datei&,0,0,0,0,"Datei",0
Na ja, wer am kompletten Quelltext interessiert ist kann mich ja anmailen !

| Zurück zur Übersicht