Kalender Control (wie Win7 Datums-Control)

    • Offizieller Beitrag

    Hi,
    in letzter Zeit waren einige Fragen zur farblichen Markierung von Datums-Controls.
    Ich habe daher mal das Monats-Ctrl anhand des aus Win7 bekannten Datums-Ctrl nachkodiert. Funktionalität ist identisch, nur dass ich nicht diese smoothingen Übergänge benutze.
    Zusätzlich lassen sich in meinem Bsp. beliebig viele Daten farbig markieren. Entweder mit einer vordefinierten Farbe für alle Markierungen gleich oder mit Öffnen der Farbpalette zur individuellen Auswahl bei jedem Klick auf ein Tagesdatum. Ist ein Datum bereits markiert, wird die Markierung beim Klick gelöscht.
    Datum der Markierung und verwendete Farbe werden in einem Dictionary Objekt gespeichert und können von dort für weitere Verwendung genutzt werden.

    Edit: Noch einen Bug beim Wechsel auf die 10-Jahres Übersicht gefixt

    Edit 13.06.2011: Version 1.2
    - HEUTE (Tag im Monatskalender) und aktueller/zuletzt gewählter Wert (Monat im Jahreskalender, Jahr im 10-Jahreskalender, 10-Jahr-Block in 10-Jahres-Übersicht) sind rot umrahmt
    - im Monatskalender am linken Rand jeder Zeile ein Blind-Label eingefügt mit ControlTip: Nummer Kalenderwoche

    Edit 13.06.2011 (2): Version 1.3
    - markierte Datumswerte werden mit Farbwert in einer INI gespeichert und beim Start geladen
    - markierten Datumswerten können per Rechtsklick in einem Editfenster Kommentare zugeordnet werden
    - die Kommentare werden in der INI beim Beenden gespeichert und beim Start wieder geladen
    - da es erst beim Beenden passiert, wird ein Kommentar nicht sofort durch versehentliches Demarkieren eines Datums gelöscht

    Edit 15.06.2011: Version 1.4
    - statt vordefinierter Farbe oder Palette, wird eine frei konfigurierbare Liste (gefärbte Radio-Ctrl) für Kategorie+Farbe eingeblendet
    - die Liste wird zur Laufzeit dynamisch gestaltet (Ctrl hinzufügen/löschen), Anpassung Fenstergröße
    - Kategorien/Farben werden beim Beenden in einer INI gespeichert und beim Start neu geladen

    Spoiler anzeigen
    [autoit]

    #Region - TimeStamp
    ; 2011-06-15 14:12:42 v 1.4
    #EndRegion - TimeStamp
    #include <ButtonConstants.au3>
    #include <Date.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    ; BugFix

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

    Opt('GUIOnEventMode', 1)

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

    Global $h10YearView, $h10YearCal, $hYearCal, $hMonthCal, $hComment, $hEdit, $sDateComment, $hCategory
    Global $btPrev10YearView, $btNext10YearView
    Global $btPrevYear, $btNextYear, $lbYear
    Global $btPrevMonth, $btNextMonth, $lbMonth
    Global $TodayID, $aCtrlFrame = 0
    Global $iCurrMonth = @MON, $iCurrYear = @YEAR, $iCurr10Year = StringLeft($iCurrYear, 3), $iCurr10YearEnd = $iCurr10Year & 9
    Global $iShowMonth = $iCurrMonth, $iShowYear = $iCurrYear, $iShow10Year = $iCurr10Year
    ;~ $iCurrMonth aktueller (bzw. zuletzt gewählter) Monat
    ;~ $iCurrYear aktuelles (bzw. zuletzt gewähltes) Jahr
    ;~ $iCurr10Year aktuelles (bzw. zuletzt gewähltes) Jahrzehnt (3-stellig)
    ;~ $iCurr10YearEnd letztes Jahr des aktuellen (bzw. zuletzt gewählten) Jahrzehnts
    ;~ $iShowMonth Monat für Rahmen im Jahreskalender
    ;~ $iShowYear Jahr für Rahmen im 10-Jahreskalender
    ;~ $iShow10Year Jahrzehnt für Rahmen in 10-Jahresübersicht (3-stellig)
    Global $aShortMonth[12] = ['Jan','Feb','Mrz','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez']
    Global $a10YearsView[24], $a10Years[12], $aMonth[12], $aDays[42], $aToolTip[6] ; [ID]
    Global $oMarkedDays = ObjCreate("Scripting.Dictionary") ; Key=Datum (JJJJ/MM/TT), Value=Hintergrundfarbe
    Global Const $DefCol = 0xF0F0F0, $LightPink = 0xFFB6C1, $LightSkyBlue = 0x87CEEB, $LightGoldenrodYellow = 0xFAFAD2, $LightCyan = 0xE0FFFF
    Global $oComment = ObjCreate("Scripting.Dictionary") ; Key=Datum (JJJJ/MM/TT), Value=Kommentar
    Global $aCat[1][2] = [[0]], $yCat = 40, $sDateCat, $IndexCat
    ;~ Global $iChooseCol = $LightSkyBlue
    Global $iSetCol, $iChooseCol = -1 ; wenn -1 wird (benutzerdefinierte, speicherbar) Palette (mit Kategorienamen)zur Farbauswahl bei Klick auf Datum geladen, sonst wird die hier definierte Farbe gesetzt
    Local $x, $y

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

    ; beim Start Markierungen/Kommentare aus INI laden
    Local $sINI = @ScriptDir & '\myCal.INI'
    _ReadMarkedDaysFromINI($oMarkedDays, $sINI, 'marked')
    _ReadMarkedDaysFromINI($oComment, $sINI, 'comment')

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

    #region - Funktionen zu markierten Datumswerten
    ; Auslesen aus INI und Markierungen setzen beim Programmstart
    ; Rückgabe: Anzahl gelesener Markierungen
    Func _ReadMarkedDaysFromINI(ByRef $oDICT, $sINI, $sSection)
    Local $aSection = IniReadSection($sINI, $sSection)
    If @error Then Return SetError(1)
    For $i = 1 To $aSection[0][0]
    $oDICT.Add($aSection[$i][0], $aSection[$i][1])
    Next
    Return $aSection[0][0]
    EndFunc

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

    Func _ReadCategoryFromINI($sINI)
    Local $aRead = IniReadSection($sINI, 'category')
    If @error Then Return
    For $i = 1 To $aRead[0][0]
    _CatCtrlCreate($aRead[$i][0], $aRead[$i][1])
    Next
    GUISetState(@SW_HIDE, $hCategory)
    EndFunc

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

    ; Schreiben in INI
    ; Rückgabe: Return von IniWriteSection (1=Erfolg, 0=Fehler)
    Func _WriteMarkedDaysToINI(ByRef $oDICT, $sINI, $sSection)
    Local $aToINI = _GetMarkedDays($oDICT)
    If @error Then
    Return SetError(1)
    ElseIf $aToINI = 0 Then
    Return IniWriteSection($sINI, $sSection, '')
    EndIf
    Return IniWriteSection($sINI, $sSection, $aToINI)
    EndFunc
    ; z.B. Vorbereiten zum Schreiben in INI
    ; mit Übergabe Datum (JJJJ/MM/TT) wird geprüft ob dieser Tag markiert, sonst Rückgabe alle markierten Datumswerte
    ; Rückgabe Array [['JJJJ/MM/TT', iColor]] oder Trennzeichen-String '|' (nur Datum)
    ; wenn Datum nicht markiert oder keine markierten Daten vorhanden ==> Rückgabe 0, Fehler 1
    Func _GetMarkedDays(ByRef $oDICT, $sDate='', $fString=0)
    Local $iCount = $oDICT.Count, $sRet = ''
    If Not $iCount Then Return 0
    If $sDate = '' Then
    Local $aRet[$iCount +1][2] = [[$iCount]]
    Else
    If Not $oDICT.Exists($sDate) Then Return SetError(1,0,0)
    Local $aRet[2][2] = [[1],[$sDate,$oDICT.Item($sDate)]]
    If $fString = 1 Then Return $sDate
    Return $aRet
    EndIf
    Local $i = 1, $strKey, $colKeys = $oDICT.Keys
    For $strKey In $colKeys
    $aRet[$i][0] = $strKey
    $aRet[$i][1] = $oDICT.Item($strKey)
    $sRet &= $strKey & '|'
    $i += 1
    Next
    If $fString = 1 Then Return StringTrimRight($sRet, 1)
    Return $aRet
    EndFunc
    #endregion - markierte Datumswerte

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

    #region - Jahrzehnt Übersicht
    $h10YearView = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $h10YearView)
    $btPrev10YearView = GUICtrlCreateButton('<', 5, 5, 15, 20)
    GUICtrlSetOnEvent(-1, '_10YearViewEvent')
    $btNext10YearView = GUICtrlCreateButton('>', 180, 5, 15, 20)
    GUICtrlSetOnEvent(-1, '_10YearViewEvent')
    GUICtrlSetState(-1, $GUI_HIDE)
    $x = 6
    $y = 37
    For $i = 0 To 23
    Switch $i
    Case 2, 4, 6, 10, 12, 14, 18, 20, 22
    $y -= 21
    $x += 47
    Case 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23
    $y += 21
    Case 8, 16
    $x = 6
    $y += 22
    EndSwitch
    $a10YearsView[$i] = GUICtrlCreateLabel('', $x, $y, 46, 21, BitOR($ES_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetOnEvent(-1, '_10YearEvent')
    GUICtrlSetBkColor(-1, 0xD0D0D0)
    Next
    #endregion - Jahrzehnt Übersicht

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

    #region - Jahrzehntkalender
    $h10YearCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $h10YearCal)
    $btPrev10Year = GUICtrlCreateButton('<', 5, 5, 15, 20)
    GUICtrlSetOnEvent(-1, '_10YearCalEvent')
    $lb10Year = GUICtrlCreateLabel($iCurr10YearEnd -9 & ' - ' & $iCurr10YearEnd, 21, 8, 158, 17, $ES_CENTER)
    GUICtrlSetOnEvent(-1, '_10YearCalEvent')
    GUICtrlSetColor(-1, 0x0000FF)
    $btNext10Year = GUICtrlCreateButton('>', 180, 5, 15, 20)
    GUICtrlSetOnEvent(-1, '_10YearCalEvent')
    $x = 6
    $y = -5
    For $i = 0 To 11
    If Not Mod($i, 4) Then
    $x = 6
    $y += 42
    EndIf
    $a10Years[$i] = GUICtrlCreateLabel($iCurr10YearEnd -10 +$i, $x, $y, 46, 41, BitOR($ES_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetOnEvent(-1, '_YearEvent')
    GUICtrlSetBkColor(-1, 0xD0D0D0)
    If $i = 0 Or $i = 11 Then
    GUICtrlSetState(-1, $GUI_DISABLE)
    Else
    GUICtrlSetState(-1, $GUI_ENABLE)
    EndIf
    $x += 47
    Next
    #endregion - Jahrzehntkalender

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

    #region - Jahreskalender
    $hYearCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $hYearCal)
    $btPrevYear = GUICtrlCreateButton('<', 5, 5, 15, 20)
    GUICtrlSetOnEvent(-1, '_YearCalEvent')
    $lbYear = GUICtrlCreateLabel($iCurrYear, 21, 8, 158, 17, $ES_CENTER)
    GUICtrlSetOnEvent(-1, '_YearCalEvent')
    GUICtrlSetColor(-1, 0x0000FF)
    $btNextYear = GUICtrlCreateButton('>', 180, 5, 15, 20)
    GUICtrlSetOnEvent(-1, '_YearCalEvent')
    $x = 6
    $y = -5
    For $i = 0 To 11
    If Not Mod($i, 4) Then
    $x = 6
    $y += 42
    EndIf
    $aMonth[$i] = GUICtrlCreateLabel($aShortMonth[$i], $x, $y, 46, 41, BitOR($ES_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor(-1, 0xD0D0D0)
    GUICtrlSetOnEvent(-1, '_MonthEvent')
    $x += 47
    Next
    #endregion - Jahreskalender

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

    #region - Kategorie Marker
    $hCategory = GUICreate('Kategorie', 200, 40, -1, -1, -1, $WS_EX_TOOLWINDOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseCategory', $hComment)
    $btCat_New = GUICtrlCreateButton('Neu', 5, 5, 60, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetOnEvent(-1, '_CatNew')
    $btCat_Del = GUICtrlCreateButton('Löschen', 70, 5, 60, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetOnEvent(-1, '_CatDel')
    $btCat_Sel = GUICtrlCreateButton('Auswahl', 135, 5, 60, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetOnEvent(-1, '_CatSel')
    $group = GUICtrlCreateGroup('', 5, 28, 190, 2)
    GUICtrlSetBkColor(-1, 0xD0D0D0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlSetResizing($group, $GUI_DOCKALL)
    _setCatCtrlState()
    _ReadCategoryFromINI($sINI)
    #endregion - Kategorie Marker

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

    #region - Kommentarfenster
    $hComment = GUICreate('Kommentar', 300, 250, -1, -1, -1, $WS_EX_TOOLWINDOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseComment', $hComment)
    $hEdit = GUICtrlCreateEdit('', 5, 5, 290, 240)
    #endregion

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

    #region - Monatskalender
    Local $aWDays[7] = ['Mo','Di','Mi','Do','Fr','Sa','So']
    $hMonthCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $hMonthCal)
    GUISetOnEvent($GUI_EVENT_SECONDARYUP, '_RClickMonth', $hMonthCal)
    $btPrevMonth = GUICtrlCreateButton('<', 5, 5, 15, 20)
    GUICtrlSetOnEvent(-1, '_MonthCalEvent')
    $lbMonth = GUICtrlCreateLabel('Monat Jahr', 21, 8, 158, 17, $ES_CENTER)
    GUICtrlSetOnEvent(-1, '_MonthCalEvent')
    GUICtrlSetColor(-1, 0x0000FF)
    $btNextMonth = GUICtrlCreateButton('>', 180, 5, 15, 20)
    GUICtrlSetOnEvent(-1, '_MonthCalEvent')
    $x = 6
    For $i = 0 To 6
    GUICtrlCreateLabel($aWDays[$i], $x, 30, 26, 17, BitOR($ES_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor(-1, 0xD0D0D0)
    $x += 27
    Next
    $x = 6
    $y = 40
    For $i = 0 To 41
    If Not Mod($i, 7) Then
    $x = 6
    $y += 18
    EndIf
    $aDays[$i] = GUICtrlCreateLabel($i, $x, $y, 26, 17, BitOR($ES_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetOnEvent(-1, '_DayEvent')
    $x += 27
    Next
    ; (leere) Label für Tooltip Wochennummer
    $y = 58
    For $i = 0 To 5
    $aToolTip[$i] = GUICtrlCreateLabel(' ', 1, $y, 5, 17)
    $y += 18
    Next
    _setMonthView()
    #endregion - Monatskalender

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

    GUIRegisterMsg($WM_MOVE, "_WM_MOVE")
    GUISetState(@SW_SHOW, $hMonthCal)

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

    While 1
    Sleep(10)
    WEnd

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

    Func _end()
    ; Kommentare löschen, falls Markierung gelöscht
    _DeleteUnusedComments()
    ; beim Beenden Markierungen/Kommentare/Kategorien in INI schreiben
    If $aCat[0][0] = 0 Then
    IniWriteSection($sINI, 'category', '')
    Else
    For $i = 1 To $aCat[0][0]
    $aCat[$i][0] = ControlGetText($hCategory, '', $aCat[$i][0])
    Next
    IniWriteSection($sINI, 'category', $aCat)
    EndIf
    _WriteMarkedDaysToINI($oMarkedDays, $sINI, 'marked')
    _WriteMarkedDaysToINI($oComment, $sINI, 'comment')
    Exit
    EndFunc

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

    Func _CloseComment()
    Local $sRead = GUICtrlRead($hEdit)
    If $sRead <> '' Then
    $sRead = StringRegExpReplace($sRead, '\r\n', '¤')
    If $oComment.Exists($sDateComment) Then
    $oComment.Item($sDateComment) = $sRead
    Else
    $oComment.Add($sDateComment, $sRead)
    EndIf
    EndIf
    GUICtrlSetData($hEdit, '')
    GUISetState(@SW_HIDE, $hComment)
    EndFunc

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

    Func _DeleteUnusedComments()
    Local $strKey, $colKeys = $oComment.Keys
    For $strKey In $colKeys
    If Not $oMarkedDays.Exists($strKey) Then
    $oComment.Remove($strKey)
    EndIf
    Next
    EndFunc

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

    ;======= ANZEIGEN =====
    Func _show10YearView() ; wechselt von 10-Jahreskalender zu 10-Jahres-Übersicht
    GUISetState(@SW_SHOW, $h10YearView)
    _set10YearView()
    GUISetState(@SW_HIDE, $h10YearCal)
    EndFunc

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

    Func _show10YearCal($hWndFrom) ; wechselt von Jahreskalender/10-Jahres-Übersicht zu 10-Jahreskalender
    GUISetState(@SW_SHOW, $h10YearCal)
    If $iCurr10Year = $iShow10Year Then
    $aCtrlFrame = _FrameAroundCtrl_Create($h10YearCal, $a10Years[StringRight($iShowYear,1)+1])
    Else
    _FrameAroundCtrl_Delete()
    EndIf
    GUISetState(@SW_HIDE, $hWndFrom)
    EndFunc

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

    Func _showYearCal($hWndFrom) ; wechselt von Monatskalender/10-Jahreskalender zu Jahreskalender
    GUICtrlSetData($lbYear, $iCurrYear)
    GUISetState(@SW_SHOW, $hYearCal)
    _setYear()
    GUISetState(@SW_HIDE, $hWndFrom)
    EndFunc

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

    Func _showMonthCal() ; wechselt von Jahreskalender zu Monatskalender
    GUISetState(@SW_SHOW, $hMonthCal)
    If $iCurrYear = @YEAR And $iCurrMonth = @MON Then
    $aCtrlFrame = _FrameAroundCtrl_Create($hMonthCal, $TodayID)
    Else
    _FrameAroundCtrl_Delete()
    EndIf
    GUISetState(@SW_HIDE, $hYearCal)
    EndFunc
    ;======================

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

    ;======= ÜBERSICHT ====
    Func _10YearViewEvent() ; Klick auf Control in 10-Jahres-Übersicht
    GUISetState(@SW_LOCK, $h10YearView)
    Switch @GUI_CtrlId
    Case $btPrev10YearView
    If $iCurrYear -10 < 1900 Then Return
    $iCurrYear = 1900
    GUICtrlSetState($btPrev10YearView, $GUI_HIDE)
    GUICtrlSetState($btNext10YearView, $GUI_SHOW)
    Case $btNext10YearView
    If $iCurrYear +10 > 2099 Then Return
    $iCurrYear = 2099
    GUICtrlSetState($btPrev10YearView, $GUI_SHOW)
    GUICtrlSetState($btNext10YearView, $GUI_HIDE)
    EndSwitch
    _set10YearView()
    GUISetState(@SW_UNLOCK, $h10YearView)
    EndFunc

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

    Func _10YearEvent() ; Klick auf 10-Jahresbereich in 10-Jahres-Übersicht
    _FrameAroundCtrl_Delete()
    Local $i10Year = GUICtrlRead(@GUI_CtrlId)
    If $i10Year = '' Then Return
    If StringRight($i10Year, 1) = 0 Then $i10Year += 9
    $iCurr10YearEnd = $i10Year
    $iCurr10Year = StringLeft($i10Year, 3)
    GUICtrlSetData($lb10Year, $iCurr10Year & '0 - ' & $iCurr10YearEnd)
    _set10Year()
    _show10YearCal($h10YearView)
    EndFunc

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

    Func _set10YearView() ; setze Daten in 10-Jahres-Übersicht
    _FrameAroundCtrl_Delete()
    Local $iSet = 2, $iFrom = 1990, $iTo = 1999, $iLoop = 2
    GUICtrlSetState($btPrev10YearView, $GUI_SHOW)
    GUICtrlSetState($btNext10YearView, $GUI_HIDE)
    If $iCurrYear < 2010 Then
    $iSet = 1
    $iFrom = 1900
    $iTo = 1909
    GUICtrlSetState($btPrev10YearView, $GUI_HIDE)
    GUICtrlSetState($btNext10YearView, $GUI_SHOW)
    EndIf
    If $iSet = 1 Then
    GUICtrlSetData($a10YearsView[0], '')
    GUICtrlSetData($a10YearsView[1], '')
    Else
    $iLoop = 0
    GUICtrlSetData($a10YearsView[22], '')
    GUICtrlSetData($a10YearsView[23], '')
    EndIf
    For $i = $iLoop To $iLoop +21
    If Not Mod($i, 2) Then
    GUICtrlSetData($a10YearsView[$i], $iFrom)
    $iFrom += 10
    Else
    GUICtrlSetData($a10YearsView[$i], $iTo)
    If StringLeft(GUICtrlRead($a10YearsView[$i]),3) = $iShow10Year Then _
    $aCtrlFrame = _FrameAroundCtrl_Create($h10YearView, $a10YearsView[$i])
    $iTo += 10
    EndIf
    Next
    EndFunc
    ;======================

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

    ;======= 10 JAHR ======
    Func _10YearCalEvent() ; Klick auf Control im 10-Jahreskalender
    GUISetState(@SW_LOCK, $h10YearCal)
    Switch @GUI_CtrlId
    Case $btPrev10Year
    If $iCurr10Year -1 < 190 Then Return
    $iCurr10YearEnd -= 10
    $iCurrYear -= 10
    $iCurr10Year -= 1
    _set10Year()
    Case $btNext10Year
    If $iCurr10Year +1 > 209 Then Return
    $iCurr10YearEnd += 10
    $iCurrYear += 10
    $iCurr10Year += 1
    _set10Year()
    Case $lb10Year
    $iShow10Year = $iCurr10Year
    _show10YearView()
    EndSwitch
    GUISetState(@SW_UNLOCK, $h10YearCal)
    EndFunc

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

    Func _YearEvent() ; Klick auf Jahr im 10-Jahreskalender
    $iCurrYear = GUICtrlRead(@GUI_CtrlId)
    $iCurr10Year = StringLeft($iCurrYear, 3)
    GUICtrlSetData($lbYear, $iCurrYear)
    _showYearCal($h10YearCal)
    EndFunc

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

    Func _set10Year()
    GUICtrlSetData($lb10Year, $iCurr10YearEnd -9 & ' - ' & $iCurr10YearEnd)
    Local $iStart = $iCurr10YearEnd -10
    For $i = 0 To 11
    GUICtrlSetData($a10Years[$i], $iStart + $i)
    Next
    If $iCurrYear = $iShowYear Then
    $aCtrlFrame = _FrameAroundCtrl_Create($h10YearCal, $a10Years[StringRight($iShowYear,1)+1])
    Else
    _FrameAroundCtrl_Delete()
    EndIf
    EndFunc
    ;======================

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

    ;======= JAHR =========
    Func _YearCalEvent() ; Klick auf Controls im Jahreskalender
    GUISetState(@SW_LOCK, $hYearCal)
    Switch @GUI_CtrlId
    Case $btPrevYear
    If $iCurrYear -1 < 1900 Then Return
    $iCurrYear -= 1
    _setYear()
    Case $btNextYear
    If $iCurrYear +1 > 2099 Then Return
    $iCurrYear += 1
    _setYear()
    Case $lbYear
    $iCurrYear = GUICtrlRead($lbYear)
    $iShowYear = $iCurrYear
    $iShow10Year = StringLeft($iShowYear, 3)
    GUICtrlSetData($lb10Year, $iCurr10Year & '0 - ' & $iCurr10YearEnd)
    _set10Year()
    _show10YearCal($hYearCal)
    EndSwitch
    GUISetState(@SW_UNLOCK, $hYearCal)
    EndFunc

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

    Func _MonthEvent() ; Klick auf Monat im Jahreskalender
    Local $sMonth = GUICtrlRead(@GUI_CtrlId)
    For $i = 0 To 11
    If $aShortMonth[$i] = $sMonth Then
    $iCurrMonth = $i +1
    ExitLoop
    EndIf
    Next
    $iShowMonth = $iCurrMonth
    $iCurrYear = GUICtrlRead($lbYear)
    $iShowYear = $iCurrYear
    $iCurr10Year = StringLeft($iCurrYear, 3)
    _setMonthView($iCurrYear, $iCurrMonth)
    _showMonthCal()
    EndFunc

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

    Func _setYear()
    $iCurr10Year = StringLeft($iCurrYear, 3)
    $iCurr10YearEnd = $iCurr10Year & 9
    GUICtrlSetData($lbYear, $iCurrYear)
    If $iCurrYear = $iShowYear Then
    $aCtrlFrame = _FrameAroundCtrl_Create($hYearCal, $aMonth[$iShowMonth-1])
    Else
    _FrameAroundCtrl_Delete()
    EndIf
    EndFunc
    ;======================

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

    ;======= MONAT ========
    Func _MonthCalEvent() ; Klick auf Controls im Monatskalender
    GUISetState(@SW_LOCK, $hMonthCal)
    Switch @GUI_CtrlId
    Case $btPrevMonth
    $iCurrMonth -= 1
    _setMonthView($iCurrYear, $iCurrMonth)
    Case $btNextMonth
    $iCurrMonth += 1
    _setMonthView($iCurrYear, $iCurrMonth)
    Case $lbMonth
    $iShowMonth = $iCurrMonth
    _showYearCal($hMonthCal)
    EndSwitch
    GUISetState(@SW_UNLOCK, $hMonthCal)
    EndFunc

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

    Func _DayEvent() ; Klick auf Tag im Monatskalender
    $iSetCol = $iChooseCol
    For $i = 0 To 41
    $IndexCat = $i
    If $aDays[$i] = @GUI_CtrlId Then ExitLoop
    Next
    Local $sFullDate = $iCurrYear & '/' & StringRight( '0' & $iCurrMonth, 2) & '/' & GUICtrlRead($aDays[$i])
    $sDateCat = $sFullDate
    If $oMarkedDays.Exists($sFullDate) Then
    $oMarkedDays.Remove($sFullDate)
    GUICtrlSetBkColor($aDays[$i], $DefCol)
    Else
    If $iChooseCol = -1 Then
    GUISetState(@SW_SHOW, $hCategory)
    Else
    $oMarkedDays.Add($sFullDate, $iSetCol)
    GUICtrlSetBkColor($aDays[$i],$iSetCol)
    EndIf
    EndIf
    EndFunc

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

    Func _setMonthView($iYear=-1, $iMonth=-1) ; setzt Monatskalender für aktuellen Monat/Jahr
    Local $aLongMonth[13] = ['','Januar ','Februar ','März ','April ','Mai ','Juni ','Juli ','August ','September ','Oktober ','November ','Dezember ']
    If $iYear = -1 Or IsKeyword($iYear) Then $iYear = @YEAR
    If $iMonth = -1 Or IsKeyword($iMonth) Then $iMonth = @MON
    If $iMonth = 0 Then
    If $iCurrYear -1 < 1900 Then Return
    $iCurrYear -= 1
    $iCurrMonth = 12
    ElseIf $iMonth = 13 Then
    If $iCurrYear +1 > 2099 Then Return
    $iCurrMonth = 1
    $iCurrYear += 1
    Else
    $iCurrMonth = $iMonth
    $iCurrYear = $iYear
    EndIf
    $iCurr10Year = StringLeft($iCurrYear, 3)
    $iCurr10YearEnd = $iCurr10Year & 9
    GUICtrlSetData($lbMonth, $aLongMonth[$iCurrMonth] & $iCurrYear)
    _CalcDayArray()
    If $iCurrYear = @YEAR And $iCurrMonth = @MON Then ; Datum HEUTE mit Rahmen
    $aCtrlFrame = _FrameAroundCtrl_Create($hMonthCal, $TodayID)
    Else
    _FrameAroundCtrl_Delete()
    EndIf

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

    EndFunc

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

    Func _CalcDayArray() ; im Monatskalender Tageswerte (+ Farben, falls gesetzt) eintragen
    Local $iMonthDays = _DateDaysInMonth($iCurrYear, $iCurrMonth)
    Local $1stWeekDay = (_DateToDayOfWeekISO($iCurrYear, $iCurrMonth, 1) -1) *(-1)
    Local $s1stFullDate = $iCurrYear & '/' & $iCurrMonth & '/01'
    Local $1stWeekNum = _WeekNumberISO($iCurrYear, $iCurrMonth, '01'), $refDate, $n = 0
    For $i = 0 To 5
    GUICtrlSetTip($aToolTip[$i], $1stWeekNum +$i, 'Kalenderwoche', 1, 1)
    Next
    If $1stWeekDay <> 0 Then
    For $i = $1stWeekDay To 0
    If $i = 0 Then ExitLoop
    $refDate = _DateAdd('D', $i, $s1stFullDate)
    If $oMarkedDays.Exists($refDate) Then
    GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
    Else
    GUICtrlSetBkColor($aDays[$n], $DefCol)
    EndIf
    GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
    GUICtrlSetState($aDays[$n], $GUI_DISABLE)
    $n += 1
    Next
    EndIf
    For $i = 0 To $iMonthDays -1
    $refDate = _DateAdd('D', $i, $s1stFullDate)
    If $oMarkedDays.Exists($refDate) Then
    GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
    Else
    GUICtrlSetBkColor($aDays[$n], $DefCol)
    EndIf
    GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
    GUICtrlSetState($aDays[$n], $GUI_ENABLE)
    If StringRight($refDate, 2) = @MDAY Then $TodayID = $aDays[$n]
    $n += 1
    Next
    $i = $iMonthDays
    While $n <= 41
    $refDate = _DateAdd('D', $i, $s1stFullDate)
    If $oMarkedDays.Exists($refDate) Then
    GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
    Else
    GUICtrlSetBkColor($aDays[$n], $DefCol)
    EndIf
    GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
    GUICtrlSetState($aDays[$n], $GUI_DISABLE)
    $i += 1
    $n += 1
    WEnd
    EndFunc
    ;======================

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

    ;======= KATEGORIE ====
    Func _setCatCtrlState()
    If $aCat[0][0] = 0 Then
    GUICtrlSetState($btCat_Del, $GUI_DISABLE)
    GUICtrlSetState($btCat_Sel, $GUI_DISABLE)
    Else
    GUICtrlSetState($btCat_Del, $GUI_ENABLE)
    GUICtrlSetState($btCat_Sel, $GUI_ENABLE)
    EndIf
    EndFunc

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

    Func _CatNew()
    Local $sName = InputBox('Neue Kategorie', 'Bitte Namen der Kategorie eingeben')
    If $sName = '' Then Return
    If $aCat[0][0] > 0 Then
    For $i = 1 To $aCat[0][0]
    If GUICtrlRead($aCat[$i][0]) = $sName Then Return MsgBox(0, 'Achtung!', 'Eine Kategorie mit diesem Namen' & @CRLF & 'existiert bereits!')
    Next
    EndIf
    Local $iBkCol = _ChooseColor(2)
    If $iBkCol = -1 Then Return
    _CatCtrlCreate($sName, $iBkCol)
    EndFunc

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

    Func _CatCtrlCreate($sName, $iBkCol)
    Local $y = $yCat
    If $aCat[0][0] > 0 Then $y = $yCat + ($aCat[0][0] * 27)
    ReDim $aCat[UBound($aCat) +1][2]
    $aCat[0][0] += 1
    Local $winPos = WinGetPos($hCategory)
    WinMove($hCategory, '', $winPos[0], $winPos[1] -13, $winPos[2], $winPos[3] +27)
    $aCat[UBound($aCat) -1][0] = GUICtrlCreateRadio($sName, 5, $y, 190, 22, BitOR($BS_CENTER, $BS_VCENTER))
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetBkColor($aCat[UBound($aCat) -1][0], $iBkCol)
    $aCat[UBound($aCat) -1][1] = $iBkCol
    _setCatCtrlState()
    EndFunc

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

    Func _CatDel()
    Local $Index = 0
    For $i = 1 To $aCat[0][0]
    If BitAND(GUICtrlRead($aCat[$i][0]), $GUI_CHECKED) Then
    $Index = $i
    ExitLoop
    EndIf
    Next
    If $Index = 0 Then Return
    Local $CtrlPos
    GUICtrlDelete($aCat[$Index][0])
    Local $winPos = WinGetPos($hCategory)
    For $i = $Index To $aCat[0][0] -1
    $CtrlPos = ControlGetPos($hCategory, '', $aCat[$i+1][0])
    $aCat[$i][0] = GUICtrlCreateRadio(ControlGetText($hCategory, '', $aCat[$i+1][0]), 5, $CtrlPos[1] -27, 190, 22, BitOR($BS_CENTER, $BS_VCENTER))
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetBkColor(-1, $aCat[$i+1][1])
    $aCat[$i][1] = $aCat[$i+1][1]
    GUICtrlDelete($aCat[$i+1][0])
    Next
    WinMove($hCategory, '', $winPos[0], $winPos[1] +13, $winPos[2], $winPos[3] -27)
    $aCat[0][0] -= 1
    ReDim $aCat[UBound($aCat)-1][2]
    _setCatCtrlState()
    EndFunc

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

    Func _CatSel()
    $iSetCol = -1
    Local $Index = 0
    For $i = 1 To $aCat[0][0]
    If BitAND(GUICtrlRead($aCat[$i][0]), $GUI_CHECKED) Then
    $Index = $i
    ExitLoop
    EndIf
    Next
    If $Index = 0 Then Return
    $iSetCol = $aCat[$Index][1]
    _CloseCategory()
    EndFunc

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

    Func _CloseCategory()
    GUISetState(@SW_HIDE, $hCategory)
    If $iSetCol <> -1 Then
    $oMarkedDays.Add($sDateCat, $iSetCol)
    GUICtrlSetBkColor($aDays[$IndexCat],$iSetCol)
    $iSetCol = -1
    EndIf
    GUISetState(@SW_SHOW, $hMonthCal) ; wirkt machmal nicht
    WinWaitActive($hMonthCal, '', 1)
    If WinGetHandle('[ACTIVE]') <> $hMonthCal Then WinActivate($hMonthCal)
    EndFunc
    ;======================

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

    ;======= KOMMENTAR ====
    Func _RClickMonth()
    Local $IDover = _GetCtrlUnderMouse()
    If $IDover = 0 Or BitAND(GUICtrlGetState($IDover), $GUI_DISABLE) Then Return
    $sDateComment = $iCurrYear & '/' & $iCurrMonth & '/' & GUICtrlRead($IDover)
    If Not _GetMarkedDays($oMarkedDays, $sDateComment, 1) Then Return
    WinSetTitle($hComment, '', 'Kommentar ' & StringRegExpReplace($sDateComment, '(\d{4})/(\d{2})/(\d{2})', '$3.$2.$1'))
    If $oComment.Exists($sDateComment) Then GUICtrlSetData($hEdit, StringRegExpReplace($oComment.Item($sDateComment), '¤', @CRLF))
    GUISetState(@SW_SHOW, $hComment)
    EndFunc

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

    Func _GetCtrlUnderMouse()
    Local $oldOpt = Opt('MouseCoordMode', 2)
    Local $Mouse = MouseGetPos(), $Ctrl, $retID = 0
    For $i = 0 To 41
    $Ctrl = ControlGetPos($hMonthCal, '', $aDays[$i])
    If @error Then ContinueLoop
    If ($Mouse[0] >= $Ctrl[0] And $Mouse[0] <= $Ctrl[0] + $Ctrl[2]) And _
    ($Mouse[1] >= $Ctrl[1] And $Mouse[1] <= $Ctrl[1] + $Ctrl[3]) Then
    $retID = $aDays[$i]
    ExitLoop
    EndIf
    Next
    Opt('MouseCoordMode', $oldOpt)
    Return $retID
    EndFunc
    ;======================

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

    ;======= RAHMEN =======
    Func _FrameAroundCtrl_Create($hWnd, $ID) ; roten Rahmen um Control zeichnen
    _FrameAroundCtrl_Delete()
    Local $aSize[4]
    If $hWnd = $h10YearView Then ; VonJahr-BisJahr als ein Ctrl berechnen
    Local $ID_start, $ID_end
    If StringRight(GUICtrlRead($ID), 1) = 0 Then
    $ID_start = $ID
    ElseIf StringRight(GUICtrlRead($ID), 1) = 9 Then
    $ID_start = $ID -1
    EndIf
    Local $aPos = ControlGetPos($hWnd, '', $ID_start)
    $aSize[0] = $aPos[0]
    $aSize[1] = $aPos[1]
    $aSize[2] = $aPos[2]
    $aSize[3] = 2 *$aPos[3]
    Else
    $aSize = ControlGetPos($hWnd, '', $ID)
    EndIf
    Local $aFrame[4] = [ _
    GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1] -1, $aSize[2] +2, 1), _ ; top
    GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1] +$aSize[3], $aSize[2] +2, 1), _ ; bottom
    GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1], 1, $aSize[3]), _ ; left
    GUICtrlCreateLabel('', $aSize[0] +$aSize[2], $aSize[1], 1, $aSize[3])] ; right
    For $i = 0 To 3
    GUICtrlSetBkColor($aFrame[$i], 0xFF0000)
    Next
    Return $aFrame
    EndFunc

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

    Func _FrameAroundCtrl_Delete() ; Rahmen löschen
    If Not IsArray($aCtrlFrame) Then Return
    GUISetState(@SW_LOCK, WinGetHandle('[ACTIVE]'))
    For $i = 0 To 3
    GUICtrlDelete($aCtrlFrame[$i])
    Next
    GUISetState(@SW_UNLOCK, WinGetHandle('[ACTIVE]'))
    $aCtrlFrame = 0
    EndFunc
    ;======================

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

    Func _WM_MOVE($hWnd)
    Local $pos = WinGetPos($hWnd)
    Switch $hWnd
    Case $h10YearView
    WinMove($h10YearCal, '', $pos[0], $pos[1])
    WinMove($hYearCal, '', $pos[0], $pos[1])
    WinMove($hMonthCal, '', $pos[0], $pos[1])
    Case $h10YearCal
    WinMove($h10YearView, '', $pos[0], $pos[1])
    WinMove($hYearCal, '', $pos[0], $pos[1])
    WinMove($hMonthCal, '', $pos[0], $pos[1])
    Case $hYearCal
    WinMove($h10YearView, '', $pos[0], $pos[1])
    WinMove($h10YearCal, '', $pos[0], $pos[1])
    WinMove($hMonthCal, '', $pos[0], $pos[1])
    Case $hMonthCal
    WinMove($h10YearView, '', $pos[0], $pos[1])
    WinMove($h10YearCal, '', $pos[0], $pos[1])
    WinMove($hYearCal, '', $pos[0], $pos[1])
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]


    So sieht es jetzt aus:
    [Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_Mon.png][Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_Year.png][Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_10Year.png][Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_10YearView.png][Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_Category.png]

    DL v1.0, v1.1: 37