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...
?
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...
?
Popróbuj z
PopupMenu.Popup(X, Y);
gdzie X to położenie od lewej, Y od góry.
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.
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?
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).
moze zrobie z siebie jakiegos newbie.. ale nie za bardzo cie zrozumialem.. moglbys jakos to wolniej wytlumaczyc (moze na przykladach) ?
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;
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 )
to moze ty reichel pokazesz przykladzik z moim problemem (lewy dolny) ;)
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;
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...
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);