Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 242951 (4387)
  Suchen
 Zurück zur Übersicht
 AutorThema: Menüs mit Api erzeugen
Philipp Sternberg
Datum:25.05.02 11:24 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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