Что нового

Как в календаре выделить определенную дату

Вовчик55

Новичок
Сообщения
57
Репутация
0
Здравствуйте. Подскажите как выделить в календаре (GUICtrlCreateMonthCal) определённую дату (даты), чтобы допустим они были обведены, или затемнены каким-либо цветом? Чтобы было что-то наподобе органайзера.
Допустим повешу на определённые числа года какие-либо действия, а чтобы не забыть про них, сделаю отображение этого календарика в окошке, и чтобы помимо сегодняшней даты была обведена дата на которую назначено это событие (или события, если их несколько будет в разные дни)
 
Автор
Вовчик55

Вовчик55

Новичок
Сообщения
57
Репутация
0
Увы это всё не то, по первой ссылке тот же самый стандартный календарик, только с зачем-то изменённым интерфейсом. По второй ссылке это уже совершенно переработанное что-то, где от стандартного календарика остался лишь скелет (который я не смог найти кстати, чтобы допустим изменить названия дней недели и месяцев - на русские)
Значит как я понимаю в стандартном календаре не предусмотрено ставить какие-либо переменные на определенные дни? (и затем подсвечивать дни, которые были ранее выбраны)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вовчик55 [?]
не смог найти кстати, чтобы допустим изменить названия дней недели и месяцев - на русские
Нужно копаться в недрах библиотек AutoIt'а, это функция _DateDayOfWeek, там жёстко указаны названия дней.
В принципе эту функцию можно было бы доработать, чтобы она получала названия из локали системы.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR [?]
Нужно копаться в недрах библиотек AutoIt'а, это функция _DateDayOfWeek, там жёстко указаны названия дней.
В принципе эту функцию можно было бы доработать, чтобы она получала названия из локали системы.
Не надо ее дорабатывать. :smile:
Код:
#include <APIConstants.au3>
#include <WinAPIEx.au3>
; можно поменять $LOCALE_USER_DEFAULT на $LOCALE_SYSTEM_DEFAULT
For $i = 1 To 7
	ConsoleWrite('Day ' & $i & ' => ' & _WinAPI_GetLocaleInfo($LOCALE_USER_DEFAULT, Execute('$LOCALE_SDAYNAME' & $i)) & @LF)
Next
For $i = 1 To 7
	ConsoleWrite('Day ' & $i & ' => ' & _WinAPI_GetLocaleInfo($LOCALE_USER_DEFAULT, Execute('$LOCALE_SABBREVDAYNAME' & $i)) & @LF)
Next
For $i = 1 To 12
	ConsoleWrite('Month ' & $i & ' => ' & _WinAPI_GetLocaleInfo($LOCALE_USER_DEFAULT, Execute('$LOCALE_SMONTHNAME' & $i)) & @LF)
Next
For $i = 1 To 12
	ConsoleWrite('Month ' & $i & ' => ' & _WinAPI_GetLocaleInfo($LOCALE_USER_DEFAULT, Execute('$LOCALE_SABBREVMONTHNAME' & $i)) & @LF)
Next
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
madmasles
Не лучше ли написать маленькую "русскоязычную" функцию, чем использовать WinAPIEx.au3 + APIConstants.au3, это ж 2 мегабайта почти...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
WSWR [?]
Не лучше ли написать маленькую "русскоязычную" функцию, чем использовать WinAPIEx.au3 + APIConstants.au3, это ж 2 мегабайта почти...
Примерно такую?
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aDays, $sDays

$aDays = _WinAPI_GetLocal_DayOfWeek()
_ArrayDisplay($aDays)

$aDays = _WinAPI_GetLocal_DayOfWeek(Default, False, True)
_ArrayDisplay($aDays)

For $i = 1 To 7
	ConsoleWrite(_WinAPI_GetLocal_DayOfWeek($i) & @LF)
Next

ConsoleWrite('---' & @LF)

For $i = 1 To 7
	ConsoleWrite(_WinAPI_GetLocal_DayOfWeek($i, False, True) & @LF)
Next

ConsoleWrite('---' & @LF)

$sDays = _WinAPI_GetLocal_DayOfWeek(-1, False, False, ';')
ConsoleWrite($sDays & @LF)

ConsoleWrite('---' & @LF)

$sDays = _WinAPI_GetLocal_DayOfWeek(Default, False, True, ',')
ConsoleWrite($sDays & @LF)


Func _WinAPI_GetLocal_DayOfWeek($i_NumDay = Default, $f_System = False, $f_Abbr = False, $s_Sep = '')
	#cs
		Local Const $_LOCALE_SDAYNAME1 = 0x002A
		Local Const $_LOCALE_SDAYNAME2 = 0x002B
		Local Const $_LOCALE_SDAYNAME3 = 0x002C
		Local Const $_LOCALE_SDAYNAME4 = 0x002D
		Local Const $_LOCALE_SDAYNAME5 = 0x002E
		Local Const $_LOCALE_SDAYNAME6 = 0x002F
		Local Const $_LOCALE_SDAYNAME7 = 0x0030
		Local Const $_LOCALE_SABBREVDAYNAME1 = 0x0031
		Local Const $_LOCALE_SABBREVDAYNAME2 = 0x0032
		Local Const $_LOCALE_SABBREVDAYNAME3 = 0x0033
		Local Const $_LOCALE_SABBREVDAYNAME4 = 0x0034
		Local Const $_LOCALE_SABBREVDAYNAME5 = 0x0035
		Local Const $_LOCALE_SABBREVDAYNAME6 = 0x0036
		Local Const $_LOCALE_SABBREVDAYNAME7 = 0x0037
		Local Const $_LOCALE_USER_DEFAULT = 0x0400
		Local Const $_LOCALE_SYSTEM_DEFAULT = 0x0800
		Local $a_DaysOfWeek[8][2] = [[7],[$_LOCALE_SDAYNAME1, $_LOCALE_SABBREVDAYNAME1],[$_LOCALE_SDAYNAME2, $_LOCALE_SABBREVDAYNAME2], _
		[$_LOCALE_SDAYNAME3, $_LOCALE_SABBREVDAYNAME3],[$_LOCALE_SDAYNAME4, $_LOCALE_SABBREVDAYNAME4],[$_LOCALE_SDAYNAME5, $_LOCALE_SABBREVDAYNAME5], _
		[$_LOCALE_SDAYNAME6, $_LOCALE_SABBREVDAYNAME6],[$_LOCALE_SDAYNAME7, $_LOCALE_SABBREVDAYNAME7]], _
		$a_Res, $a_Ret[7], $i_Abbr = 0, $a_Locale[2] = [$_LOCALE_USER_DEFAULT, $_LOCALE_SYSTEM_DEFAULT], $i_Local = 0
	#ce

	Local Const $a_DaysOfWeek[8][2] = [[7],[0x002A, 0x0031],[0x002B, 0x0032],[0x002C, 0x0033],[0x002D, 0x0034],[0x002E, 0x0035], _
			[0x002F, 0x0036],[0x0030, 0x0037]], $a_Locale[2] = [0x0400, 0x0800]
	Local $a_Res, $a_Ret[7], $i_Abbr = 0, $i_Local = 0

	If $f_Abbr Then $i_Abbr = 1
	If $f_System Then $i_Local = 1
	$i_NumDay = Number($i_NumDay)
	Switch $i_NumDay
		Case 1 To 7
			$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', $a_Locale[$i_Local], 'dword', $a_DaysOfWeek[$i_NumDay][$i_Abbr], 'wstr', '', 'int', 80)
			If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
			Return $a_Res[3]
		Case Else
			For $i = 1 To $a_DaysOfWeek[0][0]
				$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', $a_Locale[$i_Local], 'dword', $a_DaysOfWeek[$i][$i_Abbr], 'wstr', '', 'int', 80)
				If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
				$a_Ret[$i - 1] = $a_Res[3]
			Next
			If $s_Sep Then
				For $i = 1 To 6
					$a_Ret[0] &= $s_Sep & $a_Ret[$i]
				Next
				Return $a_Ret[0]
			EndIf
			Return $a_Ret
	EndSwitch
EndFunc   ;==>_WinAPI_GetLocal_DayOfWeek
Просьба к имеющим не русскую версию windows проверить функцию.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Не надо ее дорабатывать
Как не надо, если есть возможность сделать функцию универсальной, почему нет?

[?]
Примерно такую?
Я бы переделал существующую:
Код:
For $i = 1 To 7
    ConsoleWrite(__DateDayOfWeek($i, 0) & @LF)
Next

Func __DateDayOfWeek($iDayNum, $iShort = 0)
	Select
		Case Not StringIsInt($iDayNum) Or Not StringIsInt($iShort)
			Return SetError(1, 0, '')
		Case $iDayNum < 1 Or $iDayNum > 7
			Return SetError(1, 0, '')
		Case $iShort > 1 Or $iShort < 0
			Return SetError(1, 0, '')
	EndSelect
	
	Local Const $a_DayOfWeek[8][2] = [[7], [0x0030, 0x0037], [0x002A, 0x0031], [0x002B, 0x0032], [0x002C, 0x0033], [0x002D, 0x0034], [0x002E, 0x0035], [0x002F, 0x0036]]
	Local $a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'dword', 0x0800, 'dword', $a_DayOfWeek[$iDayNum][$iShort], 'wstr', '', 'int', 80)
	If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
	
	Return $a_Res[3]
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
И еще месяцы.
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aMonths, $sMonth

$aMonths = _WinAPI_GetLocal_DayOfMonth()
_ArrayDisplay($aMonths)

$aMonths = _WinAPI_GetLocal_DayOfMonth(Default, False, True)
_ArrayDisplay($aMonths)

For $i = 1 To 12
	ConsoleWrite(_WinAPI_GetLocal_DayOfMonth($i) & @LF)
Next

ConsoleWrite('---' & @LF)

For $i = 1 To 12
	ConsoleWrite(_WinAPI_GetLocal_DayOfMonth($i, False, True) & @LF)
Next

ConsoleWrite('---' & @LF)

$sMonth = _WinAPI_GetLocal_DayOfMonth(-1, False, False, ';')
ConsoleWrite($sMonth & @LF)

ConsoleWrite('---' & @LF)

$sMonth = _WinAPI_GetLocal_DayOfMonth(Default, False, True, ',')
ConsoleWrite($sMonth & @LF)


