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

Вниз

Как вставить свои пункт в PopUp меню?   Найти похожие ветки 

 
AHTOH   (2003-10-05 20:56) [0]

Код такой:

popupmenu1.Popup(300,300);
sysmenu:=popupmenu1.handle;
AppendMenu(SysMenu, mf_SEPARATOR and MF_OWNERDRAW, 0, #0);
AppendMenu(SysMenu, mf_BYPOSITION and mf_popup and MF_OWNERDRAW, My_MenuItem, "Новый пункт");
drawmenubar(popupmenu1.Handle);

Для MainMenu и системного меню формы - работает, а для попапа - нет...


 
Almaz   (2003-10-06 02:05) [1]

Сначала отвечу на вопрос "почему ?". Ответ очевиден, если внимательно рассмотреть код функции Popup класса TPopupMenu:

procedure TPopupMenu.Popup(X, Y: Integer);
...
begin
...
FItems.RebuildHandle;
...
TrackPopupMenu(FItems.Handle, AFlags, X, Y, 0 { reserved }, PopupList.Window, nil);
end;


Обратите внимание на выделенную строку - в ней происходит вызов функции, которая пересоздает меню, основываясь на данных, прописанных в свойстве Items класса, тем самым все вызванные вами AppendMenu попросту исчезнут.

Теперь отвечу на вопрос "как ?". Тут все зависит от того - хотите ли вы пользоваться VCL или WinAPI. Если вы выбираете VLC, то проблема решается чтением хелпа ;) в результате чего вы придете к чему-то вроде :

var
NewItem: TMenuItem;
begin
NewItem := TMenuItem.Create(Self);
NewItem.Caption := "-";
PopupMenu1.Items.Add(NewItem);

NewItem := TMenuItem.Create(Self);
NewItem.Caption := "Новый пункт";
PopupMenu1.Items.Add(NewItem);
...


Если же вы решили использовать WinAPI (не зря же задали вопрос в соответствующей конференции :), то мой вам совет - не мешайте тогда водку с портвейном ;) в смысле - если пользуетесь WinAPI то про класс TPopupMenu забудьте и используйте функцию TrackPopupMenu.
Но если вы все же настаиваете на выбранном пути, то пропишите приведенный вами код в обработчик события OnChange для вашего PopupMenu1.

Удачи.


 
ARTEMKA   (2003-10-06 03:01) [2]

>>>Almaz
А не подскажешь как сделать popup чтоб слева например вставить вертикальную полосу градентную, как например бывает во многих приложениях


 
Almaz   (2003-10-06 03:32) [3]


> ARTEMKA (06.10.03 03:01) [2]
> >>>Almaz
> А не подскажешь как сделать ...

Подскажу - это делается при помощи OnDrawItem. Но если хотите обсудить это более подробно, то задайте этот же вопрос в отдельной ветке.

Удачи.


 
AHTOH   (2003-10-06 13:43) [4]

Спасибо, попробую TrackPopupMenu



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

Форум: "WinAPI";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.01 c
3-89789
KIR
2003-11-06 17:38
2003.11.27
Народ, требуется ли BDE, если используется DB.pas?


1-89822
alexe
2003-11-17 09:36
2003.11.27
Проблема с передачей формулы в Exel


1-89873
mc_duck
2003-11-16 00:45
2003.11.27
Обращение к объекту по строке-имени.


3-89686
bober
2003-11-07 16:52
2003.11.27
dbtext


14-90117
PavelSin
2003-11-04 09:26
2003.11.27
Просмоторщик дайджестов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский