Страница: 1 | 
		
		 
			   
			 
			 
			 
			 Страница: 1 | 
 
			
 
  
		
     
  
    
Вопрос: Работа с меню (VB и WinAPI)
     
    
Добавлено: 08.08.08 22:22
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
     alibek
 alibek
      
       
  
Хочу я сделать такую, достаточно стандартную штуку — когда пользователь активирует меню и перемещается по нему, в строке состояния нужно показывать краткую справку по выбранной команде.
 
    
Причем это бы хотелось сделать так, чтобы редактирование меню (добавление, изменение, удаление) не оборачивалось редактированием кучи вспомогательного кода.
Я попробовал сделать так. В VB есть объект Menu, это пункт меню, которое создается стандартным образом (через Menu Editor). У этого объекта есть несколько свойств, основные из которых это Name, Caption и Tag. В Name указывается имя объекта, с помощью которого им можно манипулировать, в Caption задается текст команды меню, в Tag может быть произвольный текст, у меня в Tag хранится описание команды (текст, который должен показываться в строке состояния, когда данный пункт меню выбран). Еще там есть свойство HelpContextID — если к программе привязан справочный файл, то когда пользователь нажмет F1, будет открыта справочная статья с указанным идентификатором. И к сожалению, там нет свойства hMenu.
Факт выбора меню я отлавливаю, получая оконное сообщение WM_MENUSELECT. Из wParam и lParam я получаю hMenu и порядковый номер выбранного пункта меню. И теперь мне надо узнать, какому объекту VB Menu это соответствует. И вот тут я и застрял.
Вначале у меня была мысль, когда приходит WM_INITMENU, надо пройтись по всем пунктам меню и проставить им HelpContextID. Ну а при WM_MENUSELECT получить GetMenuContextHelpId, и найти по нему нужный объект VB Menu (найти тот, у которого свойство HelpContextID будет равно GetMenuContextHelpId). Однако так не вышло, похоже, что у VB это свойство не запоминается в структуре MENUINFO, а хранится где-то у себя.
Второй вариант был такой, поставить хук на SetMenuItemInfo, затем перебрать все пункты стандартного меню и изменить какое-нибудь свойство. Таким образом можно будет построить таблицу соответствия между объектами Menu и hMenu. В принципе, так должно получиться, но уж очень это ректально получается.
В структуре MENUITEMINFO есть мембер dwItemData, в котором приложения могут хранить какие-то свои данные. Уверен, что все свойства объекта Menu VB хранит именно там. Но как до них добраться не знаю, это совершенно не документировано. Но может быть кто-нибудь знает? Это было бы лучшим способом.
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 6
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа: 
 




Администратор
ICQ: 278109632 
Вопросов: 42
Ответов: 3949
      
 Web-сайт:  
 Профиль |  | #1
      
Добавлено:  08.08.08 23:03
       
    
       
  
Что-то я ничего придумать не могу...
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа: Серёга
 Серёга






ICQ: 262809473 
Вопросов: 17
Ответов: 561
      
 Web-сайт:  
 Профиль |  | #2
      
Добавлено:  09.08.08 00:49
       
    
       
  
Понятия не имею как получить Tag, но Caption получить вполне реально. 
 
    
Ну и от Caption уже плясать.
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа: 
 




Администратор
ICQ: 278109632 
Вопросов: 42
Ответов: 3949
      
 Web-сайт:  
 Профиль |  | #3
      
Добавлено:  09.08.08 01:45
       
    
       
  
Так тут опять же таблица нужна...
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа: alibek
 alibek






Вопросов: 1
Ответов: 6
      
 Профиль |  | #4
       
Добавлено:  09.08.08 02:51
       
    
       
  
 
    
Это халтура.
Мне нужен нормальный идентификатор. Caption не является уникальным.
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа: Серёга
 Серёга






ICQ: 262809473 
Вопросов: 17
Ответов: 561
      
 Web-сайт:  
 Профиль |  | #5
      
Добавлено:  09.08.08 12:58
       
    
       
  
 
    
Да, я знаю  
Нормальный идент. это LOWORD(wParam) когда uMsg = WM_MENUSELECT, но создавая меню через редактор ты не знаешь какой ID будет у того или иного пункта.
Вот если бы ты изначально создавал меню через АПИ, тогда не пришлось бы так извращаться.
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа: Winand
 Winand



Вопросов: 87
Ответов: 2795
      
 Web-сайт:  
 Профиль |  | #6
      
Добавлено:  15.08.08 21:57
       
    
       
  
В более-менее известном примере под 6-ой бейсик
 
    
http://vbrussian.com/examples.asp?ID=105
в самопальном статус-баре показывается caption и хоткей.
Хотя возможно я просто не догоняю, потому что.. при чем тут HelpContext?