Func _WinAPI_GetLocal_DayOfMonth($i_NumMonth = Default, $f_System = False, $f_Abbr = False, $s_Sep = '')
	#cs
		Local Const $_LOCALE_SMONTHNAME1 = 0x0038
		Local Const $_LOCALE_SMONTHNAME2 = 0x0039
		Local Const $_LOCALE_SMONTHNAME3 = 0x003A
		Local Const $_LOCALE_SMONTHNAME4 = 0x003B
		Local Const $_LOCALE_SMONTHNAME5 = 0x003C
		Local Const $_LOCALE_SMONTHNAME6 = 0x003D
		Local Const $_LOCALE_SMONTHNAME7 = 0x003E
		Local Const $_LOCALE_SMONTHNAME8 = 0x003F
		Local Const $_LOCALE_SMONTHNAME9 = 0x0040
		Local Const $_LOCALE_SMONTHNAME10 = 0x0041
		Local Const $_LOCALE_SMONTHNAME11 = 0x0042
		Local Const $_LOCALE_SMONTHNAME12 = 0x0043
		Local Const $_LOCALE_SABBREVMONTHNAME1 = 0x0044
		Local Const $_LOCALE_SABBREVMONTHNAME2 = 0x0045
		Local Const $_LOCALE_SABBREVMONTHNAME3 = 0x0046
		Local Const $_LOCALE_SABBREVMONTHNAME4 = 0x0047
		Local Const $_LOCALE_SABBREVMONTHNAME5 = 0x0048
		Local Const $_LOCALE_SABBREVMONTHNAME6 = 0x0049
		Local Const $_LOCALE_SABBREVMONTHNAME7 = 0x004A
		Local Const $_LOCALE_SABBREVMONTHNAME8 = 0x004B
		Local Const $_LOCALE_SABBREVMONTHNAME9 = 0x004C
		Local Const $_LOCALE_SABBREVMONTHNAME10 = 0x004D
		Local Const $_LOCALE_SABBREVMONTHNAME11 = 0x004E
		Local Const $_LOCALE_SABBREVMONTHNAME12 = 0x004F
		Local Const $_LOCALE_USER_DEFAULT = 0x0400
		Local Const $_LOCALE_SYSTEM_DEFAULT = 0x0800
		Local $a_Months[13][2] = [[12],[$_LOCALE_SMONTHNAME1, $_LOCALE_SABBREVMONTHNAME1],[$_LOCALE_SMONTHNAME2, $_LOCALE_SABBREVMONTHNAME2], _
		[$_LOCALE_SMONTHNAME3, $_LOCALE_SABBREVMONTHNAME3],[$_LOCALE_SMONTHNAME4, $_LOCALE_SABBREVMONTHNAME4], _
		[$_LOCALE_SMONTHNAME5, $_LOCALE_SABBREVMONTHNAME5],[$_LOCALE_SMONTHNAME6, $_LOCALE_SABBREVMONTHNAME6], _
		[$_LOCALE_SMONTHNAME7, $_LOCALE_SABBREVMONTHNAME7],[$_LOCALE_SMONTHNAME8, $_LOCALE_SABBREVMONTHNAME8], _
		[$_LOCALE_SMONTHNAME9, $_LOCALE_SABBREVMONTHNAME9],[$_LOCALE_SMONTHNAME10, $_LOCALE_SABBREVMONTHNAME10], _
		[$_LOCALE_SMONTHNAME11, $_LOCALE_SABBREVMONTHNAME11],[$_LOCALE_SMONTHNAME12, $_LOCALE_SABBREVMONTHNAME12]], _
		$a_Res, $a_Ret[12], $i_Column = 0, $a_Locale[2] = [$_LOCALE_USER_DEFAULT, $_LOCALE_SYSTEM_DEFAULT], $i_Local = 0
	#ce
	Local Const $a_Months[13][2] = [[12],[0x0038, 0x0044],[0x0039, 0x0045],[0x003A, 0x0046],[0x003B, 0x0047], _
			[0x003C, 0x0048],[0x003D, 0x0049],[0x003E, 0x004A],[0x003F, 0x004B], _
			[0x0040, 0x004C],[0x0041, 0x004D],[0x0042, 0x004E],[0x0043, 0x004F]], $a_Locale[2] = [0x0400, 0x0800]
	Local $a_Res, $a_Ret[12], $i_Column = 0, $i_Local = 0

	If $f_Abbr Then $i_Column = 1
	If $f_System Then $i_Local = 1
	$i_NumMonth = Number($i_NumMonth)
	Switch $i_NumMonth
		Case 1 To 12
			$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', $a_Locale[$i_Local], 'dword', $a_Months[$i_NumMonth][$i_Column], 'wstr', '', 'int', 80)
			If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
			Return $a_Res[3]
		Case Else
			For $i = 1 To $a_Months[0][0]
				$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', $a_Locale[$i_Local], 'dword', $a_Months[$i][$i_Column], 'wstr', '', 'int', 80)
				If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
				$a_Ret[$i - 1] = $a_Res[3]
			Next
			If $s_Sep Then
				For $i = 1 To 11
					$a_Ret[0] &= $s_Sep & $a_Ret[$i]
				Next
				Return $a_Ret[0]
			EndIf
			Return $a_Ret
	EndSwitch
EndFunc   ;==>_WinAPI_GetLocal_DayOfMonth
 
Верх