Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 |

 

  Вопрос: Меню Добавлено: 19.07.04 13:27  

Автор вопроса:  BeTe
Пытаюсь симитировать нажатие элемента меню. т.е. у меня есть mnuTest -> mnuTestItem1 на Form1. Пытаюсь апи функцией сделать так как буд-то это меню было выбрано и нажато (нужно чтоб выполнился код записанный в процедуру обработки события Click). Делаю так:
MainMenuH = GetMenu(Me.hwnd)
SubMenuH = GetSubMenu(iRet_MainMenuH, 0)
MenuItemH = GetMenuItemID(iRet_SubMenuH, 0)
ltmp = SendMessage(iRet_MenuItemH, WM_NCLBUTTONDOWN, HTMENU, 0&)

И естественно ничего не получается. Может подскажете в чем проблема? Или есть другой способ? Но только через апи.

Ответить

  Ответы Всего ответов: 49  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 19.07.04 13:54
Посылай форме сообщения а не меню... Все сообщения получает родительская форма (WM_COMMAND), где указываешь параметры...

lParam - Хэндл формы с меню
wParam - по-моему, точно не помню, это MenuId пункта меню

Ответить

Номер ответа: 2
Автор ответа:
 BeTe



Вопросов: 6
Ответов: 30
 Профиль | | #2 Добавлено: 19.07.04 14:35
Тоесть если я тебя правильно понял, то должно выглядеть так:
ltmp = SendMessage(SubMenuH, WM_COMMAND, MenuItemH, Me.hwnd)

Если да, то оно не работает :(

Ответить

Номер ответа: 3
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #3
Добавлено: 19.07.04 15:48
Call SendMessage(Me.hWnd, WM_COMMAND, MenuItemID, Me.hwnd)

Ответить

Номер ответа: 4
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #4
Добавлено: 19.07.04 15:58
 На самом деле sne пытается объяснить тебе что для формы Menu_Click тоже самое что Command_Click.
 Каждый пункт меню формы (как и кнопка) имеет свой идентификатор. Так называемый ControlID.
 Форма не различает кнопки и меню, а только знает когда произошёл BUTTONCLICK по определённой CTL_ID кнопке(пункту меню). Вот и сэмитируй нажатие кнопки (через WM_COMMAND) и пошли идентификатор пункта меню так же как это делается для кнопки.

Ответить

Номер ответа: 5
Автор ответа:
 BeTe



Вопросов: 6
Ответов: 30
 Профиль | | #5 Добавлено: 19.07.04 16:03
Да все это я понял, тока вот не работает это у меня... Делаю как sne написал:
Call SendMessage(Me.hWnd, WM_COMMAND, MenuItemID, Me.hwnd)
в качестве MenuItemID попробовал уже и SubMenuH и MenuItemH (см. выше). Все равно ничего не происходит...

Ответить

Номер ответа: 6
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #6
Добавлено: 19.07.04 16:21
Ты бы хоть MSDN открыл ради приличия
WM_COMMAND
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control

А вот тебе и волшебные функции. Официально их нет, но среди API-шников ходят.
Public Function HiWord(DWord As Long) As Integer
    HiWord = (DWord And &HFFFF0000) \ &H10000
End Function

Public Function LoWord(DWord As Long) As Integer
    LoWord = IIf(DWord And &H8000&, DWord Or &HFFFF0000, DWord And &HFFFF&;)
End Function

Да, ещё, этот wNotifyCode если мне не изменяет память должен быть BN_CLICK

Ответить

Номер ответа: 7
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #7
Добавлено: 19.07.04 16:26
MenuItemID и хэндл, не одно и тоже, так что читай доку выше, и делай как делал до этого, но с учетом того что CyRax написал :)

Ответить

Номер ответа: 8
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #8
Добавлено: 19.07.04 16:32
 Меня только смущает последний параметер.
 По идее должен быть Menu.hWnd. Но раз такого в природе не существует, то попробуй вместо него hMenu прицепить. Хотя sne использовал hWnd формы.
 Так что если от формы не прокатит, то дерзай hMenu.

Ответить

Номер ответа: 9
Автор ответа:
 Андрей Никитин



ICQ: 325172082 

Вопросов: 3
Ответов: 81
 Профиль | | #9 Добавлено: 19.07.04 16:37
>to CyRax: Хоть вопрос и не в тему, но все же...
А как из двух Integer собрать Long, сдвинув один Integer в верхнее слово... В Си помню все было легко (оператор сдвига разрядов), а вот в Бейсике - теряюсь... :)

Ответить

Номер ответа: 10
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #10
Добавлено: 19.07.04 16:37
CyRax, разве?

По-моему в VB это всегда ByVal Me.hWnd...

Ответить

Номер ответа: 11
Автор ответа:
 BeTe



Вопросов: 6
Ответов: 30
 Профиль | | #11 Добавлено: 19.07.04 16:39
Только запутался...
Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
, где
hwnd - Хендл получателя (в данном случае me.hwnd).
wMsg - Идент. сообщения (в данном случае WM_COMMAND).
wParam - а это видимо муть из HiWord и LoWord
lParam - Судя из слов sne это снова me.hwnd

Или я снова что-то напутал?

Ответить

Номер ответа: 12
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #12
Добавлено: 19.07.04 16:48
Андрей Никитин,
 Честно говоря для меня самого это тёмный лес.
Но LONG у меня есть.
Public Function MakLng(X As Integer, Y As Integer) As Long
    MakLng = X + (Y * &H10000)
End Function

Ответить

Номер ответа: 13
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #13
Добавлено: 19.07.04 16:50
sne,
 Ты разве не прочёл ответ 6?
hwndCtl = (HWND) lParam; // handle of control
 Вроде грязным по белому - логический номер контрола.

Ответить

Номер ответа: 14
Автор ответа:
 Андрей Никитин



ICQ: 325172082 

Вопросов: 3
Ответов: 81
 Профиль | | #14 Добавлено: 19.07.04 16:58
>to CyRax:
>Public Function MakLng(X As Integer, Y As Integer) As Long
Большущее спасибо. А то иногда доходило до калькулятора (то бишь почти что до мордобоя)... :)

Ответить

Номер ответа: 15
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #15
Добавлено: 19.07.04 17:12
 Пожалуйста.
 http://basicproduction.nm.ru/ASM/LASM/index.html
 :)))

Ответить

Страница: 1 | 2 | 3 | 4 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам