Два программера разговаривают:
- Вася - ты каких любишь...?
- Нуу - которые 800х600...
- А я 1024х768 - они покрупней - обхватишь, так, прижмёшь.... - здорово (мечтательно, закрыв глаза и пуская, слюни).
В Delphi5/Demos есть пример Virtual ListView. программка чем-то напоминает explorer, но без контекстного меню. контекстное меню приделывается так:
procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
ContextMenu : IContextMenu;
menu : HMENU;
begin
FIShellFolder.GetUIObjectOf(Handle, 1,
ShellItem(ListView.Selected.index).ID,
IID_IContextMenu, nil, ContextMenu);
menu := CreatePopupMenu();
ContextMenu.QueryContextMenu(menu, 0, 1, $7FFF, CMF_EXPLORE);
TrackPopupMenu(menu,
TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD,
Mouse.CursorPos.x, Mouse.CursorPos.y, 0, Handle, nil);
DestroyMenu(menu);
end;
Классический пример кода на Delphi!
Давайте разберемся в коде:
Цель: Создать виртуальный ListView с контекстным меню (правый клик), которое отображается при клике по элементу в списке.
Код: Процедура PopupMenu1Popup вызывается, когда пользователь правым кликом выбирает элемент в виртуальном ListView. Она получает выбранный элемент, извлекает интерфейс IContextMenu, и использует его для создания контекстного меню с конкретными опциями (например, командой "Explore").
Шаг за шагом:
FIShellFolder.GetUIObjectOf: Метод используется для получения объекта, реализующего интерфейс IContextMenu для выбранного элемента.
ContextMenu.QueryContextMenu: Метод заполняет менюhandle (menu) опциями из контекстного меню. Метод QueryContextMenu принимает несколько параметров:
menu: Менюhandle, которое нужно заполнить.
itemid: ID первого элемента в меню (0 для выбранного элемента).
verb: Глагол для команды (1 для "Explore").
fMask: Флаг, указывающий, включать ли все элементы или только те, которые соответствуют конкретному маске ($7FFF означает все элементы).
TrackPopupMenu: Функция отображает контекстное меню в указанной позиции (Mouse.CursorPos.x и Mouse.CursorPos.y) на экране.
DestroyMenu: Наконец, менюhandle уничтожается.
Альтернативное решение: Хотя этот код работает, вы также можете использовать встроенную функциональность Delphi для создания контекстного меню для виртуального ListView. Вы можете настроить обработчик события OnContextPopup компонента Virtual ListView и заполнить контекстное меню используя свойство TListView.ContextMenu.
Например:
procedureTForm1.ListView1ContextPopup(Sender:TObject;MousePos:TPoint);varmenu:TPopupMenu;beginmenu:=TPopupMenu.Create(Self);withmenudobeginAddItem('Explore',0);// Добавьте больше элементов, если нужноend;menu.Popup(MousePos.x,MousePos.y);end;
Эта approached более проста и прямолинейна, чем оригинальный код.
В статье описывается пример создания виртуального ListView с контекстным меню в Delphi5, демонстрируя как добавить контекстное меню к виртуальному ListView с помощью интерфейса IContextMenu и функции QueryContextMenu.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.