Fragen zur Menübar



  • Hallo API Freunde 🙂

    Ich habe einige Fragen an euch. Ich habe schon im Forum gesucht, doch bin noch nicht auf das gestoßen was meine Fragen direkt beantworten würde.
    Ich entschuldige mich, wenn die Fragen für dieses Forum evtl zu einfach sind.

    Kurz zu mir: Bin C++ Einsteiger.

    Ich habe folgendes gemacht, einfach ein Fenster, das mir eine Menübar und Submenüs anzeigen soll.

    /* Ein Menüitem erstellen */
    MENUITEMINFO* CreateMenuItem(HMENU hSub)
    {
        static MENUITEMINFO mii;
    
        mii.cbSize      = sizeof(MENUITEMINFO); 
        mii.fMask       = MIIM_ID | MIIM_SUBMENU | MIIM_TYPE; 
        mii.wID         = 0; 
        mii.cch         = 4; 
        mii.dwTypeData  = "Info";
        mii.hSubMenu    = hSub;
    
    	return(&mii);
    }
    
    int APIENTRY...
    [...]
    
    HMENU	HauptMenue,	// Menüs
    	InfoMenu,
    	InfoAuswahl;
    
    /* Erstellen der Menüs */
    HauptMenue = CreateMenu();
    InfoMenu	= CreatePopupMenu();
    InfoAuswahl = CreatePopupMenu();
    
    /* WinClass anmelden */
    [...]
    
    /* Hauptfenster der Anwendung erstellen */
    [...]
    
    MENUITEMINFO *miiPointer;
    
    miiPointer = CreateMenuItem(InfoMenu);
    InsertMenuItem(HauptMenue, 0, FALSE, miiPointer);
    
    miiPointer = CreateMenuItem(InfoAuswahl);
    InsertMenuItem(InfoMenu, 0, FALSE, miiPointer);
    
    SetMenu(hWindow, HauptMenue);
    
    [...]
    

    So, nun die Fragen:
    Ich habe das Beispiel hier aus dem Forum aufgegriffen und ausprobiert. Soweit so gut.

    1. Liege ich richtig mit der Annahmen, dass man mit "MENUITEMINFO* CreateMenuItem" eine Referenz auf das Menuiteminfo zurückgibt? Es ist ja in InsertMenuItem so verlangt:
    "[in] Pointer to a MENUITEMINFO structure that contains information about the new menu item"

    2. Ich finde es relativ mühselig am anfang mit der MSDN Library zurechtzukommen.Aber man kommt ja nicht drumherum. Bitte habt nachsicht wenn ich noch etwas ungeübt bin. Meine Frage: Wie kann ich mehrere Unterpunkte in das Submenü eintragen, also wie man es kennt, z.B. speichern öffnen usw usw? (MENUITEMINFO habe ich mir schon angeschaut, aber doch nicht so recht weitergekommen (bins noch net gewohnt eben).

    3. Wo genau trage ich nun die ID des Menüelements ein, so dasss ich auf ereignisse in Verbindung mit diesem reagieren kann. (Steht bestimmt auch in MENUITEMINFO 😉 )

    4. Ist es überhaupt praktikabel die Menüs immer selbst zu gestalten ? Wie ihr seht, benutze ich ja keine Headerdateien um dies zu bewerkstelligen. Ich möchte nämlich bis aufs kleinste Detail die Kontrolle darüber haben was mein Programm macht.

    5. Ich weiss, ist evtl schon etwas weit vorgegriffen, aber wie erstellt man später eigene Menüs. Ich habe hier im Forum gelesen, dass man alles selbst machen muss, was ja nicht weiter schlimm ist. Vielleicht könnt ihr mir einige Tips geben was dann alles getan werden muss, also was alles mit einfließt. Ich nehme mal an eigene DLLs werden auf jeden Fall nötig sein. Muss ich dann in den DLLs die Funtionen wie "InsertMenuItem" selbst implementieren ?
    Mir ist die grobe richtung noch nicht ganz klar wie es gemacht wird.

    Okay, vielen Dank demjenigen, der sich die Mühe macht alles durchzulesen und mir einige Krüken oder gar Rollstuhl zur Verfügung zu stellen 😉

    Grüße
    kuRu



  • kuRu schrieb:

    1. Liege ich richtig mit der Annahmen, dass man mit "MENUITEMINFO* CreateMenuItem" eine Referenz auf das Menuiteminfo zurückgibt? Es ist ja in InsertMenuItem so verlangt:
    "[in] Pointer to a MENUITEMINFO structure that contains information about the new menu item"

    nein, es liefert einen pointer eine referenz ist etwas anderes

    deine nächsten fragen fasse ich einfach mal zusammen.
    menü werden in der regel mit er mit resourcen erstellt.
    ich würde sagen du beschäftigst mal mit den vorteilen von resourcen files,
    dann wirst du erkennen das deine methode nicht sehr praktikabel ist.
    bsp:
    [cpp]
    // resource.rc
    #include <windows.h>
    #include "resource.h"

    MAINMENU MENU
    {
    POPUP "&File"
    {
    MENUITEM "&Open ...", IDM_OPEN
    MENUITEM SEPARATOR
    MENUITEM "E&xit", IDM_EXIT
    }

    POPUP "&Help"
    {
    MENUITEM "&About ...", IDM_ABOUT
    }
    }

    // resource.h
    #define IDM_OPEN 9001
    #define IDM_EXIT 9002
    #define IDM_ABOUT 9003

    // main.c
    int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    WNDCLASS wc;
    //wc.... andere einstellungen
    wc.lpszMenuName = "MAINMENU";
    // ...
    BOOL CALLBACK WndProcMain(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    switch(msg)
    {
    case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDM_OPEN:
    OpenFile(hwnd);
    break;
    [/cpp]



  • Ehm, hoppala. Referenz, Pointer. Ist mir aber peinlich 🙂 Und das im 6. Semester.

    Aber im groben danke schonmal. Jetzt weiss ich zumindest in welche Richtung ich arbeiten sollte.

    Aber was ist mit eigens designten Menüs? 🙂 (Interessiert mich nur, für mein Problem tuns die normalen auch voll und ganz)

    Grüße kuRu



  • kuRu schrieb:

    Ehm, hoppala. Referenz, Pointer. Ist mir aber peinlich 🙂 Und das im 6. Semester.

    😃

    kuRu schrieb:

    Aber was ist mit eigens designten Menüs? 🙂 (Interessiert mich nur, für mein Problem tuns die normalen auch voll und ganz)

    was verstehst du unter designten und normalen?

    [edit]
    link zu lesen 😉
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus/usingmenus.asp



  • 😃

    Ich meine so fesche Dinger, die man ab und zu bei Programmen sieht. Ich kenne jetzt z.B. auch nur ein Beispiel. Da wird das Feld, wenn man mit der Maus drübergeht nicht blau sondern Gelb mit einem schwarzen Rahmen markiert. Ausserdem hat der Markierungsbalken noch einen 3D Schattierungseffekt mit drin.

    Sind so spielereien halt 🙂 Ist im Grunde auch nicht so wichtig 4 me. Ist nur interessant.



  • owner draw technik schimpft sich das --> siehe obrigen link



  • Denkeschön 🙂 🙂 🙂
    👍

    Ich melde mich dann nachher nochmal wegen Datenbank Programmierung 😃 Das brauche ich nämlich auch 😃 😃 😃


Anmelden zum Antworten