Maske zum Markieren in Monatskalender erstellen

    • Offizieller Beitrag

    Hi,
    wenn man in einem Monatskalender (GUICtrlCreateMonthCal) Tage fett markieren möchte (erfordert Style: $MCS_DAYSTATE) ist es erforderlich, die Tage zu maskieren.
    Mit der folgenden Funktion wird das erledigt. Einfach einen String mit den zu markierenden Tagen übergeben (braucht nicht in Reihenfolge zu sein) und die Maske als Hexstring wird zurückgegeben.
    Trennzeichen ist standardmäßig das per Opt('GUIDataSeparatorChar') festgelegte Zeichen.
    Markiert wird mit _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks).

    Edit:
    Übergabe nun als trennzeichenbasierter String oder als Array möglich.

    Edit 12.08.2011
    Da sich diese Funktion nicht nur für _GUICtrlMonthCal_SetDayState verwenden läßt, sondern generell, wenn innerhalb eines Monats Markierungen für verschiedene Tage gesetzt werden sollen, habe ich jetzt mal noch die Gegenfunktion zum Auslesen der markierten Tage erstellt.
    Die Funktionen sind also:

    _GetHexMask($vDays [, $Delim=Default])
    Codiert die übergebenen Tageszahlen (1-31) als Hex-String, wie er als Maske zum Markieren mit _GUICtrlMonthCal_SetDayState im MonthCal Anwendung findet

    _DecodeHexMask($sHex [, $fArray=True[, $Delim=Default]])
    Gibt die mit _GetHexMask() codierten Tageszahlen (1-31) als Array (Standard) oder Trennzeichenstring zurück

    Days2HexMask.au3
    [autoit]

    Local $aDays[6] = [10,12,13,23,25,31]
    $sHex1 = _GetHexMask($aDays)
    ConsoleWrite('--@@Line[' & @ScriptLineNumber -1 & '] Debug_Var >> $sHex1 >>' & $sHex1 & @CRLF) ;### DebugToConsole
    $sHex2 = _GetHexMask('1|5|7|22|30|31')
    ConsoleWrite('--@@Line[' & @ScriptLineNumber -1 & '] Debug_Var >> $sHex2 >>' & $sHex2 & @CRLF) ;### DebugToConsole

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $sRet = _DecodeHexMask($sHex1, False)
    ConsoleWrite($sRet & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $sRet = _DecodeHexMask($sHex2, False)
    ConsoleWrite($sRet & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $aRet = _DecodeHexMask($sHex1)
    _ArrayDisplay($aRet)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; 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] += 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

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; 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

    [/autoit]
    • Offizieller Beitrag

    Woher hast du den Style $MCS_DAYSTATE, kann ihn in der Hilfe nicht finden.


    Kannst du mal ein Beispiel machen? Wäre Interessant.


    Edit: hab den Syle bei _GUICtrlMonthCal_Create gefunden.

    • Offizieller Beitrag

    Hier ein Bsp.:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiMonthCal.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Month Calendar Set Day State", 400, 300)
    Local $hMonthCal = GUICtrlCreateMonthCal("", 4, 4, -1, -1, BitOR($WS_BORDER, $MCS_DAYSTATE), 0x00000000)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aMasks[_GUICtrlMonthCal_GetMonthRangeSpan($hMonthCal, True)]

    [/autoit] [autoit][/autoit] [autoit]

    $aMasks[1] = _GetHexMask('1,5,6,8,12,22,23,24,30', ',')
    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetHexMask($sDays, $Delim=Default)
    If $Delim = Default Then $Delim = Opt('GUIDataSeparatorChar')
    Local $aDays = StringSplit($sDays, $Delim, 2)
    Local $aHex[8] = [0,0,0,0,0,0,0,0], $pos, $out = ''
    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] += 2 ^ ($aDays[$i]-1)
    Next
    For $i = 0 To UBound($aHex) -1
    $out = Hex($aHex[$i], 1) & $out
    Next
    Return '0x' & $out
    EndFunc ;==>_GetHexMask

    [/autoit]
    • Offizieller Beitrag

    Hey, danke für das Beispiel. :thumbup::thumbup:

    • Offizieller Beitrag

    Ich habe das mal erweitert (Übergabe als String oder Array) und direkt in die Funktion _GUICtrlMonthCal_SetDayState integriert.
    Im EN-Forum (Developer Chat) hab ich mal zur Diskussion gestellt, ob es eine sinnvolle Ergänzung der bisherigen Funktion wäre. Mal sehen, wie die Reaktionen sind.