|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Создание меню кнопки |
|
|
[решено] Создание меню кнопки
|
Пользователь Сообщения: 61 |
Подскажите как создать меню кнопки, только не контекстное по правой кнопке мыши а обычное через левую. В справке по контекстному меню есть пример и с обычным для собственной кнопки, но как то слишком мудрено через вызовы dll. Есть ли вариант попроще.
|
|
Отправлено: 08:26, 10-09-2009 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата malev:
|
|
------- Отправлено: 12:35, 10-09-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 307
|
Профиль | Отправить PM | Цитировать Цитата malev:
#include <GUIConstantsEx.au3> Opt("GUIOnEventMode", 1) $hMainWin= GUICreate("Form1", 408, 229, 192, 193) GUISetOnEvent($GUI_EVENT_CLOSE, "_Pro_Exit") $hMainBut = GUICtrlCreateButton("Кнопка", 104, 56, 201, 97, 0) GUICtrlSetOnEvent(-1, '_ButtonPressed') $hMenu = GUICtrlCreateContextMenu($hMainBut) GUICtrlCreateMenuItem('1', $hMenu) GUICtrlSetOnEvent(-1, '_1') GUICtrlCreateMenuItem('2', $hMenu) GUICtrlSetOnEvent(-1, '_2') GUISetState(@SW_SHOW) While 1 Sleep(50) WEnd Func _1() MsgBox(0,"","вызвана функция 1",2) EndFunc Func _2() MsgBox(0,"","вызвана функция 2",2) EndFunc Func _Pro_Exit() Exit EndFunc Func _ButtonPressed() _ShowMenu($hMainWin, $hMainBut, $hMenu ) EndFunc ;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Func _ShowMenu($hWnd, $CtrlID, $nContextID) Local $arPos, $x, $y Local $hMenu = GUICtrlGetHandle($nContextID) $arPos = ControlGetPos($hWnd, "", $CtrlID) $x = $arPos[0] $y = $arPos[1] + $arPos[3] _ClientToScreen($hWnd, $x, $y) _TrackPopupMenu($hWnd, $hMenu, $x, $y) EndFunc ;==>ShowMenu ; Convert the client (GUI) coordinates to screen (desktop) coordinates Func _ClientToScreen($hWnd, ByRef $x, ByRef $y) Local $stPoint = DllStructCreate("int;int") DllStructSetData($stPoint, 1, $x) DllStructSetData($stPoint, 2, $y) DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint)) $x = DllStructGetData($stPoint, 1) $y = DllStructGetData($stPoint, 2) ; release Struct not really needed as it is a local $stPoint = 0 EndFunc ;==>ClientToScreen ; Show at the given coordinates (x, y) the popup menu (hMenu) which belongs to a given GUI window (hWnd) Func _TrackPopupMenu($hWnd, $hMenu, $x, $y) DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0) EndFunc ;==>TrackPopupMenu ;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
------- Отправлено: 12:38, 10-09-2009 | #3 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Ну раз нельзя так нельзя, все равно спасибо
|
Отправлено: 19:50, 10-09-2009 | #4 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Может объясните еще как сделать меню с элементами цикле (ПунктМеню1, ПунктМеню2, ПунктМеню3) и чтобы для каждого была своя обработка (ПриВыбореПунктаМеню1,ПриВыбореПунктаМеню2,ПриВыбореПунктаМеню3) ну или общая с индексом ПриВыбореПунктаМеню(индекс пункта меню)
|
|
Отправлено: 21:16, 10-09-2009 | #5 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата malev:
#include <GUIConstantsEx.au3> #include <ButtonConstants.au3> ; $hGUI = GUICreate("My GUI", 170, 40) $OptionsBtn = GUICtrlCreateButton("&Options", 10, 10, 70, 20, $BS_FLAT) ; At first create a dummy control for the options and a contextmenu for it $OptionsDummy = GUICtrlCreateDummy() $OptionsContext = GUICtrlCreateContextMenu($OptionsDummy) $OptionsCommon = GUICtrlCreateMenuItem("Common", $OptionsContext) $OptionsFile = GUICtrlCreateMenuItem("File", $OptionsContext) GUICtrlCreateMenuItem("", $OptionsContext) $OptionsExit = GUICtrlCreateMenuItem("Exit", $OptionsContext) $HelpBtn = GUICtrlCreateButton("&Help", 90, 10, 70, 20, $BS_FLAT) ; Create a dummy control and a contextmenu for the help too $HelpDummy = GUICtrlCreateDummy() $HelpContext = GUICtrlCreateContextMenu($HelpDummy) $HelpWWW = GUICtrlCreateMenuItem("Website", $HelpContext) GUICtrlCreateMenuItem("", $HelpContext) $HelpAbout = GUICtrlCreateMenuItem("About...", $HelpContext) GUISetState() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $OptionsExit, $GUI_EVENT_CLOSE If $nMsg = $OptionsExit Then MsgBox(64, 'Title', "[Exit] item selected.", 0, $hGUI) ExitLoop Case $OptionsCommon MsgBox(64, 'Common...', "[Common] item selected.", 0, $hGUI) Case $OptionsFile MsgBox(64, 'File...', "[File] item selected.", 0, $hGUI) Case $OptionsBtn ShowMenu($hGUI, $nMsg, $OptionsContext) Case $HelpBtn ShowMenu($hGUI, $nMsg, $HelpContext) Case $HelpWWW MsgBox(64, "WWW...", "www.autoitscript.com", 0, $hGUI) ShellExecute("www.autoitscript.com") Case $HelpAbout MsgBox(64, "About...", "GUICtrlGetHandle-Sample", 0, $hGUI) EndSwitch WEnd ; Show a menu in a given GUI window which belongs to a given GUI ctrl Func ShowMenu($hWnd, $CtrlID, $nContextID) Local $arPos, $x, $y Local $hMenu = GUICtrlGetHandle($nContextID) $arPos = ControlGetPos($hWnd, "", $CtrlID) $x = $arPos[0] $y = $arPos[1] + $arPos[3] ClientToScreen($hWnd, $x, $y) TrackPopupMenu($hWnd, $hMenu, $x, $y) EndFunc ;==>ShowMenu ; Convert the client (GUI) coordinates to screen (desktop) coordinates Func ClientToScreen($hWnd, ByRef $x, ByRef $y) Local $stPoint = DllStructCreate("int;int") DllStructSetData($stPoint, 1, $x) DllStructSetData($stPoint, 2, $y) DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint)) $x = DllStructGetData($stPoint, 1) $y = DllStructGetData($stPoint, 2) ; release Struct not really needed as it is a local $stPoint = 0 EndFunc ;==>ClientToScreen ; Show at the given coordinates (x, y) the popup menu (hMenu) which belongs to a given GUI window (hWnd) Func TrackPopupMenu($hWnd, $hMenu, $x, $y) DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0) EndFunc ;==>TrackPopupMenu |
|
------- Отправлено: 23:34, 10-09-2009 | #6 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Это не то, во-первых создание пунктов меню должно идти в цикле, во вторых заранее неизвестно количество пунктов меню. Вот обрывки кода, с первым вроде разобрался, а вот со вторым нет
$max=IniRead("my.ini","Main","Max","1") Dim $conMenu[$max] For $men=1 to $max $conMenu[$men-1]=GUICtrlCreateMenuItem(IniRead("my.ini","CAP" & $men,"Caption","xxx"), $cmdUpd_submenu) GUICtrlSetOnEvent(-1, ?????) Next $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $conMenu[0] MsgBox (0,"","000") Case $conMenu[1] MsgBox (0,"","111") ................................ Case $conMenu[???] MsgBox (0,"","???") Может GUIGetMsg (1) вызывать??? Если да то что искать... |
Отправлено: 10:49, 11-09-2009 | #7 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата malev:
То что вам нужно так это использование возможностей Case: $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $conMenu[0] To $conMenu[$max] MsgBox (0,"", GUICtrlRead($nMsg)) ;Тут используем $nMsg, это и есть идентификатор вызванного контроля (пункт меню) Цитата:
И ещё, это может быть опасно вот так задавать размерность массива используя переменную возвращаемую от IniRead ($max). Юзер ведь может там написать -1, и тогда скрипт вывалится с фатальной ошибкой (определение размерности массива). Нужно делать проверку таких переменных. Цитата malev:
Opt("GUIOnEventMode", 1) ..... For $men=1 to $max $conMenu[$men-1]=GUICtrlCreateMenuItem(IniRead("my.ini","CAP" & $men,"Caption","xxx"), $cmdUpd_submenu) GUICtrlSetOnEvent(-1, "_MenuEvents") Next ..... Func _MenuEvents() MsgBox(0,"", GUICtrlRead(@GUI_CtrlId)) ;Тут используем @GUI_CtrlId, это и есть идентификатор вызванного контроля (пункт меню) EndFunc |
|||
------- Отправлено: 15:44, 11-09-2009 | #8 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать MsgBox (0,"", GUICtrlRead($nMsg)) - возвращает почему-то одно и тоже у меня к примеру 68. А мне надо например 68, 69 или 70 для 3-х пунктов меню
|
Отправлено: 16:26, 11-09-2009 | #9 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 17:03, 11-09-2009 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - [решено] отказывает меню правой кнопки мыши | RTSnik | Microsoft Windows 2000/XP | 4 | 01-09-2009 22:12 | |
Кнопки в меню Пуск | PulSar.CE194694 | Microsoft Windows Vista | 2 | 14-05-2009 11:16 | |
Ошибка - [решено] Файл Справки Винды из меню кнопки Пуск не могу открыть. | qualified | Microsoft Windows 2000/XP | 5 | 03-03-2009 01:17 | |
[решено] Текстовый редактор с функцией добавления пункта меню/кнопки | Котяра | Хочу все знать | 6 | 18-04-2008 22:37 | |
Интерфейс - [решено] Пропалп пункт "Создать " в контекстном меню, при нажатии правой кнопки мыши. | Simpetus | Microsoft Windows Vista | 5 | 03-08-2007 09:07 |
|