PopUp Menüs



  • Hallo da bin ich wieder.

    Ich hab jetzt wirklich gesucht aber überhaupt nichts brauchbares gefunden für mein wahrscheinlich leichtes Problem.

    Wie kann ich ein PopUp Fenster neben dem Mauszeiger anzeigen lassen (so wie jedes PopUp Menü angezeigt wird)

    Ich kann zwar die X und Y Werte von der MouseDown Funktion nehmen nur geht die von dem ganzen Bildschirm aus. Ich brauch aber nur die von meiner Form. Bei WinAPI konnte man Instanzen von Klassen erstellen, mit denen man so ein Problem lösen konnte. Wie geht das beim Borland Builder?



  • a) Einfach im ObjectInspector der PopupMenu-Eigenschaft des betreffenden Controls das gewünschte Menü zuweisen, fertig.
    b) Die X/Y-Koordinaten im MouseDown etc. beziehen sich nicht auf den Bildschirm sondern auf die Clientarea des jeweiligen Controls. Siehe Hilfe.
    c) Seit wann gibt es in der WinAPI Klassen? 😉



  • fuer 'manuelles' Aufpoppen:

    TPoint Pt;
    Pt=ClientToScreen(Point(X,Y));
    PopupMenu->Popup(Pt.x,Pt.y);

    Ansonsten wie Jansen sagt.



  • ClientToScreen/ScreenToClient wird nur dann benötigt, wenn man tatsächlich mit "globalen" Koordinaten arbeitet (z.B. per TMouse::CursorPos). Was wie gesagt im MouseDown etc. aber unnötig ist.



  • Danke. Das hab ich schon gewusst. Mir ist es eigentlich darum gegangen das das Menu neben dem Mauszeiger auftaucht. Ich poste mal den Code um den Aufruf zu zeigen:

    void __fastcall TForm1::RichEdit1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       if (Button == mbRight)
             PopupMenu1->;
    }
    

    Tja, vorhin meinte ich natürlich STRUKTUREN. Mein Fehler 😃



  • Jansen schrieb:

    ... Was wie gesagt im MouseDown etc. aber unnötig ist.

    Ich hab' das in 'nem Programm. Ohne ClientToScreen wird das PopUp mit den Client- Koordinaten AM BILDSCHIRM positioniert! Mit der Umrechnung also bei der Maus!!!

    PS: Hab' den BCB 4!



  • Hallo Sebastian,

    was hast du gegen Jansen Vorschlag a) der ist doch der einfachste,
    und ohne eine selbst eingegebene Codezeile wird das Popupmenu beim Mauszeiger
    aufgepoppt.

    also einfach im Objektinspektor

    RichEdit1->PopupMenu = PopupMenu1

    mfg
    VergissEs



  • Sebastian:
    Den Aufruf kannst du dir sparen. Wenn du das Menü im ObjectInspector dem RichEdit zuweist dann wird es immer automatisch zur richtigen Zeit an der richtigen Stelle angezeigt.

    Altenburher:
    Du hast natürlich recht. TPopupMenu::Popup erwartet ja globale Koordinaten, deshalb muss man eben doch mit ClientToScreen umrechnen.



  • Manchmal braucht man ein PopUp vielleicht auch mit manueller Steuerung!???

    Ich hab' ne komponente mit einer direkten Funktion bei rechter Maustaste.

    Da mach ich bei OnMouseUp:

    schnell geklickt => direkte Funktion (z.B. eine Bild- Zoomfunktion) ausführen.
    langsam geklickt => (länger als 200 msec) => PopUp anzeigen.

    Das geht nur manuell. 😉



  • jetzt gehts. Ich hab das mitm Objektinspektor ein bisschen anders gemacht, darum hats nicht funktioniert. Aber jetzt gehts. Danke an alle


Anmelden zum Antworten