Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.15;
Скачать: CL | DM;

Вниз

размеры PopupMenu   Найти похожие ветки 

 
ZEE ©   (2002-07-28 17:00) [0]

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


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

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

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


 
ZEE ©   (2002-08-01 01:36) [2]

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


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

Бросьте на форму 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 15:53) [4]

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


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

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

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

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





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

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


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

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


 
ZEE ©   (2002-08-04 22:41) [8]

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


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

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


 
ZEE ©   (2002-08-05 01:41) [10]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
3-48003
BAY
2002-07-27 21:20
2002.08.15
Настройка IBTransaction


14-48264
Д_Б
2002-07-19 08:26
2002.08.15
Часы в Win98


1-48178
Sub
2002-08-02 15:54
2002.08.15
Копирование файлов.


1-48146
Елена
2002-08-01 13:42
2002.08.15
Файл *.dsm


14-48287
Magystr
2002-07-20 21:53
2002.08.15
Где можно скачать звуки?