Страница: 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-сайт:
Профиль | | #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-сайт:
Профиль | | #3
Добавлено: 19.07.04 15:48
Call SendMessage(Me.hWnd, WM_COMMAND, MenuItemID, Me.hwnd)
Номер ответа: 4
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #7
Добавлено: 19.07.04 16:26
MenuItemID и хэндл, не одно и тоже, так что читай доку выше, и делай как делал до этого, но с учетом того что CyRax написал
Номер ответа: 8
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #15
Добавлено: 19.07.04 17:12
Пожалуйста.
http://basicproduction.nm.ru/ASM/LASM/index.html
))