Menüs kann man ja nicht nur mit Ressourcen erstellen......



  • oder?
    Hallo erstmal.
    Ich las von einer Möglichkeit, die ich bisher noch gar nicht verwendet habe:
    Innerhalb der Nachrichtenschleife Menüs ersdtellen.
    Da habe ich gar keine Ansätze zu , bzw. habe ich es nur mit res.h und res.rc Dateien gehandhabt.
    Ich habe nun zwei Projekte vor mir, für die ich scheinbar auf die Ressourcen-Dateien verzichten müsste und die Menüelemente in der Nachrichtenschleife selber erzeugen müsste.
    - Meine erste Frage:
    - Stimmt diese Annahme?
    Dies sind die Projekte:
    a)Will das Menü meiner Anwendung blau machen, dazu weisse schrift, invertieren
    beim Mouseover.
    b) Will ein Kontextmenü bauen, also ein Fenster, das nur aus einem Kontextmenü
    besteht. Dessen Einträge sollen über eine Config-Exe, die dort als Default-
    Eintrag drinsteht entweder erweitert werden oder entfernt.
    Meine zweite Frage: Bei sowas müsste doch ein Fenster NUR aus einem Menü bestehen. Wie mach ich das? Die Clientedge auf 0 setzen lässt das Menü ja nur soweit aufklappen, wie ich Clientedge übrig habe, bei 0 wäre das Pop-Up nicht sichtbar.
    Meine Absicht ist, mir auf einen Mousebutton ein eigenes Kontextmenü zu legen, welches dynamisch ist, durch den Anwender. Der kann Anwendungen da rein packen oder enfernen, diese dann mit exec() als eine Art Quicklaunch ausgeführt werden. Wenn Ihr wisst, wie ich das vorhabe.
    Aber wie rafft das Menü die Anzahl der Einträge neu, und macht entweder ein MENUITEM mehr oder eines weniger rein?!?!?!?
    Wäre sehr dankbar für etwas Hilfe.



  • In der Nachrichtenschleife bestimmt nicht, wenn dann in der Windowsprozedur. Und wie man Menüs zur Laufzeit erstellt, findest du im MSDN oder im Windows SDK.



  • man kann ueberall im code menueeintraege hinzufuegen - enfernen usw - kein problem
    man kann es dann so komplett aufbauen, einfach ein leeres menue in der rc erstellen und dann los

    hier mal ein beispiel mit hinzufuegen eines eintrags

    TCHAR str[] = _T("New Element")
    unsigned int uiId = 10005;
    
    // main menu aus resource holen
    HMENU menu = GetMenu(m_hWnd);
    
    // menu info structur siese MSDN
    MENUITEMINFO info;
    info.cbSize = sizeof(MENUITEMINFO);
    info.fMask = MIIM_STRING|MIIM_ID;
    info.dwTypeData = str;    // name des menues
    info.wID = uiId;          // id des neuen elements
    
    // item hinzufuegen direkt nach dem item mit der id 10004, man kann direkt mit den IDC_* arbeiten
    // es geht auch insert before usw, einfach MSDN schaun
    ::InsertMenuItem(menu, 10004, false, &info);
    

    bei den messages bekommt man dann die uiId des neuen elements

    das selbe geht mit RemoveMenuItem usw - da sind einige andere die ich aus den kopf grad nicht weiss frag einfach die MSDN
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus.asp



  • Das ist ja mein Problem.
    Als Default Eintrag wäre folgendes in der .rc

    ID_MENU1 MENU
    BEGIN
       POPUP "EINS"
         MENUITEM "Config", ID_OPT1
       END
    END
    

    Beim klick auf diese config würde eine eigene kleine Anwendung ausgeführt werden, welche mich bequem per Dateibrowser eine Exe aussuchen lässt, die ich mit in mein Menü aufnehmen will, um sie zusätzlich zu dem Default Eintrag "Config" drin zu haben, oder aber bereits vorhandene zu löschen.
    Das heisst, meine Config-Anwendung , die ja nur Teil meiner Hauptanwendung "Quicklaunchmenu - QLM" ist, müsste die .rc editieren und entweder um MENUITEMS erweitern oder vermindern, UND auch die res.h um die jeweiligen #defines. Dazu wird es danach noch nötig , zu kompilieren.
    Und das kann ich doch keinem User zumuten.
    Muss doch dynamisch anders gehen., ohne eine Kompilierung zu fordern.
    Zur Laufzeit.... danach goggle ich mal "Menü zur Laufzeit ändern"
    Ach nochwas: Benutze keinerlei Klassen ala MFC oder VLC.



  • Also du brauchst überhaupt keine neuen defines anlegen oder neu kompilieren. Da hast du was falsch verstanden.
    Guck dir mal das Beispiel von Mr Evil an. Dort hast du

    info.wID = uiId;          // id des neuen elements
    

    Du wertest ja dann in deiner Nachrichtenprocedur die ganzen ID's aus und dann musst du halt auch diese ID auswerten und dementsprechend handeln. Da ist überhaupt nix mit neu kompilieren oder so 😮 Stell dir das mal vor wenn jedes mal die Programme neu kompiliert werden müssten 😮

    MfG schirrmie



  • ich es noch nicht ganz raffe:
    hier im Forum fand ich das hier:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-15157.html

    ----
    damit verstehe ich sicher auch das Beispiel vom Herr Böse besser.
    Aber: MENUINFO struct ? Wusste nicht, dass es so n struct überhaupt gibt.
    Hat jemand n kleinen Link, wo ich sehen kann, was man GENAU alles braucht, um NICHT mit Ressourcen zu arbeiten, sondern mit C an sich?
    --- Beispiel vom Mr. Evil?->
    Hey, der definiert ja auch ne ID. DA Müsste ich meine lediglich inkrementieren , falls ich mehrere Elemente dranfüge? Schätze ja.
    Und es gibt sicher auch n counter, der mir die Menge der bereits eingehangenen
    MENUITEMS liefert, ne?
    Aber das ist korrekt, bis her!
    Danke sehr, genau so meinte ich es.
    ----
    Irgendwie muss ich nur noch dynamisch die Namen der Exe-Dateien unterbringen und dann als Titel der einzelnen Menüpunkte laden und unterbringen.
    Und ne .txt oder ähnliches müsste reichen.
    ----
    Aber, wie erstelle ich ein Fenster, dass NUR aus einem Kontextmenü besteht?
    Muss nicht erst ein Popup sein, sondern direkt aufgepoppt, also , nicht erst drüberfahren, um 4 oder mehr Einträge zu sehen, sondern diese Direkt angezeigt bekommen, wie dasd Kontextmenü auf Win-rechte Mousetaste?
    ----------
    Clientsize 0,0 kann nicht klappen, da man das Menu auch nur innerhalb der Clientgrösse angezeigt bekommt.
    Gibbet ne Methode, mit der ich die Popup x und y size ermittel? Dann würde ich das window resizen, mit exact den Koordinaten als Breite und Länge, und zwar direkt beim starten der Application. Müsste gehen, nicht elegant, aber müsste gehen.......
    oder?



  • me-S-on schrieb:

    Aber, wie erstelle ich ein Fenster, dass NUR aus einem Kontextmenü besteht?
    Muss nicht erst ein Popup sein, sondern direkt aufgepoppt, also , nicht erst drüberfahren, um 4 oder mehr Einträge zu sehen, sondern diese Direkt angezeigt bekommen, wie dasd Kontextmenü auf Win-rechte Mousetaste?

    Guck dir mal nen TrayIcon an das ist glaub ich das was du suchst. Dann hast du unten im Tray ein Icon und wenn du da rechte maustaste raufdrückst bekommst dein Menü und fertig ist. Benutz mal die Suche hier gibt es auch einige Beispiele und auch mit den Menüs!
    Den Rest hab ich nur überflogen wollte nicht alles lesen 😉

    MfG schirrmie



  • Genau so wie das Kontextmenü auf dem Desktop, wenn ich die rechte maustaste drücke.
    Dann erscheint ein Menü, welches so aussieht, als ob es das Popup eines Fenstermenü-Punktes wäre.
    Nur halt ohne Oberpunkt, direk offen ohne Popup.
    Und das dann als eigene Application auf einem der Vielen Mousebuttons der heute modernen Mäuse.
    Aber ich suche dennoch mal hier unter Tray.


Log in to reply