Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

7.3.2 Получение даты и времени

В своей функции WndPaint программа DIGCLOCK использует функции языка С time и locatetime для определения текущих даты и времени. Функция locatetime помещает всю необходимую вам информацию в структуру; несколько макроопределений в начале программы помогают сделать вызовы wsprintf более читаемыми. (Вы должны избегать выполнения функций MS-DOS и ROM BIOS в вашей программе для Windows; вместо этого пользуйтесь функциями Windows или библиотекой языка С периода выполнения.)

7.3.3 Обеспечение международной поддержки

Windows обеспечивает международную поддержку. Реестр Windows содержит информацию, относящуюся к формату даты, времени, валюты и чисел. Вы можете выводить на экран даты в одном из трех разных форматов: месяц-день-год, год-месяц-день или день-месяц-год. Разделителем между этими тремя числами может быть наклонная черта, тире, точка или, фактически, любой понравившийся вам символ. Вы можете выводить время либо в 12-ти, либо в 24-часовом формате; для разделения часов, минут и секунд обычно используется точка или двоеточие.

Функция SetInternational в DIGCLOCK извлекает эту информацию для форматирования из реестра с помощью устаревших, но, тем не менее, работающих функций GetProfileInt (для целых) и GetProfileString (для строк), которые использовались еще до появления реестра и извлекали информацию из файла WIN.INI. Эти вызовы должны содержать значения по умолчанию, если Windows не сможет найти требуемые значения в реестре. Функция SetInternational сохраняет эти значения в глобальных переменных, имеющих такие же имена, что и текстовые строки, которые идентифицировали их в WIN.INI. Функция WndPaint использует эти значения, полученные из реестра, для форматирования выводимых на экран даты и времени, а затем вызывает функцию DrawText для выравнивания двух строк текста в окне.

Независимо от времени получения сообщения WM_TIMER, оконная процедура программы DIGCLOCK, для выработки сообщения WM_PAINT, делает окно недействительным. Но WndProc также делает окно недействительным при получении сообщения WM_WININICHANGE. Любое приложение, которое изменяет настройки форматирования в реестре, посылает сообщение WM_WININICHANGE всем активным приложениям Windows. Программа DIGCLOCK узнает об этом и получит новую международную информацию. Чтобы увидеть, как это работает, загрузите DIGCLOCK, зайдите в Control Panel и измените либо формат даты, либо разделитель даты, либо формат времени, либо разделитель времени. Теперь нажмите <Enter>. Реестр обновляется, выводимая программой DIGCLOCK на экран информация отражает это изменение — так в Windows работает магия сообщений.

Когда оконная процедура получает сообщение WM_WININICHANGE, она делает окно недействительным, используя функцию:

InvalidateRect(hwnd, NULL, TRUE);

Когда программа DIGCLOCK получает сообщение WM_TIMER, она делает окно недействительным, используя функцию:

InvalidateRect(hwnd, NULL, FALSE);

Значение TRUE в последнем параметре сообщает Windows о необходимости обновить фон окна перед рисованием. Значение FALSE просто сообщает Windows о необходимости перерисовки на существующем фоне. При обработке сообщения WM_TIMER мы используем FALSE, поскольку это снижает нежелательное мерцание экрана. Вы можете удивиться, зачем нам вообще нужно использовать TRUE.

Значение TRUE необходимо при обработке сообщения WM_WININICHANGE, поскольку длина выводимой строки может измениться на несколько символов, если вы измените формат времени с 12 на 24 часа. Однако, наибольшее изменение происходит в результате сообщения WM_TIMER, оно равно двум символам — например, при переходе даты с 12/31/11 на 1/1/12 — и поэтому строка формата, которую использует WndPaint для вывода информации на экран содержит по два пробела на концах для учета такого изменения в длине и учета пропорционального шрифта.

Мы могли бы также обрабатывать в программе DIGCLOCK сообщения WM_TIMECHANGE, которые извещают приложение об изменении системных даты и времени. Но это не нужно, поскольку сообщения WM_TIMER вызывают обновление в программе DIGCLOCK каждую секунду. Обработка сообщений WM_TIMECHANGE имела бы больше смысла для таких часов, которые обновляют информацию каждую минуту.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]