Что нового

[Элементы GUI] Сделать горячие клавиши для формы GUI

Leanna

Новичок
Сообщения
25
Репутация
3
Как сделать некоторые опреации с формой GUI:

1. Что бы при нажатии на "*" или стрелочкам назад/вперед поочередно активировались кнопки р+ , о, after (как табом) (другие кнопки не перебирались бы)
из обсуждений на форуме, не смогла понять, как на это прикрутить GUISetAccelerators...

2. Что бы при открытии формы кнопка "o" была бы активна и нажатие enter запускало бы процедуру кнопки "о"

И ещё такое возможно ли вообще (может это, конечно, из разряда фантастики): сделать перебор по Enter, а, например, закрытие формы по двойному Enter, или удерживаемому Enter?

DOnNW.jpg


Кроме того, есть вопрос по checkbox:
Как сделать так, что бы галочкой можно было включать/выключать режим "поверх всех окон"? (WinSetOnTop)

Код, на всякий, прилагаю.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>

GUICreate("Записи", 340, 200)

If Not IsDeclared('last') Then $last = "чему-то"
   
$CheckBox1 = GUICtrlCreateCheckbox('on top', 275, 3, -1, 20, $BS_RIGHTBUTTON)
$Input2 = GUICtrlCreateInput("2", 9, 34, 52, 23)
GUICtrlSetBkColor(-1, 0xCBCBC6)
$last1 = GUICtrlCreateEdit($last, 167, 34, 143, 20, BitOR($ES_READONLY, $ES_RIGHT), $WS_EX_STATICEDGE)
$last2 = GUICtrlCreateButton(Chr(164), 311, 34, 20, 19)
$Btn1 = GUICtrlCreateButton("р+", 9, 108, 120, 35)
$Btn2 = GUICtrlCreateButton("о", 145, 108, 89, 35)
$Btn3  = GUICtrlCreateButton("after", 275, 108, 55, 35)
$Text1 = GUICtrlCreateInput("8", 6, 78, 334, 21)

GUICtrlCreateLabel('Ввод данных:', 6, 59, 334, 17)
GUICtrlSetBkColor(-1, 0xfdffae)


GUICtrlSetState($CheckBox1, 1)
GUISetState()
WinSetOnTop ("Записи", "", 0)
GUICtrlSetState($Text1, $GUI_FOCUS)

While 1
$nMsg = GUIGetMsg()


Switch $nMsg
   Case $GUI_EVENT_CLOSE
      Exit  
   Case $last2
	  GUICtrlSetData($Text1 & " ", GUICtrlRead($last1))
   Case $CheckBox1  
	  WinSetOnTop ( "Записи", "", 1)
EndSwitch

WEnd

файл http://leanna1983.narod2.ru/stuff/Kalkulyator.au3

Спасибо за внимание к данному вопросу.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Leanna,
Попробуйте примерно так.
Код:
#include <GUIConstantsEx.au3>
#include <Misc.au3>

Global $iFocus = 1, $iCount, $fClick = True, $iStart, $iCountDbl, $aButton[5] = [4, '1', '2', '3', 'F']

$hGui = GUICreate('Test', 190, 100)
$nCheckbox = GUICtrlCreateCheckbox('On top', 20, 10, 50, 20)
For $i = 1 To $aButton[0]
	$aButton[$i] = GUICtrlCreateButton($aButton[$i], 20 + ($i - 1) * 40, 50, 30, 20)
Next
GUICtrlSetState($aButton[$aButton[0]], $GUI_FOCUS)
$nDummy_1 = GUICtrlCreateDummy()
$nDummy_2 = GUICtrlCreateDummy()
Dim $aAccelKeys[6][2] = [['{TAB}', $nDummy_1],['{UP}', $nDummy_1],['{DOWN}', $nDummy_1], _
		['{LEFT}', $nDummy_1],['{RIGHT}', $nDummy_1],['2', $nDummy_2]] ;2-exit
GUISetAccelerators($aAccelKeys)
GUISetState()
AdlibRegister('_MyExit', 200)
While 1
	_Dbl_Exit('71');F2
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $nDummy_2
			Exit
		Case $nCheckbox
			WinSetOnTop($hGui, '', BitAND(GUICtrlRead($nCheckbox), $GUI_CHECKED))
		Case $aButton[1] To $aButton[$aButton[0]]
			MsgBox(64, 'Info', GUICtrlRead($nMsg))
		Case $nDummy_1
			GUICtrlSetState($aButton[$iFocus], $GUI_FOCUS)
			$iFocus += 1
			If $iFocus = 4 Then $iFocus = 1
	EndSwitch
WEnd

Func _MyExit()
	If _IsPressed('7B') Then ;F12 ~2 sec
		$iCount += 1
	Else
		$iCount = 0
	EndIf
	If $iCount = 10 Then Exit
EndFunc   ;==>_MyExit

Func _Dbl_Exit($s_Key, $i_Wait = 200)
	If _IsPressed($s_Key) Then
		If $fClick Then
			$iStart = TimerInit()
			$iCountDbl += 1
			$fClick = False
		EndIf
	Else
		$fClick = True
	EndIf
	If TimerDiff($iStart) >= $i_Wait Then
		$iCountDbl = 0
		Return
	EndIf
	If $iCountDbl = 2 Then Exit
EndFunc   ;==>_Dbl_Exit
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Leanna
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>

$hGui=GUICreate("Записи", 340, 200)

If Not IsDeclared('last') Then $last = "чему-то"

$Btn1 = GUICtrlCreateButton("р+", 9, 108, 120, 35)
$Btn2 = GUICtrlCreateButton("о", 145, 108, 89, 35)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
$Btn3 = GUICtrlCreateButton("after", 275, 108, 55, 35)
$last2 = GUICtrlCreateButton(Chr(164), 311, 34, 20, 19)
$nCheckbox = GUICtrlCreateCheckbox('on top', 275, 3, -1, 20, $BS_RIGHTBUTTON)
GUICtrlSetState(-1, 1)
$Input2 = GUICtrlCreateInput("2", 9, 34, 52, 23)
GUICtrlSetBkColor(-1, 0xCBCBC6)
$last1 = GUICtrlCreateEdit($last, 167, 34, 143, 20, BitOR($ES_READONLY, $ES_RIGHT), $WS_EX_STATICEDGE)
$Text1 = GUICtrlCreateInput("8", 6, 78, 334, 21)
GUICtrlSetState(-1, $GUI_FOCUS)

GUICtrlCreateLabel('Ввод данных:', 6, 59, 334, 17)
GUICtrlSetBkColor(-1, 0xfdffae)

$iDummy = GUICtrlCreateDummy()

Dim $aAccelKeys[4][2] = [['1', $Btn1],['2', $Btn2],['3', $Btn3],['^{Enter}', $iDummy]]
GUISetAccelerators($aAccelKeys)

GUISetState()
WinSetOnTop($hGui, '', 1) ; 1 так как Checkbox = 1

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $iDummy
			Exit
		Case $Btn1
			MsgBox(0, 'Сообщение', 'Тест1', 0, $hGui)
		Case $Btn2
			MsgBox(0, 'Сообщение', 'Тест2', 0, $hGui)
		Case $Btn3
			MsgBox(0, 'Сообщение', 'Тест3', 0, $hGui)
		Case $last2
			GUICtrlSetData($Text1 & " ", GUICtrlRead($last1))
		Case $nCheckbox
            WinSetOnTop($hGui, '', BitAND(GUICtrlRead($nCheckbox), $GUI_CHECKED))
	EndSwitch
WEnd

1. В данном примере Tab перебирает элементы и начинает с кнопок, по этому я кнопки поставил первыми по списку.
2. $GUI_DEFBUTTON - делает кнопку "по умолчанию", которая сработает по Enter, если не активировалась иная кнопка (фокус при этом в поле ввода).
3. В функции WinSetOnTop (и в любых Win) лучше использовать дескриптор.
4. В функциях GUICtrlSetState используется "-1", что означает последняя использованная переменная, то есть идентификатор предыдущего созданного элемента.

Удерживать Enter опасно, так как при закрытии программы активируется какое либо окно, у которого Enter будет продолжать выполнять события. Кроме того по одинарному Enter выполняются события в GUI. Сделал выход по Ctrl+Enter, можно по F12, но всё это излишество.
 
Автор
Leanna

Leanna

Новичок
Сообщения
25
Репутация
3
Спасибо большое. Очень всё понятно, даже такому Dummy как я :smile:

Да, это не очень хорошая идея переключать стрелочкой или звёздочкой, потому что они могут быть нужны в input строке, и enter трогать тоже

Что делает
Код:
$iCount += 1

это тоже самое что и $iCount = 1 + $iCount ?

Можно ли установить для элемента так, что бы TAB его игнорировал (не выделял\пропускал)?

Появился ещё вопрос: Можно ли сделать переключение, например Shift+Enter - переключение между двумя текстовыми окнами $Input2 и $Text1.
Я пока могу только сделать фокус на $Input2, как можно сделать туда обратно?

Странно, но, как только я добавила строку про Shift+Enter, у меня даже после выхода из програмы начал глючить виндовс, клавиатура ведет себя так, как будто у неё зажали shift... на ноуте и на большом компе этот глюк сохраняется.
Код:
Dim $aAccelKeys[5][2] = [['1', $Btn1],['2', $Btn2],['3', $Btn3],['^{Enter}', $iDummy_TAB],['+{Enter}', $iDummy_txt2]]


Код:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>

$hGui=GUICreate("Записи", 340, 200)

If Not IsDeclared('last') Then $last = "чему-то"

$Btn1 = GUICtrlCreateButton("р+", 9, 108, 120, 35)
$Btn2 = GUICtrlCreateButton("о", 145, 108, 89, 35)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
$Btn3 = GUICtrlCreateButton("after", 275, 108, 55, 35)
$last2 = GUICtrlCreateButton(Chr(164), 311, 34, 20, 19)
$nCheckbox = GUICtrlCreateCheckbox('on top', 275, 3, -1, 20, $BS_RIGHTBUTTON)
GUICtrlSetState(-1, 1)
$Input2 = GUICtrlCreateInput("$Input2", 9, 34, 52, 23)
GUICtrlSetBkColor(-1, 0xCBCBC6)
$last1 = GUICtrlCreateEdit($last, 167, 34, 143, 20, BitOR($ES_READONLY, $ES_RIGHT), $WS_EX_STATICEDGE)
$Text1 = GUICtrlCreateInput("$Text1 ", 6, 78, 334, 21)
GUICtrlSetState(-1, $GUI_FOCUS)

GUICtrlCreateLabel('Ввод данных:', 6, 59, 334, 17)
GUICtrlSetBkColor(-1, 0xfdffae)

$iDummy = GUICtrlCreateDummy()
$iDummy_TAB = GUICtrlCreateDummy()
$iDummy_txt2 = GUICtrlCreateDummy()

Dim $aAccelKeys[5][2] = [['1', $Btn1],['2', $Btn2],['3', $Btn3],['^{Enter}', $iDummy_TAB],['+{Enter}', $iDummy_txt2]]
GUISetAccelerators($aAccelKeys)

GUISetState()
WinSetOnTop($hGui, '', 1) ; 1 так как Checkbox = 1

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $iDummy
            Exit
        Case $Btn1
            MsgBox(0, 'Сообщение', 'Тест1', 0, $hGui)
        Case $Btn2
            MsgBox(0, 'Сообщение', 'Тест2', 0, $hGui)
        Case $Btn3
            MsgBox(0, 'Сообщение', 'Тест3', 0, $hGui)
        Case $last2
            GUICtrlSetData($Text1 & " ", GUICtrlRead($last1))
        Case $nCheckbox
            WinSetOnTop($hGui, '', BitAND(GUICtrlRead($nCheckbox), $GUI_CHECKED))
		Case $iDummy_TAB
            Send("{TAB}")
			;Send("+{TAB}")
		Case $iDummy_txt2
            GUICtrlSetState($Input2, $GUI_FOCUS)

    EndSwitch
WEnd
 
Верх