Что нового

Кнопки как в меню меняли цвет при получении фокуса

bigarN

Новичок
Сообщения
50
Репутация
0
Приветствую всех.
Есть форма, на ней кнопки. Клавишами "UP", "DOWN" передвигаясь по кнопкам, выделяем их. И при выделении кнопки должны менять цвет как в меню, а при нажатии выполнять свои действия. Трудность создает кнопки созданные массивом. Вот здесь Yashied привел пример.Но дальше я не смог . http://autoit-script.ru/index.php/topic,3892.msg28441.html#msg28441
Может поможете. За ранее спасибо. :smile:
Код:
#include <GUIConstantsEx.au3>
#Include <ButtonConstants.au3>
#Include <WindowsConstants.au3>
Dim $aButton[7] = [6]
Global $iIndex
$hGui=GUICreate('Test', 160, 220)
For $i = 1 To $aButton[0]
    $aButton[$i] = GUICtrlCreateButton('Button ' & $i, 20, 5 + ($i - 1) * 25, 120, 25, $BS_NOTIFY)
Next
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hGui
            Switch BitShift($wParam, 16)
                Case $BN_SETFOCUS
                    Switch BitAND($wParam, 0xFFFF)
	;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
						Case $aButton[1] To $aButton[$aButton[0]]

	                     GUICtrlSetBkColor($aButton[$iIndex][0],0xFFFF00)
	                     GUICtrlSetColor($aButton[$iIndex][0],0x000000)
    ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А вы не задумывались, для чего я поставил $BS_NOTIFY в том примере?
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Yashied
Исправил.Но выдается такая ошибка
Код:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
GUICtrlSetBkColor($aButton[$iIndex][0],0xFFFF00)
GUICtrlSetBkColor(^ ERROR
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Case $aButton[1] To $aButton[$aButton[0]] - вроде одномерный массив, а на следующей строке
GUICtrlSetBkColor($aButton[$iIndex][0],0xFFFF00) ???
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
ну на словах это будет так, хотя вы это поняли
Код:
При получении фокуса у кнопки 
GUICtrlSetBkColor($aButton[$iIndex],0xFFFF00)
При потере 
GUICtrlSetBkColor($aButton[$iIndex],0xДефаулт)


А у madmasles такой пример

http://autoit-script.ru/index.php/topic,7243.msg49748.html#msg49748
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Уважаемые Гуру.
Вот добавил несколько строчек в пример Yashied для 2-х кнопок , работает. А если в скрипте будет 12 кнопок тогда что… Как вычислить индекс кнопки и все это к этой кнопке применить ???
Код:
#Include <ButtonConstants.au3> ;Re: Событие "выделение кнопки"
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

$hForm = GUICreate('MyGUI', 300, 120)
$Button1 = GUICtrlCreateButton('OK', 40, 27, 100, 27, $BS_NOTIFY)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
$Button2 = GUICtrlCreateButton('Cancel', 40, 57, 100, 27, $BS_NOTIFY)
$Label = GUICtrlCreateLabel('555', 10, 98, 200, 14)
$Label2 = GUICtrlCreateLabel('нажмите на клав. UP - DOWN ', 10, 8, 200, 14)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            MsgBox(0, '', 'Какое-нибудь сообщение.')
        Case $Button2
            MsgBox(0, '', 'Еще одно какое-нибудь сообщение.')
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hForm
            Switch BitShift($wParam, 16)
                Case $BN_SETFOCUS
                    Switch BitAND($wParam, 0xFFFF)
                        Case $Button1
                            GUICtrlSetData($Label, 'Set focus to "OK" button')
						GUICtrlSetBkColor($Button1,0xFFFF00)
	                    GUICtrlSetColor($Button1,0x000000)
						GUICtrlSetBkColor($Button2,0xFF0000)
	                    GUICtrlSetColor($Button2,0xFFFFFF)
                        Case $Button2
                            GUICtrlSetData($Label, 'Set focus to "Cancel" button')
						GUICtrlSetBkColor($Button2,0xFFFF00)
	                    GUICtrlSetColor($Button2,0x000000)
						GUICtrlSetBkColor($Button1,0xFF0000)
	                    GUICtrlSetColor($Button1,0xFFFFFF)
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
bigarN [?]
А если в скрипте будет 12 кнопок тогда что
5 кнопок, на 12 лень названия придумывать. :smile:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

Dim $aButton[6][2] = [[5],['OK'],['Cancel'],['Back'],['Forward'],['Home']]
Global $iID_Old = -1

$hForm = GUICreate('MyGUI', 180, 240)
For $i = 1 To $aButton[0][0]
	$aButton[$i][1] = GUICtrlCreateButton($aButton[$i][0], 40, 27 + ($i - 1) * 37, 100, 27, $BS_NOTIFY)
	GUICtrlSetBkColor(-1, 0xFFFF00)
	GUICtrlSetColor(-1, 0x000000)
Next
GUICtrlSetState($aButton[1][1], $GUI_DEFBUTTON)
$nLabel = GUICtrlCreateLabel('', 10, 215, 160, 14, $SS_CENTER)
GUICtrlCreateLabel('нажмите UP-DOWN (TAB)', 10, 8, 160, 14, $SS_CENTER)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aButton[1][1] To $aButton[$aButton[0][0]][1]
			MsgBox(0, '', 'Нажата кнопка: "' & GUICtrlRead($nMsg) & '"')
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	Local $i_ID_From = BitAND($wParam, 0xFFFF)
	Local $i_Cod = BitShift($wParam, 16)
	Switch $hWnd
		Case $hForm
			Switch $i_Cod
				Case $BN_SETFOCUS
					Switch $i_ID_From
						Case $aButton[1][1] To $aButton[$aButton[0][0]][1]
							If $iID_Old <> $i_ID_From Then
								GUICtrlSetData($nLabel, 'Set focus to "' & GUICtrlRead($i_ID_From) & '" button')
								GUICtrlSetBkColor($i_ID_From, 0xFF0000)
								GUICtrlSetColor($i_ID_From, 0xFFFFFF)
								If $iID_Old <> -1 Then
									GUICtrlSetBkColor($iID_Old, 0xFFFF00)
									GUICtrlSetColor($iID_Old, 0x000000)
								EndIf
								$iID_Old = $i_ID_From
							EndIf
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
:shok: :smile: :ok:
madmasles
Спасибо выручателью без помощьных новичков. Век живи. СПАСИБО.

Спасибо Yashied за это скрипт
http://autoit-script.ru/index.php/topic,3892.msg28441.html#msg28441

Спасибо CreatoR за этот скрипт
http://autoit-script.ru/index.php/topic,149.msg1001.html#msg1001

И просьба на последок. А можно как та GUICtrlOnHover.au3 применить в этот скрипт,чтоб при наводке мыши на кнопок выполнялись эти же действия.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
bigarN [?]
чтоб при наводке мыши на кнопок выполнялись эти же действия
Так?
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

Dim $aButton[6][2] = [[5],['OK'],['Cancel'],['Back'],['Forward'],['Home']]
Global $iID_Old = -1, $iCur_Old = -1, $fChange

$hForm = GUICreate('MyGUI', 180, 240)
For $i = 1 To $aButton[0][0]
	$aButton[$i][1] = GUICtrlCreateButton($aButton[$i][0], 40, 27 + ($i - 1) * 37, 100, 27, $BS_NOTIFY)
	GUICtrlSetBkColor(-1, 0xFFFF00)
	GUICtrlSetColor(-1, 0x000000)
Next
GUICtrlSetState($aButton[1][1], $GUI_DEFBUTTON)
$nLabel = GUICtrlCreateLabel('', 10, 215, 160, 14, $SS_CENTER)
GUICtrlCreateLabel('нажмите UP-DOWN (TAB)', 10, 8, 160, 14, $SS_CENTER)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

While 1
	$aCur = GUIGetCursorInfo()
	If Not @error Then
		Switch $aCur[4]
			Case $aButton[1][1] To $aButton[$aButton[0][0]][1]
				$fChange = True
				If $iCur_Old <> $aCur[4] Then
					GUICtrlSetBkColor($aCur[4], 0x00FF00)
					If $iCur_Old <> -1 And $iID_Old <> -1 Then
						If $iCur_Old <> $iID_Old Then
							GUICtrlSetBkColor($iCur_Old, 0xFFFF00)
						Else
							GUICtrlSetBkColor($iCur_Old, 0xFF0000)
						EndIf
					EndIf
					$iCur_Old = $aCur[4]
				EndIf
			Case Else
				If $fChange Then
					If $iCur_Old <> $iID_Old Then
						GUICtrlSetBkColor($iCur_Old, 0xFFFF00)
					Else
						GUICtrlSetBkColor($iCur_Old, 0xFF0000)
					EndIf
					$iCur_Old = -1
					$fChange = False
				EndIf
		EndSwitch
	EndIf
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aButton[1][1] To $aButton[$aButton[0][0]][1]
			MsgBox(0, '', 'Нажата кнопка: "' & GUICtrlRead($nMsg) & '"')
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	Local $i_ID_From = BitAND($wParam, 0xFFFF)
	Local $i_Cod = BitShift($wParam, 16)
	Switch $hWnd
		Case $hForm
			Switch $i_Cod
				Case $BN_SETFOCUS
					Switch $i_ID_From
						Case $aButton[1][1] To $aButton[$aButton[0][0]][1]
							If $iID_Old <> $i_ID_From Then
								GUICtrlSetData($nLabel, 'Set focus to "' & GUICtrlRead($i_ID_From) & '" button')
								GUICtrlSetBkColor($i_ID_From, 0xFF0000)
								GUICtrlSetColor($i_ID_From, 0xFFFFFF)
								If $iID_Old <> -1 Then
									GUICtrlSetBkColor($iID_Old, 0xFFFF00)
									GUICtrlSetColor($iID_Old, 0x000000)
								EndIf
								$iID_Old = $i_ID_From
							EndIf
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
:thumbs_up: :smile: :shok: :-[ :ok: :beer: :IL_AutoIt_1:
Благодарью за искренную помощь
Большое СПАСИБО. :bye:
 
Верх