Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать контекстное меню? очень нужен полный пример 
:(
    Опции темы
JeronimoIn
  Дата 14.9.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



в общем задача приблизительно такая: есть форма (писано на апи), и надо чтоб по сообщению правой кнопки мыши выскакивало контекстное меню... с 5 подменю заданными... подсобите?

ПС: простите за нескромность, но  smile 
PM MAIL   Вверх
Snowy
Дата 14.9.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Попробуй поиск по форуму по слову CreatePopupMenu
PM MAIL   Вверх
JeronimoIn
Дата 15.9.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



поиск по форуму не помог, помогло гуглиние  smile  проблема решена за счет фунции TrackPopupMenu
собственно решение:
Код

var
  p:tpoint;
  Menu : HMENU;
  PMenu : HMENU;
...
 WM_RBUTTONDOWN:
  begin
GetCursorPos(p);
Menu := CreatePopupMenu;
PMenu := CreatePopupMenu;
AppendMenu(Menu, MF_POPUP, PMenu, 'qwe');
AppendMenu(PMenu, MF_STRING, menu_id_1, '1');
TrackPopupMenu(menu, TPM_LEFTALIGN Or TPM_RIGHTBUTTON,p.X,p.Y,0,window,nil);
  end;
...


забыл поставить галочку на "Решенный вопрос"

Это сообщение отредактировал(а) JeronimoIn - 15.9.2006, 20:54
PM MAIL   Вверх
USSR
Дата 15.9.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.7.2006

Репутация: 1
Всего: 1



А можно сделать вот так:
Код

var
  Menu: HMenu;
  CPos: TPoint;

..........

  wm_RButtonDown:
begin
//Загрузка контекстного меню из ресурса
  Menu := LoadMenu(hInstance, PChar(104));
  GetCursorPos(CPos);
  TrackPopupMenu(GetSubMenu(Menu, 0), TPM_LeftAlign or TPM_TopAlign, CPos.X, CPos.Y, 0, hWin, nil);
  DestroyMenu(Menu);
  end;

Только в ресурсе нужно будет меню создавать типа
Код

104 MENU
{
 POPUP "Context"
 {
  MENUITEM "бла-бла-бла", 0, INACTIVE
  POPUP "бла-бла-бла"
  {
   MENUITEM "бла-бла-бла", 0, INACTIVE
  }
  MENUITEM SEPARATOR
  MENUITEM " бла-бла-бла", 0, GRAYED, INACTIVE
 }
}

PM MAIL   Вверх
JeronimoIn
Дата 17.9.2006, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



а как работать с ресурсом? что-то я не понял вообще...
можно по подробнее про это дело?
PM MAIL   Вверх
Snowy
Дата 18.9.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Можно и без ресурса - создавать программно элементы через InsertMenuItem (смотри поиск и MSDN)
PM MAIL   Вверх
JeronimoIn
  Дата 19.9.2006, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



с подключением ресурсов разобрался
Код

program apishell;

{$R 'menu.res' 'menu.rc'}

uses
  Windows,
  Messages;
....
WM_RBUTTONDOWN:
  begin
  //обработчик сообщения нажатия правой кнопки на форме
  GetCursorPos(mouse_point);
  Menu:=LoadMenu(Menu, PChar('MENU_0'));
  TrackPopupMenu(GetSubMenu(Menu, 0), TPM_LEFTALIGN Or TPM_RIGHTBUTTON,
                mouse_point.X,mouse_point.Y,0,window,nil);
  end;
....

и собственно сам файл MENU.RC
Код

MENU_0 MENU
BEGIN
  POPUP "MainMenu"
  BEGIN
    POPUP "MenuItem1"
    BEGIN
      MENUITEM "PopUp1", 1
    END
      MENUITEM SEPARATOR
      MENUITEM "MenuItem2", 2
      POPUP "MenuItem3"
      BEGIN
        MENUITEM "PopUp2", 3
      END
  END
END 

но теперь возник вопрос как создавать динамическое меню? К примеру чтоб вместо MENUITEM "PopUp1", 1 выпадало много MENUITEM, в соответствии с количеством файлов в определенной директории? и при нажатии на определенный MENUITEM запускался файл (приложением прописанным в винде)?
PM MAIL   Вверх
Snowy
Дата 19.9.2006, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



В ресурсах только статические меню закладываются.
Для добавления пунктов используй InsertMenuItem
PM MAIL   Вверх
JeronimoIn
Дата 19.9.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Цитата

В ресурсах только статические меню закладываются.
Для добавления пунктов используй InsertMenuItem 

 smile 
PM MAIL   Вверх
Yanis
Дата 19.9.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(JeronimoIn @  19.9.2006,  01:40 Найти цитируемый пост)
Menu:=LoadMenu(Menu, PChar('MENU_0'));

Вот эта строчка интересная очень smile

А вообще функция похоже немного на TrackPopupMenu первым параметром тебе нужно передать, то что возвращает функция LoadMenu. Остальные параметры смотри в MSDN.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Snowy
Дата 19.9.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Вот ведь мне делать нечего - делать работу за других...
На, держи.

Присоединённый файл ( Кол-во скачиваний: 37 )
Присоединённый файл  APIPopup.zip 7,20 Kb
PM MAIL   Вверх
JeronimoIn
  Дата 19.9.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Цитата(Snowy @ 19.9.2006,  16:12)
Вот ведь мне делать нечего - делать работу за других...
На, держи.

Крайне признателен, огромезное спасибо... нажал бы на "+" в рейтинге, но требуется 100 постов, заработаю и нажму...
PS на этом вопросы не закончатся...  smile 
PM MAIL   Вверх
JeronimoIn
Дата 3.10.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



 smile Не велите казнить, велите слово молвить)))) В общем исходник предоставленный Snowy просто превосходен, но я все же не могу сделать так, чтобы при генерации меню создавались подменю соответствующие подкаталогам в заданном пути... не пойму как сделать динамическое подменю! 
PM MAIL   Вверх
Snowy
Дата 3.10.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Создать то легко.
Но во-первых это займёт много времени - сканирование каталогов - дело не быстрое.
Во-вторых сложность потом определить, какой файл выбран. 
Если только параллельно создавать массив с путями.
А если их сотни тысяч? Опухнешь ждать, когда меню построится, да и памяти сожрёт немерянно.
PM MAIL   Вверх
JeronimoIn
Дата 3.10.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



хм... а как это реализовать smile  мне надо, чтоб было, что-то похожее на пуск в контекстном меню...

помогите сделать хоть так, чтоб сканировало и добавляло... а потом уже буду думать над оптимизацией...


M
Girder
Вот здесь... точно есть: http://forum.vingrad.ru/index.php?act=Search&f=2

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0773 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.