![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Доброго времени суток!
Делаю файловый браузер на основе ListView и присоединяю свое pop-up меню. Вопрос в следующем: каким образом можно добавить в свое меню часть контекстного меню проводника Windows с сохранением функциональности? Желательно небольшой примерчик, а не просто совет "куда копать". Заранее спасибо. |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Можно получать меню итема через IContextMenu, затем обрезать его, как надо. И все это делать только тогда, когда требуется, так наиболее удобно, т.е. не хранить меню
![]() Накидал пример - выбираем через OpenDialog файл, для него вызывается меню, у которого оставлены 5 последних итемов (включая separator). Исполнение кода главного потока приостанавливается до тех пор, пока чего-нибудь не нажмём.
Это сообщение отредактировал(а) Rrader - 27.2.2009, 14:35 |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Спасибо за пример!
И еще несколько вопросов: 1) как заставить работать код для виртуальных папок (Например Рабочего Стола или Моего Компьютера)? 2) меню Отправить и Открыть с помощью отображаются, но вместо вложенного меню оказывается та же надпись, для WinRAR же например все нормально... 3) можно ли каким то образом добавить полученное меню к своему pop-up? Это сообщение отредактировал(а) Keeper89 - 26.2.2009, 22:59 |
|||
|
||||
Rrader |
|
||||||||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Для получения ItemID виртуальных папок можно воспользоваться функцией SHGetSpecialFolderLocation
Этот случай требует особой обработки. Вот пример:
Можно добавлять вручную, но придется решать несколько проблем, например, подсчет индекса выбранной команды. Это сообщение отредактировал(а) Rrader - 28.2.2009, 12:50 |
||||||||
|
|||||||||
Keeper89 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Спасибо, работает отлично.
Пользуюсь следующей функцией для определения ItemID:
Но при этом меню работает только для папок, к которым можно определить путь (например Рабочий стол), а Мой Компьютер и Рабочий стол как виртуальная папка не работают. ---------- + еще вопрос: в таком компоненте как ShellListView уже реализовано меню, которое мне необходимо. Можно ли как то его "выдернуть" и добавить из него элементы в своему меню? |
||||
|
|||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Путь не нужен, нужен ItemID:
И далее работать нужно с ним через GetUIObjectOf. ShellListView использует примерно такой же код, какой привел я. Меню нигде не хранится и не является дельфийским TPopupMenu. Это сообщение отредактировал(а) Rrader - 1.3.2009, 08:44 |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Немного подкорректировал ваш код под себя следующим образом, где путь я передаю как параметр:
Никак не могу разобраться, где здесь можно использовать GetUIObjectOf и передавать ItemID? --- Как можно однозначно идентифицировать виртуальную папку для раскрытия меню? Например, если определять через путь, то Мои Документы будут иметь путь, а Мой Компьютер нет. По названию непонятно, ведь обычная папка тоже может называться Рабочий Стол и т.д.... Это сообщение отредактировал(а) Keeper89 - 1.3.2009, 17:33 |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Keeper89, давайте обговорим несколько вещей...
Shell для работы с файловой системой и объектами использует свой особый подход. В них вместо файловых путей используются ItemIDs. Подробности здесь Еще прочитайте это Затем откройте файл ShellCtrls.pas и посмотрите, как там все реализовано (файл лежит в папке Demos\...\ShellCtrls\ )
Позле ознакомления с предыдущим материалом таких вопросов уже не должно возникнуть. |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Спасибо, разобрался. Как можно еще сделать 2 вещи:
|
|||
|
||||
Rrader |
|
||||||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Можно использовать Menu API. Но учтите, чтобы это работало при разных локализациях, т.е. используйте метод на свой страх и риск. ![]()
Использование:
Ну если это настолько необходимо, то вручную, через Menu API. Но я бы делал наоборот - вносил все изменения только в оригинал (Menu в примере). Это сильно упрощает хэндлинг, как выше уже говорил. Это сообщение отредактировал(а) Rrader - 11.3.2009, 17:12 |
||||||
|
|||||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
А как можно удалить элемент (с подменю если оно есть)? Возможно стоит воспользоваться функцией
с параметром MF_DELETE = $200, определив заранее вашим способом нужный индекс элемента? Как можно реализовать то что вы советуете, если у меня имеются:
|
|||
|
||||
Rrader |
|
||||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Для простоты используйте DeleteMenu:
Для этого есть AppendMenu, InsertMenuItem. При щелчке на итеме главному окну-владельцу посылается сообщение WM_COMMAND. |
||||
|
|||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Прощу прощения. все-таки необходимо вставлять HMENU в свое меню. Дело в том, я использую специальный компонент ToolBar2000, где всплывающее меню имеет дополнительные характеристики по сравнению с дельфийским TPopupMenu. Как постараться реализовать это? Это сообщение отредактировал(а) Keeper89 - 5.3.2009, 12:51 |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Так все-таки как постараться это сделать?
|
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Сорри, забыл про темку
![]() Что делать - нужно создать процедуру конвертации меню через API, создавать ImageList для меню TB2000, в него динамически добавлять Bitmap'ы из меню Menu (через TBitmap). Меню на основе TB2000 проще создавать и удалять вместе с Menu из примера. Подменю - тут посложнее, так как пока показано основное меню, HandleMenuMsg может вызываться многократно (каждый раз при открытии), что затрудняет преобразование. Попробуйте написать функцию, а там дальше, если что неясно станет, помогу ![]() Пример простейшей конвертации
Это сообщение отредактировал(а) Rrader - 11.3.2009, 17:09 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |