Что нового

[Элементы GUI] GUICtrlMonthCal Отметить дни через SetDayState

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Есть несколько месяцев и определенные в них дни. Задача, выделить их в _GUICtrlMonthCal.
Сделать, как я понял это можно через _GUICtrlMonthCal_SetDayState, но как обозначить маску для выделения не пойму. Помогите разобраться.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
r35p3ct
Я понял, как использовать маску:
Берем двоичное число, где каждый разряд это день месяца в календаре (справа налево)... "0" - день не подсвечен, "1" - день подсвечен...
Например, надо подсветить 3, 5, 8 и 20 число месяца, получаем двоичное число:
0000 1000 0000 0000 1001 0100, которое переводим в шестнадцатиричное: 0x80094...
Это и будет маска...
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
snoitaleR [?]
0000 1000 0000 0000 1001 0100, которое переводим в шестнадцатиричное: 0x80094...
Как попроще сделать это на Autoit?
через Hex, прогоняя по 4 бита или еще как нибудь?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
r35p3ct сказал(а):
Как попроще сделать это на Autoit?
Просто тупо в лоб. IMHO самый надежный способ.

Код:
ConsoleWrite('0x' & _Bin2Hex('0000 1000 0000 0000 1001 0100') & @CR)

Func _Bin2Hex($sBit)

	Local $Result = ''

	$sBit = StringStripWS($sBit, 8)
	While $sBit
		$Bit = StringRight($sBit, 4)
		If StringLen($Bit) < 4 Then
			$Bit = StringFormat('%04s', $Bit)
		EndIf
		Switch $Bit
			Case '0000'
				$Result = '0' & $Result
			Case '0001'
				$Result = '1' & $Result
			Case '0010'
				$Result = '2' & $Result
			Case '0011'
				$Result = '3' & $Result
			Case '0100'
				$Result = '4' & $Result
			Case '0101'
				$Result = '5' & $Result
			Case '0110'
				$Result = '6' & $Result
			Case '0111'
				$Result = '7' & $Result
			Case '1000'
				$Result = '8' & $Result
			Case '1001'
				$Result = '9' & $Result
			Case '1010'
				$Result = 'A' & $Result
			Case '1011'
				$Result = 'B' & $Result
			Case '1100'
				$Result = 'C' & $Result
			Case '1101'
				$Result = 'D' & $Result
			Case '1110'
				$Result = 'E' & $Result
			Case '1111'
				$Result = 'F' & $Result
			Case Else
				Return SetError(1, 0, '')
		EndSwitch
		$sBit = StringTrimRight($sBit, 4)
	WEnd
	If Not $Result Then
		Return SetError(1, 0, '')
	EndIf
	Return $Result
EndFunc   ;==>_Bin2Hex
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Я вот что напридумал) Вроде тоже работает...
Код:
func toHex($par)
	local $hex,$b=1,$to
	$to=StringLen($par)/4
	for $i=1 to $to
		$tPar=StringMid ( $par, $b , 4 )
		$hex&=Hex($tPar,1)
		$b+=4
	Next
	Return "0x"&$hex
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
r35p3ct сказал(а):
Я вот что напридумал) Вроде тоже работает...
Это неправильно работает.

Код:
ConsoleWrite(toHex('1111') & @CR)


;)
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
r35p3ct
Мой вариант...

Код:
; НАЧАЛО

 MsgBox(0,"",MASKA("3,5,8,20"))

 Func MASKA($S)

  Local $H

  $A=StringSplit($S,",")
  For $iA=1 To UBound($A)-1
   $H=$H+BitShift(2,-$A[$iA]+2)
  Next

  Return Hex($H)

 EndFunc

; КОНЕЦ
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
snoitaleR
Хорошая функция) Но,

ConsoleWrite( MASKA("1,8,16")& @LF)
Выводит 00008081, а должно быть 0x8081.
Вручную резать нули и добавлять 0x?
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
r35p3ct
Я думаю, нули незначащие и не должны повлиять отрицательно на функцию _GUICtrlMonthCal_SetDayState()...
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
snoitaleR
Проверил, влияет.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
r35p3ct
Нули незначащие, но "0x" нужен... :smile:

Код:
Return "0x"&Hex($H)
 
Верх