Когда программа требует контекст устройства, она получает его уже заполненным значениями по умолчанию. Объект в составе контекста называется текущим объектом. Само слово - текущий - говорит о том, что контекст устройства можно изменить. Программа может создать новый объект, скажем, bitmap или шрифт, и сделать его текущим. Замещенный объект автоматически из памяти не удаляется, его необходимо позже удалить отдельно. Само собой разумеется, что программа может получить характеристики текущего устройства. А вот изменить эти характеристики, увы, можно только через замену объекта (впрочем, это и так понятно).
В Windows поддерживаются несколько типов контекстов устройств. Одним из них является контекст дисплея.
Windows поддерживает три типа контекста дисплея – контекст класса, приватный контекст и общий контекст. Первые два типа используются в приложениях, которые выводят на экран большое количество информации. Ярким примером такого рода приложений являются настольные издательские системы, графические пакеты и т.д.
Приложения, которые не очень интенсивно работают с экраном, испольуют общий контекст. Контекст класса является устаревшим и поддерживается только для обеспечения совместимости с предыдущими версиями Windows. Microsoft не рекомендует использовать его при разработке новых приложений и рекомендует использовать только приватный контекст.
Контексты устройств хранятся в кэше, управляемом системой. Хэндл общего контекста программа получает с помощью функций GetDC(), GetDCEx() или BeginPaint(). После того, как программа отработает с дисплеем, она должна освободить контекст, вызвав функцию ReleaseDC() или EndPaint() (в случае, если контекст получался с помощью BeginPaint()). После того, как контекст дисплея освобожден, все изменения, внесенные в него программой, теряются и при повторном получении контекста все действия по изменению контекста необходимо повторять заново.
Вся работа по выводу времени разбивается на две части: вывод времени в аналоговой и цифровой форме. Вывод времени в цыфровой форме сложности не представлят, тогда как вывод в аналоговой форме может быть описан довольно большим числом функций. Ниже приведена функция для вывода времени в цифровой форме.
void DigPaint(HWND hWnd, HDC hdc) { SYSTEMTIME stime; //структура для записи текущего времери GetLocalTime(&stime);//функция получения текущего времени
char cBuffer[100]; //переменные для хрениения строки текста
char cBufferd[100]; HFONT fontdig1,fontdig2; //описатели для сознания нового шрифта SetBkMode(hdc,TRANSPARENT); // изменение режима отображения фона текста wsprintf(cBuffer,"%d%s%d%s%d",stime.wHour," : ", stime.wMinute,(PSTR)stime.wSecond); wsprintf(cBufferd,"%d%s%d%s",stime.wDay," day ", stime.wMonth," month "); //перевод всех полученных значений в строку fontdig1= CreateFont(50,26,0,0, //создание нового шрифта FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, "font1" ); SelectObject(hdc,fontdig1); // функция для выбора вышесозданного шрифта TextOut(hdc,70,105, cBuffer,strlen(cBuffer)); // вывод текста DeleteObject(fontdig1); //функция удаление шрифта fontdig2= CreateFont(20,15,0,0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, "font2" ); SelectObject(hdc,fontdig2); TextOut(hdc,115,85,cBufferd,strlen(cBufferd)); DeleteObject(fontdig2); }
Приведенная часть программы показывает простоту показывает простоту получения и использования времени в Windows , а также простоту вывода полученного времени на экран. Сначала мы обьявляем сируктуру SYSTEMTIME для хранения времени, даты и некоторых дополнительных параметров.
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
Далее следует функция для получения этих значений и занесения в структуру stime типа SYSTEMTIME.
GetLocalTime(&stime)
У этой функции только один параметр-указатель на структуру, которая должна заполниться полученными данными. Далее с помощью функции wsprintf мы переводим нужные нам данные из структуры stime в строку символов и добавляем нужные нам обозначения и форматирование для корректного вывода. После чего уже нужно готовить режимы вывода текста на экран, так как данные для вывода уже готовы, и находятся в переменных типа char cBuffer и cBuffered . Функция SetBkMode(hdc,TRANSPARENT) имеет два параметра. Первый это описатель контекста устройства вывода, а второй параметр-это режим отображения текста. В данном случае режим TRANSPARENT обеспечивает прозрачность прямоугольника в котором выводиться текст, и таким образом мы получаем вот такой вид вывода времени, когда цвен фона под текстом не отличается от цвета фона вокруг него.
Далее по желанию мы можем создать дгугой шрифт. Это производиться с помощью функции CreateFont(). Число ее параметров очень большое, так что приводть их описание не буду. Если шрифт не создавать, то вывод текста будет происходить с использованием стандартного шрифта, который для этого случая будет довольно маленьким. И самый последний этап-это вывод текста на экран с использованием функции TextOut(hdc,115,85,cBufferd,strlen(cBufferd)). Пользоваться этой функцией довольно просто. Нам нужен лишь описатель контекста устройства, координаты вывода текста, строка, которую собираемся выводить, и размер этой строки. Результат выполнения этой части программы можно увидеть на рисунке выше. Загрузка и отображение графического файла будет описана дальше.
Для работы с программой необходимо выполнить следующие шаги:
· скопировать в какой-либо каталог папку CLOCK;
· запустить файл kurs.exe;
· После запуска программы, она имеет вот такой внешний вид.
· Выполнение программы начинается когда пользователь нажмет на пункт меню Show, этот пункт меню содержится как в меню Digital так и в меню Analog. Отображение этого пункта приведено ниже.
ОПИСАНИЕ МЕНЮ ЦИФРОВОГО ВИДА ЧАСОВ
По нажатию этого пункта идет перерисовка окна и отображение часов в цифровом виде
Далее можно изменить цвет фона текста нажатием на пункт меню Set Background Color
Этот пункт обеспечивает смену цвета фона на зеленый, красный и синий, но сам цвет текста при этом не меняется. За смену текста отвечает следующее подменю Set Text Color
Подменю обеспечивает смену цвета текста который отображает время на зеленый, красный и синий. При желании программа может быть легко доработана таким образом, чтобы выбор цвета фона и текста происходил с помощью стандартного диалога выбора цвета, где можно выбрать абсолютно любой цвет и оттенок.
ОПИСАНИЕ МЕНЮ АНАЛОГОВОГО ВИДА ЧАСОВ
Отображение аналогового вида часов начинается с нажатия пункта
меню Show но уже в разделе Analog
Результат выполнения этого пункта меню:
Описание пунктов меню раздела Analog практически идентично разделу Digital . Для смены фона часов нужно воспользоваться подменю Set BackGround Color. Это меню обеспечивает сменю фона часов на зеленый синий и красный цвет, а также на графический рисунок формата *.bmp.
Кроме того с помощью подменю Set Hands Color можно поменять цвет стрелок часов
И последний пункт меню- Exit, по нажатию на который программа прекращает выполнятся и закрывается:
4.3 Системные требования
Для нормальной работы данной программы требуется IBM-совместимый персональный компьютер со следующими параметрами:
· процессор Pentium с тактовой частотой 66 MHz и выше;
· ОЗУ 16 Мбайт;
· Видеокарта SuperVGA;
· дисковое пространство 1,5 Mбайта;
· операционная система Windows 95 /NT /98/2000/XP
В процессе курсовой работы была изучена техника программирования графики в середе Visual C++. В качестве интерфейса программирования был использован Windows API, который доступен для использования в этой среде с помощью заголовочного файла windows.h. Разработана программа «часы», которая может служить наглядным примером использования функций графики интерфейса Windows API.
Несмотря на то, что MFC не был задействован в этой программах, алгоритмы и API использовавшиеся могут быть применены и в программе на базе MFC, так как из классов MFC можно всегда получить идентификаторы окон и прочие необходимые для работы с API данные. Это подтверждает эффективность и универсальность интерфейса Windows API.
1. Страуструп Б. Язык программирования С++: В 2-х кн. -К.: Диасофт, 1993.
2. Петзольд Ч. Программирование под Windows 95. В двух книгах: BHV - Санкт - Петербург, 1997, silt.
3. «Win32 Programmer’s Reference» - электронная версия входящая в состав Borland C++ 5.0