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

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

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


AHTOH ©   (2003-10-05 20:56:00) 

Код такой:

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 и системного меню формы - работает, а для попапа - нет...


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

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


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


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

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

Удачи.


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

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


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

Сначала отвечу на вопрос "почему ?". Ответ очевиден, если внимательно рассмотреть код функции 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.

Удачи.


Наверх

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