Что нового

[Элементы GUI] ContextMenu - сохранение данных в INI ... и возврат обратно.

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Не большой пример, GUI окно с контекстным меню.

Поддерживается :
1. Сохранение настроек в INI файл (работает через WM_COMMAND)
2. "Возврат настроек обратно" (Помечаются галками пункты контекстного меню).
3. Функция настройки по умолчанию.

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

$sPATH_SETTINGS_INI = @ScriptDir & '\Settings_' & StringTrimRight(@ScriptName, 4) & '.ini'
Dim $aContrl[8] = ["Меню 1", "Меню 2", "Меню >", "Под меню 1", "Под меню 2", "Под меню 3", "Выход", "Стандартные настройки"]

;~ $aIniKey[n][0] - Ключ
;~ $aIniKey[n][1] - "Значение по умолчанию"

Dim $aIniKey[5][2] = [ _
		["menu 1", "1"], _
		["menu 2", "1"], _
		["submenu 1", "1"], _
		["submenu 2", "4"], _
		["submenu 3", "4"]]

GUICreate("My GUI Context Menu", 300, 200)

$ContextMenu = GUICtrlCreateContextMenu()
$ContextMenuString0 = GUICtrlCreateMenuItem($aContrl[0], $ContextMenu)
$ContextMenuString1 = GUICtrlCreateMenuItem($aContrl[1], $ContextMenu)
	GUICtrlCreateMenuItem("", $ContextMenu)
$SubMenu = GUICtrlCreateMenu($aContrl[2], $ContextMenu)
					$ContextMenuString2 = GUICtrlCreateMenuItem($aContrl[3], $SubMenu)
					$ContextMenuString3 = GUICtrlCreateMenuItem($aContrl[4], $SubMenu)
					$ContextMenuString4 = GUICtrlCreateMenuItem($aContrl[5], $SubMenu)

GUICtrlCreateMenuItem("", $ContextMenu)
$ContextMenuString5 = GUICtrlCreateMenuItem($aContrl[6], $ContextMenu)
$ContextMenuString6 = GUICtrlCreateMenuItem($aContrl[7], $ContextMenu)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState()

_ContextMenuReadSettings()

While 1
	$nMsg = GUIGetMsg(1)
	Switch $nMsg[0]
		Case $GUI_EVENT_CLOSE, $ContextMenuString5
			Exit

		Case $ContextMenuString6
			_ContextMenuSettingsDefault()
			MsgBox(0,"","Настройки по умолчанию при следующем запуске!")
			Exit

		Case Else
			_ContextMenuChecked()

	EndSwitch
WEnd

Func _ContextMenuChecked()

	For $i = 0 To 4
		If $nMsg[0] = Execute("$ContextMenuString" & $i) Then
			If BitAND(GUICtrlRead(Execute("$ContextMenuString" & $i)), $GUI_CHECKED) = $GUI_CHECKED Then
				GUICtrlSetState(Execute("$ContextMenuString" & $i), $GUI_UNCHECKED)
			Else
				GUICtrlSetState(Execute("$ContextMenuString" & $i), $GUI_CHECKED)
			EndIf
		EndIf
	Next

EndFunc   ;==>_ContextMenuChecked

Func _ContextMenuSettingsDefault() ; Настройки по умолчанию

	For $i = 0 To UBound($aIniKey) - 1
		IniWrite($sPATH_SETTINGS_INI, "settings", $aIniKey[$i][0], $aIniKey[$i][1])
	Next

EndFunc   ;==>_ContextMenuSettingsDefault

Func _ContextMenuReadSettings() ; Чтение настроек из INI файла

	$aArray = IniReadSection($sPATH_SETTINGS_INI, "settings")
	If (@error) Or $aArray[0][0] <> UBound($aIniKey) Then _ContextMenuSettingsDefault()
	$aArray = IniReadSection($sPATH_SETTINGS_INI, "settings")
	If Not (@error) Then
		For $i = 0 To UBound($aIniKey) - 1
			If $aArray[$i + 1][0] = $aIniKey[$i][0] Then
				If $aArray[$i + 1][1] = 1 Then
					GUICtrlSetState(Execute("$ContextMenuString" & $i), $GUI_CHECKED)
				Else
					GUICtrlSetState(Execute("$ContextMenuString" & $i), $GUI_UNCHECKED)
				EndIf
			EndIf
		Next
	EndIf

EndFunc   ;==>_ContextMenuReadSettings

Func _ContextMenuWhileSettings($sReadContrl)

	For $i = 0 To UBound($aIniKey) - 1
		If $sReadContrl = $aContrl[$i] Then
			If BitAND(GUICtrlRead(Execute("$ContextMenuString" & $i)), $GUI_CHECKED) = $GUI_CHECKED Then
				ConsoleWrite("_ContextMenuWhileSettings() \" & $sReadContrl & ' \ ' & $aIniKey[$i][0] & "  -  "& 4 & @CRLF)
				IniWrite($sPATH_SETTINGS_INI, "settings", $aIniKey[$i][0], 4)
			Else
				ConsoleWrite("_ContextMenuWhileSettings() \" & $sReadContrl & ' \ ' & $aIniKey[$i][0] & "  -  "& 1 & @CRLF)
				IniWrite($sPATH_SETTINGS_INI, "settings", $aIniKey[$i][0], 1)
			EndIf
			ExitLoop
		EndIf
	Next

EndFunc   ;==>_ContextMenuWhileSettings

Func WM_COMMAND($nHnwd, $MsgID, $WParam, $LParam)

	Local $iIDFrom = BitAND($WParam, 0xFFFF) ; Low Word
	Local $iCode = BitShift($WParam, 16) ; Hi Word
	Local $aRead[2] = [GUICtrlRead($iIDFrom), GUICtrlRead($iIDFrom, 1)]
	_ContextMenuWhileSettings($aRead[1])
	Return $GUI_RUNDEFMSG

EndFunc   ;==>WM_COMMAND
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Я бы вместо Execute использовал Eval.
 
Верх