Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Создание меню кнопки

Ответить
Настройки темы
[решено] Создание меню кнопки

Пользователь


Сообщения: 61
Благодарности: 0

Профиль | Отправить PM | Цитировать


Подскажите как создать меню кнопки, только не контекстное по правой кнопке мыши а обычное через левую. В справке по контекстному меню есть пример и с обычным для собственной кнопки, но как то слишком мудрено через вызовы dll. Есть ли вариант попроще.

Отправлено: 08:26, 10-09-2009

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата malev:
В справке по контекстному меню есть пример и с обычным для собственной кнопки, но как то слишком мудрено через вызовы dll. Есть ли вариант попроще. »
Нет, для показа меню (тем более в определённом месте) вызов Dll необходим.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 12:35, 10-09-2009 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


Цитата malev:
но как то слишком мудрено через вызовы dll »
Проще врятли есть... Просто не обращай внимания на те функции, работа которых непонятна и все.
Код: Выделить весь код
#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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ну раз нельзя так нельзя, все равно спасибо

Отправлено: 19:50, 10-09-2009 | #4


Пользователь


Сообщения: 61
Благодарности: 0

Профиль | Отправить PM | Цитировать


Может объясните еще как сделать меню с элементами цикле (ПунктМеню1, ПунктМеню2, ПунктМеню3) и чтобы для каждого была своя обработка (ПриВыбореПунктаМеню1,ПриВыбореПунктаМеню2,ПриВыбореПунктаМеню3) ну или общая с индексом ПриВыбореПунктаМеню(индекс пункта меню)

Отправлено: 21:16, 10-09-2009 | #5


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата malev:
как сделать меню с элементами цикле (ПунктМеню1, ПунктМеню2, ПунктМеню3) и чтобы для каждого была своя обработка »
Изменённый пример из справки:

Код: Выделить весь код
#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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 23:34, 10-09-2009 | #6


Пользователь


Сообщения: 61
Благодарности: 0

Профиль | Отправить 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,"","???")
GUICtrlSetOnEvent можно конечно не вызывать если напрямую использую или если вызывать то какую функцию ставить в параметрах, просто Menu не подойдет.

Может GUIGetMsg (1) вызывать??? Если да то что искать...

Отправлено: 10:49, 11-09-2009 | #7


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата malev:
GUICtrlSetOnEvent можно конечно не вызывать »
Оно вообще не нужно если обработка не происходит в режиме событии.

То что вам нужно так это использование возможностей Case:
Код: Выделить весь код
$nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $conMenu[0] To $conMenu[$max]
            MsgBox (0,"", GUICtrlRead($nMsg)) ;Тут используем $nMsg, это и есть идентификатор вызванного контроля (пункт меню)
Цитата:
$conMenu[$men-1]
Вообще то лучше убрать -1, а в начале при объявлении массива добвавить (Dim $conMenu[$max+1]).

И ещё, это может быть опасно вот так задавать размерность массива используя переменную возвращаемую от IniRead ($max). Юзер ведь может там написать -1, и тогда скрипт вывалится с фатальной ошибкой (определение размерности массива). Нужно делать проверку таких переменных.

Цитата malev:
GUICtrlSetOnEvent(-1, ?????) »
Нужно задать в начале Opt("GUIOnEventMode", 1), и тогда обрабатывать не в цикле, а в функции:

Код: Выделить весь код
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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 15:44, 11-09-2009 | #8


Пользователь


Сообщения: 61
Благодарности: 0

Профиль | Отправить PM | Цитировать


MsgBox (0,"", GUICtrlRead($nMsg)) - возвращает почему-то одно и тоже у меня к примеру 68. А мне надо например 68, 69 или 70 для 3-х пунктов меню

Отправлено: 16:26, 11-09-2009 | #9


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата malev:
возвращает почему-то одно и тоже у меня к примеру 68 »
Это состояние (State) элемента. Я забыл, для получения текста нужно так - GUICtrlRead($nMsg, 1).

Цитата malev:
А мне надо например 68, 69 или 70 для 3-х пунктов меню »
Т.е идентификаторы? Ну так я же написал, $nMsg это и есть ID.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:03, 11-09-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Создание меню кнопки

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] отказывает меню правой кнопки мыши 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




 
Переход