Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Вниз

размеры 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
6-48224
ole
2002-06-01 07:45
2002.08.15
Отключение клиента TClientSocket.


3-47917
the-best-officeman
2002-07-28 21:54
2002.08.15
Как поставить в таблицу вместо True(Flase). флажок - CheckBox ?


1-48139
Yury
2002-08-01 13:09
2002.08.15
Редактор свойств TStrings


1-48062
diMAN
2002-08-02 19:05
2002.08.15
Ошибка при запуске программы


3-47956
NDR
2002-07-25 14:25
2002.08.15
Как в DBGRID-е закрепить шапку ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский