Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

размеры PopupMenu [D3]


ZEE ©   (2002-07-28 17:00:00) 

Как узнать сабж перед тем как это меню "выпадет" чтобы правильно его расположить. Это для того чтобы менюшка (если в ней слишком много пунктов) не перекрывала собой кнопку под которой она должна "выпасть", а например сдвигать ее вправо от кнопки...
Спасибо всем ответившим.


Юрий Зотов   (2002-08-05 08:46:00) [1]

Да в том-то и дело, что ТОЧНО этот код у меня работает. Я же не просто так написал "код проверялся". Поэтому все равно непонятно. Но теперь это уже, наверное, неважно.


ZEE   (2002-08-05 01:41:00) [2]

Да просто у вас в примере "очепятка" была: не TPMParams надо, а TTPMParams - одной буковки "T" не хватало - а я сразу не сообразил...


Юрий Зотов   (2002-08-04 22:48:00) [3]

Непонятно, ну да ладно. Главное - работает.


ZEE   (2002-08-04 22:41:00) [4]

O, Yeeeeesss! заработало!
Дело вот в чем:
не PMParams: TPMParamsи не PMParams: PTPMParams, а PMParams: T TPMParams- вот где собака порылась :)


Юрий Зотов   (2002-08-04 11:28:00) [5]

Код перед выкладкой проверялся, он работает. Проверьте, не пропущен ли символ @ в последнем параметре TrackPopupMenuEx.


ZEE   (2002-08-04 02:21:00) [6]

Так я ж это "ЗЫ" поставил потому что на PMParams: TPMParamsДелфи ругается, а с PMParams: PTPMParams- все впорядке (т.е. компилится)...


Юрий Зотов   (2002-08-03 00:58:00) [7]

Вот как раз в этом Вашем "ЗЫ" и вся проблема. Сделайте ТОЧНО как написано - и она исчезнет. Потому что САМА запись (TPMParams) и УКАЗАТЕЛЬ на эту запись (PTPMParams) - вещи совершенно разные.

Рекомендуемые темы:
Указатели и работа с динамической памятью.
Операция @ (взятие адреса).

Рекомендуемая литература:
В.В. Фаронов. Программирование в среде Turbo Pascal 5.0.




ZEE   (2002-08-01 15:53:00) [8]

>Юрий Зотов
Что-то не так...
Строка
TrackPopupMenuEx(PopupMenu1.Handle, TPM_HORIZONTAL, X, Y, Handle, nil);
работает нормально, а строка
TrackPopupMenuEx(PopupMenu1.Handle, TPM_HORIZONTAL, X, Y, Handle, @PMParams);
никак не работает (меню не выскакивает)...
ЗЫ: не PMParams: TPMParams;, а PMParams: PTPMParams;


Юрий Зотов   (2002-08-01 05:58:00) [9]

Бросьте на форму PopupMenu1 и Button1. В меню создайте несколько пунктов, а к OnClick кнопки прицепите такой обработчик:


procedure TForm1.Button1Click(Sender: TObject);
var
PMParams: TPMParams;
begin
with PMParams do
begin
cbSize := SizeOf(PMParams);
rcExclude := Rect(0, 0, 0, 0);
with Mouse.CursorPos do
TrackPopupMenuEx(PopupMenu1.Handle, TPM_HORIZONTAL, X, Y, Handle, @PMParams)
end
end;


Запустите программу и щелкните по кнопке. Меню показывается в позиции указателя мыши и перекрывает кнопку.

Теперь вместо строки
rcExclude := Rect(0, 0, 0, 0)
вставьте следующее:
rcExclude := Button1.BoundsRect;
MapWindowPoints(Handle, HWND_DESKTOP, rcExclude, 2);

Теперь меню автоматически сдвигается по горизонтали - так, чтобы не перекрывать кнопку (это и есть работа rcExclude). Если TPM_HORIZONTAL заменить на TPM_VERTICAL, то оно будет сдвигаться по вертикали.

Сместите форму так, чтобы кнопка на ней прижалась к правому нижнему углу экрана. Теперь меню будет показываться по-другому, но в любом случае никогда не перекроет кнопку.

Вот и все. Детали см. в справке API (TrackPopupMenuEx).


ZEE   (2002-08-01 01:36:00) [10]

>Юрий Зотов
Поэкспериментировал с TrackPopupMenu (до этого пользовал Popup у PopupMenu), но никак не получается нормально использовать параметр prcRect, у него тип PRect - типа указатель и как его инициализировать я что-то никак не въеду. Разъясните плиииз.


Юрий Зотов   (2002-07-28 17:20:00) [11]

Если меню поднимается прямым вызовом TrackPopupMenu, то последний параметр (prcRect) как раз и задает прямоугольник, который оно не должно перекрывать. Передавайте в нем прямоугольник Вашей кнопки (в экранных координатах), и все будет ОК.

А второй параметр (uFlags) определяет СПОСОБ, с помощью которого меню будет выравниваться, чтобы не перекрывать этот прямоугольник. Поэкспериментируйте - увидите как это происходит и выберете, что Вам больше подойдет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо