Что нового

GUI + выпадающий список: нет вызова действия

dr.room

Новичок
Сообщения
283
Репутация
0
Версия AutoIt: 3.
AutoIt v3.3.14.2
Описание:
Всем привет
Хочу попробовать добавить 1 кнопку с выпадающим списком к 2-ум уже существующим.
Добавление вроде нормально прошло а вот выпадающего списка нет. Проблема только кнопки №3
И в чём проблема? :stars:
Примечания:
Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
	Local $hGui, $OptionsBtn, $OptionsDummy, $OptionsContext, $OptionsCommon, $OptionsFile, $msg
	Local $OptionsExit, $HelpBtn, $HelpDummy, $HelpContext, $HelpWWW, $HelpAbout
	Local $TriBtn, $TriDummy, $TriContext, $TriWWW, $TriAbout
	$hGui = GUICreate("Выбор вариантов: 3 категории", 550, 40)

	$OptionsBtn = GUICtrlCreateButton("&От 1 до 10", 10, 10, 90, 20, $BS_FLAT) ; Это первая -  кнопка выпадающего списка

	; Сначала создан элемент - пустышка (Dummy) и контекстное меню для него, которое будет пристроено к кнопке "От 1 до 10" или Options
	$OptionsDummy = GUICtrlCreateDummy()
	$OptionsContext = GUICtrlCreateContextMenu($OptionsDummy)
	$1variant_vibora = GUICtrlCreateMenuItem("1-й вариант ", $OptionsContext)
	GUICtrlCreateMenuItem("", $OptionsContext) ; разделительная линия
	$2variant_vibora = GUICtrlCreateMenuItem("2-й вариант", $OptionsContext)
	GUICtrlCreateMenuItem("", $OptionsContext); разделительная линия

	$HelpBtn = GUICtrlCreateButton("&От 11 до 20", 110, 10, 90, 20, $BS_FLAT) ; Это вторая -  кнопка выпадающего списка

	; Создан элемент - пустышка и контекстное меню, которое будет пристроено к кнопке "От 11 до 20" или Help
	$HelpDummy = GUICtrlCreateDummy()
	$HelpContext = GUICtrlCreateContextMenu($HelpDummy)
	$11variant_vibora = GUICtrlCreateMenuItem("11-ый вариант", $HelpContext)
	GUICtrlCreateMenuItem("", $HelpContext)
	$12variant_vibora = GUICtrlCreateMenuItem("12-ый вариант", $HelpContext)
	GUICtrlCreateMenuItem("", $HelpContext)

;~   третья кнопка
	$TriBtn = GUICtrlCreateButton("&От 21 до 30", 210, 10, 90, 20, $BS_FLAT) ; Это вторая -  кнопка выпадающего списка

	; Создан элемент - пустышка и контекстное меню, которое будет пристроено к кнопке "От 21 до 30", или Tri
	$TriDummy = GUICtrlCreateDummy()
	$TriContext = GUICtrlCreateContextMenu($TriDummy)
	$31variant_vibora = GUICtrlCreateMenuItem("31-ый вариант", $TriContext)
	GUICtrlCreateMenuItem("", $TriContext)
	$32variant_vibora = GUICtrlCreateMenuItem("32-ый вариант", $TriContext)
	GUICtrlCreateMenuItem("", $TriContext)

	GUISetState()

	While 1 ; Старт Цикла
		$msg = GUIGetMsg()

		Switch $msg
			Case  $GUI_EVENT_CLOSE
				ExitLoop

			Case $OptionsBtn
				ShowMenu($hGui, $msg, $OptionsContext)

			Case $HelpBtn
				ShowMenu($hGui, $msg, $HelpContext)

			Case $TriDummy ; Создаём новое выпадающее меню - для третьей  кнопки
				ShowMenu($hGui, $msg, $TriContext)

			Case $1variant_vibora  ; Мои действия
				MsgBox(262208,"Сообщение","Выбран вариант = 1", 2)
							ExitLoop
			Case $2variant_vibora  ; Мои действия
				MsgBox(262208,"Сообщение","Выбран вариант= 2", 2)
						ExitLoop
			Case $11variant_vibora  ; Мои действия
				MsgBox(262208,"Сообщение","Выбран вариант= 11", 2)
						ExitLoop
			Case $12variant_vibora  ; Мои действия
				MsgBox(262208,"Сообщение","Выбран вариант= 12", 2)
						ExitLoop
			Case $31variant_vibora  ; Мои действия
				MsgBox(262208,"Сообщение","Выбран вариант= 31", 2)
						ExitLoop



		EndSwitch
	WEnd   ; Завершение цикла.
	GUIDelete()



; Отображает меню в данном GUI окне, которое принадлежит данному элементу в GUI
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

; Конвертирует клиентские координаты (GUI) в абсолютные координаты экрана (desktop)
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
	Local $stPoint = DllStructCreate("int;int")

	DllStructSetData($stPoint, 1, $x)
	DllStructSetData($stPoint, 2, $y)

	; См. также _WinAPI_ClientToScreen
	DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))

	$x = DllStructGetData($stPoint, 1)
	$y = DllStructGetData($stPoint, 2)
	; обнулять структуру не обязательно, так как она локальна
	$stPoint = 0
EndFunc

; Показать контекстное меню (hMenu) принадлежащее GUI окну (hWnd) в указанных координатах (x, y)
Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
	; См. также _GUICtrlMenu_TrackPopupMenu
	DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
dr.room
вот готовое с много кнопок" http://pastebin.com/9awKbmci
до кучи http://pastebin.com/tkUETxi9
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
dr.room
И в чём проблема?
Замените
Код:
Case $TriDummy ; Создаём новое выпадающее меню - для третьей  кнопки
на
Код:
Case $TriBtn ; Создаём новое выпадающее меню - для третьей  кнопки



Добавлено:
Сообщение автоматически объединено:

Не моё, конечно, дело, но попробуйте ComboBox (проще и понятней)
Код:
#include <GUIConstantsEx.au3>
#include <GUIComboBox.au3>

$hGui = GUICreate("Выбор вариантов: 3 категории", 550, 40)

$Combo1 = GUICtrlCreateCombo("", 10, 10, 90, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, "1-й вариант|2-й вариант")
_GUICtrlComboBox_SetCueBanner($Combo1, "От 1 до 10")

$Combo2 = GUICtrlCreateCombo("", 110, 10, 90, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, "11-й вариант|12-й вариант")
_GUICtrlComboBox_SetCueBanner($Combo2, "От 11 до 20")

$Combo3 = GUICtrlCreateCombo("", 210, 10, 90, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, "21-й вариант|22-й вариант")
_GUICtrlComboBox_SetCueBanner($Combo3, "От 21 до 30")

GUISetState()

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit

    Case $Combo1
      Switch GUICtrlRead($Combo1)
        Case "1-й вариант"
          MsgBox(262208, "Сообщение", "1-й вариант", 2)
        Case "2-й вариант"
          MsgBox(262208, "Сообщение", "2-й вариант", 2)
      EndSwitch
      _GUICtrlComboBox_SetCurSel($Combo1)
      _GUICtrlComboBox_SetCueBanner($Combo1, "От 1 до 10")

    Case $Combo2
      Switch GUICtrlRead($Combo2)
        Case "11-й вариант"
          MsgBox(262208, "Сообщение", "11-й вариант", 2)
        Case "12-й вариант"
          MsgBox(262208, "Сообщение", "12-й вариант", 2)
      EndSwitch
      _GUICtrlComboBox_SetCurSel($Combo2)
      _GUICtrlComboBox_SetCueBanner($Combo2, "От 11 до 20")

    Case $Combo3
      Switch GUICtrlRead($Combo3)
        Case "21-й вариант"
          MsgBox(262208, "Сообщение", "21-й вариант", 2)
        Case "22-й вариант"
          MsgBox(262208, "Сообщение", "22-й вариант", 2)
      EndSwitch
      _GUICtrlComboBox_SetCurSel($Combo3)
      _GUICtrlComboBox_SetCueBanner($Combo3, "От 21 до 30")
  EndSwitch
WEnd
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
@AZJIO
В варианте 2 т.е. "до кучи" классно реализовано меню при наведении. Спасибо.
К сожалению, нет в скрипте комментариев, что бы понять быстро что к чему. Так что пойду разбираться (это надолго :smile:)
А пока - только это вышло
Код:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>

$hGUI=GUICreate('Выберите футбольную команду', 450, 40)
$iExport=GUICtrlCreateButton('1-10', 10, 10, 100, 22)
$iExport_2=GUICtrlCreateButton('11-20', 110, 10, 100, 22)



$iExportContext = GUICtrlCreateDummy()
$iExportContextMenu = GUICtrlCreateContextMenu($iExportContext)
$iExportContextItem1 = GUICtrlCreateMenuItem('Арсенал', $iExportContextMenu)
$iExportContextItem2 = GUICtrlCreateMenuItem('Астон Вилла', $iExportContextMenu)
$iExportContextItem3 = GUICtrlCreateMenuItem('Лидс Юнайтед', $iExportContextMenu)
$iExportContextItem4 = GUICtrlCreateMenuItem('Нортгемптон Таун', $iExportContextMenu)

$iExportContext_2 = GUICtrlCreateDummy()
$iExportContextMenu_2 = GUICtrlCreateContextMenu($iExportContext_2)
$iExportContextItem1_2 = GUICtrlCreateMenuItem('Гайзли', $iExportContextMenu_2)
$iExportContextItem2_2 = GUICtrlCreateMenuItem('Галифакс Таун', $iExportContextMenu_2)
$iExportContextItem3_2 = GUICtrlCreateMenuItem('Гейнсборо Тринити', $iExportContextMenu_2)
$iExportContextItem4_2 = GUICtrlCreateMenuItem('Гейтсхед', $iExportContextMenu_2)


GUISetState ()
GUIRegisterMsg(0x004E, "WM_NOTIFY")
While 1
        $msg = GUIGetMsg()
        Switch $msg
                Case $iExport
                        _GUICtrlButton_ContextMenuEx($hGUI, $iExport, $iExportContextMenu)
			Case $iExportContextItem1
				MsgBox(64,"Сообщение","Премьер-лига", 1)
			Case $iExportContextItem2
				MsgBox(64,"Сообщение","Премьер-лига", 1)
			Case $iExportContextItem3
				MsgBox(64,"Сообщение","Чемпионат Футбольной лиги (уровень 2)", 1)
			Case $iExportContextItem4
				MsgBox(64,"Сообщение","Вторая Футбольная лига (уровень 4)", 1)
                Case -3
                         Exit
        EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam
    Local Const $BCN_HOTITEMCHANGE = -1249
    Local $tNMBHOTITEM = DllStructCreate("hwnd hWndFrom;int IDFrom;int Code;dword dwFlags", $lParam)
    Local $nNotifyCode = DllStructGetData($tNMBHOTITEM, "Code")
    ; Local $nID = DllStructGetData($tNMBHOTITEM, "IDFrom")
    ; Local $hCtrl = DllStructGetData($tNMBHOTITEM, "hWndFrom")
    Local $dwFlags = DllStructGetData($tNMBHOTITEM, "dwFlags")

    Switch $nNotifyCode
        Case $BCN_HOTITEMCHANGE ; Win XP and Above
            If BitAND($dwFlags, 0x10) = 0x10 Then
                _GUICtrlButton_ContextMenuEx($hGUI, $iExport, $iExportContextMenu)
                                ControlFocus($iExport, "", "Edit1")
            ElseIf BitAND($dwFlags, 0x20) = 0x20 Then
                ; Send('{Enter}')
                ; Send('{DOWN}')
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Func _GUICtrlButton_ContextMenuEx($hHandle, $iControlID, $iContextMenu)
        Local $aControlGetPos, $hMenu, $iX, $iY
        $hMenu = GUICtrlGetHandle($iContextMenu)
        $aControlGetPos = ControlGetPos($hHandle, "", $iControlID)
        $iX = $aControlGetPos[0]
        $iY = $aControlGetPos[1] + $aControlGetPos[3]
        _ClientToScreen($hHandle, $iX, $iY)
        DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $iX, "int", $iY, "hwnd", $hHandle, "ptr", 0)
EndFunc   ;==>_GUICtrlButton_ContextMenuEx

Func _ClientToScreen($hHandle, ByRef $iX, ByRef $iY)
        Local $tPoint
        $tPoint = DllStructCreate("int X;int Y")
        DllStructSetData($tPoint, 1, $iX)
        DllStructSetData($tPoint, 2, $iY)
        _WinAPI_ClientToScreen($hHandle, $tPoint)
        $iX = DllStructGetData($tPoint, 1)
        $iY = DllStructGetData($tPoint, 2)
EndFunc   ;==>_ClientToScreen

@InnI
Спасибо за ComboBox и исправление !
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
dr.room
Посмотри пример WM_NOTIFY в русской справке. А также другие WM_-сообщения. При регистрации таких сообщений ты говоришь Windows'у какие события ты хочешь получить в окно, у каждого события есть имя-константа. В начале функции ты вытаскиваешь из кода отправленного в окно данные о том какая кнопка, координаты мыши, события нажатия на манипуляторы (мышь клавиатуру), причём данные регламентированы, то есть не всё подряд, о только то что заказал. Потом внутри функции WM_NOTIFY строишь логику, что делать если пользователь нажал на кнопку или навёл на кнопку, для каждого типа элемента свои сигналы, например для выпадающего списка есть события разворачивания, для кнопки его естественно нет. В общем что ты хочешь при определённых телодвижениях пользователя, то и прописываешь в алгоритме.
Есть горячие клавиши, ставишь на имя функции, вызываешь горячую клавишу попадаешь в справку, читаешь что делает функция.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
dr.room
классно реализовано меню при наведении
Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate('Выберите футбольную команду', 450, 40)

$iExport = GUICtrlCreateButton('1-10', 10, 10, 100, 22)
$iExport_2 = GUICtrlCreateButton('11-20', 110, 10, 100, 22)

$iExportContext = GUICtrlCreateDummy()
$iExportContextMenu = GUICtrlCreateContextMenu($iExportContext)
$iExportContextItem1 = GUICtrlCreateMenuItem('Арсенал', $iExportContextMenu)
$iExportContextItem2 = GUICtrlCreateMenuItem('Астон Вилла', $iExportContextMenu)
$iExportContextItem3 = GUICtrlCreateMenuItem('Лидс Юнайтед', $iExportContextMenu)
$iExportContextItem4 = GUICtrlCreateMenuItem('Нортгемптон Таун', $iExportContextMenu)

$iExportContext_2 = GUICtrlCreateDummy()
$iExportContextMenu_2 = GUICtrlCreateContextMenu($iExportContext_2)
$iExportContextItem1_2 = GUICtrlCreateMenuItem('Гайзли', $iExportContextMenu_2)
$iExportContextItem2_2 = GUICtrlCreateMenuItem('Галифакс Таун', $iExportContextMenu_2)
$iExportContextItem3_2 = GUICtrlCreateMenuItem('Гейнсборо Тринити', $iExportContextMenu_2)
$iExportContextItem4_2 = GUICtrlCreateMenuItem('Гейтсхед', $iExportContextMenu_2)

GUISetState ()

While 1
        Switch GUIGetMsg()
            Case $iExportContextItem1
                MsgBox(64,"Сообщение","Премьер-лига", 1)
            Case $iExportContextItem2
                MsgBox(64,"Сообщение","Премьер-лига", 1)
            Case $iExportContextItem3
                MsgBox(64,"Сообщение","Чемпионат Футбольной лиги (уровень 2)", 1)
            Case $iExportContextItem4
                MsgBox(64,"Сообщение","Вторая Футбольная лига (уровень 4)", 1)
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch

        $ID = GUIGetCursorInfo($hGui)[4]
        Switch $ID
            Case $iExport
                ShowMenu($hGui, $ID, $iExportContextMenu)
            Case $iExport_2
                ShowMenu($hGui, $ID, $iExportContextMenu_2)
        EndSwitch
WEnd

Func ShowMenu($hWnd, $CtrlID, $nContextID)
    Local $hMenu = GUICtrlGetHandle($nContextID)
    Local $aPos = ControlGetPos($hWnd, "", $CtrlID)
    Local $tPoint = DllStructCreate("int X;int Y")
    $tPoint.X = $aPos[0]
    $tPoint.Y = $aPos[1] + $aPos[3]
    DllCall("user32.dll", "bool", "ClientToScreen", "hwnd", $hWnd, "struct*", $tPoint)
    DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $tPoint.X, "int", $tPoint.Y, "hwnd", $hWnd, "ptr", 0)
EndFunc
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Спасибо еще раз всем - ушел поэкспериментировать...
 
Верх