[Delphi] Wyswietlanie PopupMenu

0

Czy istnieje mozliwosc wyswietlenia PopupMenu, bazujac na lewym, [b]dolnym[/b] rogu (a nie jak jest domyslnie, na lewym, gornym) ?
Tak jak jest wyswietlany np. Start...

?

0

Popróbuj z

PopupMenu.Popup(X, Y);

gdzie X to położenie od lewej, Y od góry.

0

Menu Start rozwija się do góry, gdy do dołu nie ma miejsca - tak jak każde popup menu. Kiedy pasek jest w innej pozycji, menu rozwija się do dołu.

0

ok. tylko ze my sofcie na pewno znajdzie sie miejsce na poprawne wyswietlenie - czy jest jakis sposob, by oszukac program i pokazal menu w oczekiwany sposob?

0

Jeżeli wysokość każdego itema jest stała i taka sama, to problemu być nie powinno. Znajdujesz wysokość jednego elementu, mnożysz przez ilość itemów, a następnie wywołujesz procedurę TPopupMenu.Popup z parametrami MouseCoords.X i MouseCoords.Y-WysokoscPopupa. Jeżeli jednak wysokość elementów jest różna to próbowałbym w OnMeasureItem sumować ich wysokości, a późnej tą całość jakoś przesunąć w górę (nie jestem pewny czy przesunięcie nie spowoduje ponownego odrysowania popup'a, a co za tym idzie wywołania OnMeasureItem, co może prowadzić do zapętlenia).

0

moze zrobie z siebie jakiegos newbie.. ale nie za bardzo cie zrozumialem.. moglbys jakos to wolniej wytlumaczyc (moze na przykladach) ?

0

Ta procedura jest ustawiona przy kliknięciu prawym przyciskiem na Button1. Zakładam, że każdy element Popmenu jest tej samej wysokości i wynosi 19.

const ih=19; // Wysokość każdego itema
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var mp:TPoint;
begin
mp:=Button1.ClientToScreen(POINT(X,Y));
if Button=mbRight then
   PopupMenu1.Popup(mp.X, mp.Y-PopupMenu1.Items.Count*ih);
end;
0

Albo zastosowac WinAPI

TrackPopupMenu

a tam sa dostepne flagi

TPM_BOTTOMALIGN
TPM_TOPALIGN
TPM_VCENTERALIGN

(niestety popup z delphi moze ustawic tylko flagi
TPM_CENTERALIGN, TPM_LEFTALIGN, TPM_RIGHTALIGN )

0

to moze ty reichel pokazesz przykladzik z moim problemem (lewy dolny) ;)

0

Nie jestem może reichel, ale kod działa:

procedure TForm1.Button2Click(Sender: TObject);
var mp:TPoint;
begin
mp:=Mouse.CursorPos;
TrackPopupMenu(PopupMenu1.Handle, TPM_BOTTOMALIGN or TPM_LEFTALIGN, mp.X, mp.Y, 0, PopupList.Window, nil);
end;
0

Dzieki!
Juz zrozumialem o co chodzi... u r great ;)

a pytanie co do TrackPopupMenu: czy da sie ustawic porametr MenuAnimation? bo ten ustawiony w PopupMenu nie zostaje uzyty... pragne by byla animacja BottomToTop, a reszta na false...

0

Teoretycznie powinno działać, ale ja nie widzę żadnej różnicy.

var mp:TPoint;
    flags: integer;
begin
mp:=Mouse.CursorPos;
flags:=TPM_BOTTOMALIGN or TPM_LEFTALIGN or (Byte(PopupMenu1.MenuAnimation) shl 10);
TrackPopupMenu(PopupMenu1.Handle,  flags, mp.X, mp.Y, 0, PopupList.Window, nil);

1 użytkowników online, w tym zalogowanych: 0, gości: 1