Jump to content

Recommended Posts

Posted

Even if I know about the existence of the _GUICtrlMonthCal* functions, here is a simple home made "Visual date chooser" function. It is in a raw draft format and can likely be emprooved, but I think that, all in all, this "skeleton" is not so bad. Maybe it can be of use...

; Calendar mini
#include <date.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <WinAPI.au3>
#include <StaticConstants.au3>

Local $aResult = _Peek_A_Date()
MsgBox(0, 'Result', (@error) ? 'No date selected' : _DateTimeFormat($aResult[0] & "/" & $aResult[1] & "/" & $aResult[2], 1), 3)

; ----------------------------------------------------------------------------------
; a simple 'visual' date peeker function
; parameters are optional
; YYYY and MM for initial desired calendar
; last parameter: if true (default) first weekday is moonday
;                 if false first weekday is sunday
; returns: on success a 3 elements array as [0]Year yyyy; [1]Monthh mm; [2]Day dd
;          on error set @error and returns 0
; -----------------------------------------------------------------------------------
Func _Peek_A_Date($iYear = @YEAR, $iMonth = @MON, $bISO = True)
    Local $hCalendar = GUICreate('', 210, 160, -1, -1, $WS_POPUPWINDOW, $WS_EX_TOOLWINDOW), $iDay = @MDAY
    Local $IdDate = GUICtrlCreateLabel('', 25, 4, 160, 20, $SS_CENTER, $GUI_WS_EX_PARENTDRAG), $idWeekDays = GUICtrlCreateLabel('', 2, 28, 206, 20)
    Local $idDays = GUICtrlCreateEdit('', 2, 50, 206, 108, BitOR($ES_READONLY, $ES_MULTILINE), 0), $hDays = GUICtrlGetHandle(-1)
    Local $iColor = 0x00ffd700, $Dummy = GUICtrlSetBkColor(-1, $iColor) + GUICtrlSetCursor(-1, 0)
    Local $Dummy = GUICtrlSetFont($idWeekDays, 12, -1, -1, 'courier new') + GUICtrlSetFont($idDays, 12, -1, -1, 'courier new') + GUICtrlSetFont($IdDate, 10, 700) ; 'courier new')
    Local $idPrevMonth = GUICtrlCreateButton('<', 2, 2, 18, 18), $idNextMonth = GUICtrlCreateButton('>', 190, 2, 18, 18)
    Local $sDaysOfWeek = '', $aDate[3] = [$iYear, $iMonth, $iDay], $aBounds, $aCharPos, $sLine, $s
    $iYear = 0
    For $i = 1 To 7
        $sDaysOfWeek &= StringLeft(_DateDayOfWeek($i, $DMW_LOCALE_SHORTNAME), 2) & " "
    Next
    $sDaysOfWeek = ($bISO) ? StringMid($sDaysOfWeek, 4) & StringLeft($sDaysOfWeek, 2) : StringLeft($sDaysOfWeek, 20)
    GUICtrlSetData($idWeekDays, $sDaysOfWeek)
    Local $sDays = ' 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31'
    GUISetBkColor($iColor)
    GUISetState(@SW_SHOW)
    Local $aBounds[2] = [($bISO) ?(_DateToDayOfWeekISO($aDate[0], $aDate[1], 1)) :(_DateToDayOfWeek($aDate[0], $aDate[1], 1)), _DateDaysInMonth($aDate[0], $aDate[1])]
    While WinActive($hCalendar)
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $GUI_EVENT_PRIMARYDOWN
                $aDate[2] = $s
                If _DateIsValid($aDate[0] & "/" & $aDate[1] & '/' & $aDate[2]) Then
                    ToolTip('')
                    GUIDelete($hCalendar)
                    Return SetError(0, 0, $aDate)
                EndIf
            Case $GUI_EVENT_MOUSEMOVE
                ; https://www.autoitscript.com/forum/topic/157899-get-text-word-under-the-mouse-pointer/?do=findComment&comment=1145318
                ; (portions of code by Malkey)
                $aCharPos = _GUICtrlEdit_CharFromPos($hDays, _WinAPI_GetMousePosX(True, $hDays), _WinAPI_GetMousePosY(True, $hDays))
                $sLine = _GUICtrlEdit_GetLine($hDays, $aCharPos[1])
                $aCharPos[0] -= _GUICtrlEdit_LineIndex($hDays, $aCharPos[1])
                $s = (StringMid($sLine, $aCharPos[0] + 1, 1) == " ") ? "" : StringRegExpReplace($sLine, "(?s)^.{0," & $aCharPos[0] & "}(?: |^)([^ ]*).*$", "\1")
                ToolTip(($s = "") ? "" : _DateTimeFormat($aDate[0] & "/" & $aDate[1] & "/" & $s, 2))
            Case $idPrevMonth
                $aDate = StringSplit(_DateAdd('M', -1, $aDate[0] & "/" & $aDate[1] & '/1'), '/', 2)
            Case $idNextMonth
                $aDate = StringSplit(_DateAdd('M', +1, $aDate[0] & "/" & $aDate[1] & '/1'), '/', 2)
        EndSwitch
        If $iYear <> $aDate[0] Or $iMonth <> $aDate[1] Then
            $iYear = $aDate[0]
            $iMonth = $aDate[1]
            $aBounds[0] = ($bISO) ?(_DateToDayOfWeekISO($aDate[0], $aDate[1], 1)) :(_DateToDayOfWeek($aDate[0], $aDate[1], 1))
            $aBounds[1] = _DateDaysInMonth($aDate[0], $aDate[1])
            GUICtrlSetData($idDays, StringLeft(StringLeft(StringFormat('%' & 18 & 's', ""), 3 * ($aBounds[0] - 1)) & _
                    StringTrimRight($sDays, (31 - $aBounds[1]) * 3) & StringFormat('%' & 40 & 's', ""), 126))
            GUICtrlSetData($IdDate, _DateToMonth($aDate[1], $DMW_LOCALE_LONGNAME) & " " & $aDate[0])
        EndIf ;
    WEnd
    GUIDelete($hCalendar)
    Return SetError(1, 0, 0)
EndFunc   ;==>_Peek_A_Date

 

 

image.jpeg.9f1a974c98e9f77d824b358729b089b0.jpeg Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...