Du kannst Tage im Monatskalender markieren. Dazu muß eine Maske übergeben werden. Aus mir unverständlichen Gründen wurde zu dieser nicht ganz einfachen Erstellung der Maske keine Funktion in die UDF integriert. Ich hatte deshalb bereits 2009 die fehlende Funktion erstellt, aber wie nicht anders zu erwarten lehnen die Jungs im EN-Forum es ab Funktionen die das Leben erleichtern mit in die Bibliothek aufzunehmen.
Da die Forensuche zur Zeit immer auf die Startseite verlinkt poste ich mal ein Bsp-Skript:
Spoiler anzeigen
#include <GuiConstantsEx.au3>
#include <GuiMonthCal.au3>
#include <WindowsConstants.au3>
Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
GUICreate("Month Calendar Set Day State", 400, 300)
Local $hMonthCal = GUICtrlCreateMonthCal("", 4, 4, -1, -1, BitOR($WS_BORDER, $MCS_DAYSTATE), 0x00000000)
; $aMasks ist ein Array in dem die Masken für die Kalenderdarstellung übergeben werden
Local $aMasks[_GUICtrlMonthCal_GetMonthRangeSpan($hMonthCal, True)]
; an Index [1] von $aMask wird die HexMask für die zu markierenden Tage gesetzt
$aMasks[1] = _GetHexMask('1,5,6,8,12,22,23,24,30', ',')
GUISetState()
[/autoit] [autoit][/autoit] [autoit]_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
[/autoit] [autoit][/autoit] [autoit]Sleep(1500)
$aMasks[1] = _GetHexMask('1,2,3,12,13,14,29,30', ',')
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
$aMasks[1] = _GetHexMask('11', ',')
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
$aMasks[1] = _GetHexMask('') ; Markierung löschen
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
; oder als Array übergeben
Sleep(1500)
Local $a[9] = [1,5,6,8,12,22,23,24,30]
$aMasks[1] = _GetHexMask($a)
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
Local $b[8] = [1,2,3,12,13,14,29,30]
$aMasks[1] = _GetHexMask($b)
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
Local $c[1] = [11]
$aMasks[1] = _GetHexMask($c)
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
Local $d[1] = ['']
$aMasks[1] = _GetHexMask($d)
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc ;==>Example
;===============================================================================
; Function Name..: _GetHexMask($vDays [, $Delim=Default])
; Description....: Codiert die übergebenen Tageszahlen (1-31) als Hex-String, wie er als Maske zum Markieren mit _GUICtrlMonthCal_SetDayState
; ...............: im MonthCal Anwendung findet
; Parameter(s)...: $vDays Trennzeichenbasierter String oder Array mit den zu markierenden Tagen
; ...............: $Delim das Trennzeichen, Standard ist 'Default' (Zeichen von 'GUIDataSeparatorChar')
; Return Value(s): Hexstring für $aMasks
; Author(s)......: BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _GetHexMask($vDays, $sDelim=Default)
If $sDelim = Default Then $sDelim = Opt('GUIDataSeparatorChar')
If (( Not IsArray($vDays) ) And ($vDays = '') ) Or _
(( IsArray($vDays) ) And ($vDays[0] = '') ) Then
Return '0x0'
Else
Local $aDays
If (Not IsArray($vDays)) Then
$aDays = StringSplit($vDays, $sDelim, 2)
Else
$aDays = $vDays
EndIf
Local $aHex[8] = [0,0,0,0,0,0,0,0], $pos, $mask = ''
For $i = 0 To UBound($aDays) -1
Select
Case $aDays[$i] < 5
$pos = 0
Case $aDays[$i] < 9
$pos = 1
Case $aDays[$i] < 13
$pos = 2
Case $aDays[$i] < 17
$pos = 3
Case $aDays[$i] < 21
$pos = 4
Case $aDays[$i] < 25
$pos = 5
Case $aDays[$i] < 29
$pos = 6
Case Else
$pos = 7
EndSelect
$aDays[$i] -= $pos * 4
$aHex[$pos] += Int(2 ^ ($aDays[$i]-1))
Next
For $i = 0 To UBound($aHex) -1
$mask = Hex($aHex[$i], 1) & $mask
Next
Return '0x' & $mask
EndIf
EndFunc ;==>_GetHexMask
;===============================================================================
; Function Name..: _DecodeHexMask($sHex [, $fArray=True[, $Delim=Default]])
; Description....: Gibt die mit _GetHexMask() codierten Tageszahlen (1-31) als Array (Standard) oder Trennzeichenstring zurück
; Parameter(s)...: $sHex Der Hex-String mit dem/den codierten Zahlenwert/-en
; ...............: $fArray Rückgabe als Array (Standard), $a[0]=Anzahl oder String mit Trennzeichen
; ...............: $Delim Das Trennzeichen für Stringausgabe, Standard ist 'Default' (Zeichen von 'GUIDataSeparatorChar')
; Return Value(s): Array/String mit den im Hex-String codierten Tageszahlen
; Author(s)......: BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _DecodeHexMask($sHex, $fArray=True, $sDelim=Default)
If $sDelim = Default Then $sDelim = Opt('GUIDataSeparatorChar')
Local $aHex = StringSplit(Hex($sHex, 8), '', 2), $iInt, $sOut = ''
Local $aMask[8][4] = [[29,30,31],[25,26,27,28],[21,22,23,24],[17,18,19,20],[13,14,15,16],[9,10,11,12],[5,6,7,8],[1,2,3,4]]
For $i = 7 To 0 Step -1
$iInt = Int('0x' & $aHex[$i])
If $iInt = 0 Then ContinueLoop
For $j = 0 To 3
If BitAND($iInt, 2^$j) Then
$sOut &= $aMask[$i][$j] & ","
$iInt = BitXOR($iInt, 2^$j)
EndIf
Next
Next
If $fArray Then Return StringSplit(StringTrimRight($sOut, 1), ',')
Return StringTrimRight($sOut, 1)
EndFunc ;==>_DecodeHexMask