Popup Menu zeichnen



  • Hallo Leute

    Ich habe gleich meine erste Frage an euch. Ich habe im Internet nach einem Codeschnipsel für ein Popup Menu gesucht und wurde auch fündig. Allerdings macht mir eine Stelle im Code etwas ernst.

    Hier der Link zum Beispiel Code:
    http://www.winapi.net/index.php?inhalt=s22

    Was mir jetzt angst macht ist, dass das Popup Menu immer bei der Nachricht WM_CREATE neu erzeugt wird. Wenn ich jetzt ein Langes Popup Menu habe, dann leght das ja meine Window Proc. lahm und ausserdem gefällt mir das sowiso nicht so ganz, weil ich einfach auf Resourcen stehe 😉

    Der Dazugehörige Code:

    case WM_CREATE:
          hMenu = CreatePopupMenu (); // Menu anlegen 
          // und rein mit den Einträgen.. Der 2te Parameter ist die ID des jew. Eintrages 
          InsertMenu (hMenu, 0, MF_BYPOSITION, 0, "Menueintrag");
          InsertMenu (hMenu, 1, MF_BYPOSITION, 1, "Menueintrag");
          InsertMenu (hMenu, 2, MF_SEPARATOR, 0, NULL); // Separator 
          InsertMenu (hMenu, 3, MF_BYPOSITION, 3, "Menueintrag");
          return 0 ;
    

    Jetzt meine Fagen:
    1. Ist es wirklich so, dass beim obigen Beispielcode das Popup Menu Dynamisch erzeugt wird?
    2. Kann man das nicht mittels eines Resource lösen? Ich in meinen Fall habe ja ein Menu, welches sich nicht ändert.

    Würde mich auf Hilfreiche Antworten sehr freuen und schon vielen Dank im Voraus.



  • Naja, so richtig dynamisch finde ich das nicht 🙂 WM_CREATE wird ja aufgerufen, wenn das Fenster erstellt wird, also nur einmal. Da das Menü sowieso feststeht, finde ich das nicht sooo dynamisch, spielt aber keine Rolle. Es wird halt zur Laufzeit angelegt, legt aber auf keinen Fall deine WndProc lahm!

    Und klar, du kannst es auch als Ressource anlegen. Ist etwas stylischer, weil du dafür "Code" in der Ressourcen-Datei hast und nicht im Quellcode. Ist also gleichwertig 😉



  • Vielen Dank für die Antwort.
    Also ich kann einfach ein Script für das Popup Menu anlegen und dann das Menu in der WM_CRATE laden? Wie muss ich es dann laden? Ich kann ja dann nicht die CreatePopupMenu Funktion benutzen, oder doch?



  • Nene, ich glaub du machst es dir zu komliziert 😃

    Du musst einfach den Rechtsklick abfangen, bzw halt auf die WM_CONTEXTMENU reagieren. Dort lädst du dein Handle zum Menü mit LoadMenu( GetModuleHandle(NULL), MAKEINTRESOURCE(MENU_ID) ) (evtl auch "NULL" statt "GetModuleHandle"), dann rufst du TrackPopupMenu auf. Die Maus-Position dafür kriegst du mit GetCursorPos.

    Zum ermitteln, welcher Eintrag gewählt wurde, hast du zwei Möglichkeiten:
    - Du gibst bei den Flags TPM_RETURNCMD bei den Flags von TrackPopupMenu an, dann ist der Rückgabewert dieser Funktion gleich der ID des ausgewählten Eintrags. Falls 0 zurückgegeben wird, wurde das Menü abgebrochen.
    - Du gibts TPM_RETURNCMD nicht an, dann wird WM_COMMAND oder WM_NOTIFY mit der Menü-ID aufgerufen (musste nachgucken, weiß ich grad nich genau).


Anmelden zum Antworten