Курсовая работа: Разработка программного приложения с использованием интерфейса Windows API

Цикл сообщений

Как объяснялось выше, Windows взаимодействует с программой, посылая ей сообщения. Все приложения Windows должны организовать так называемый цикл сообщений (обычно внутри функции WinMain()). В этом цикле каждое необработанное сообщение должно быть извлечено из очереди сообщений данного приложения и передано назад в Windows, которая затем вызывает функцию окна программы с данным сообщением в качестве аргумента. В традиционных Windows-программах необходимо самостоятельно создавать и активизировать такой цикл. Он является неотъемлемой частью любого приложения Windows. Процесс получения и обработки сообщений может показаться чересчур сложным, но тем не менее ему должны следовать все Windows-программы.

Класс окна

Каждое окно в Windows-приложении характеризуется определенными атрибутами, называемыми классом окна . (Здесь понятие “класс” не идентично используемому в С++. Оно, скорее, означает стиль или тип.) В традиционной программе класс окна должен быть определен и зарегистрирован прежде, чем будет создано окно. При регистрации необходимо сообщить Windows, какой вид должно иметь окно и какую функцию оно выполняет. В то же время регистрация класса окна еще не означает создание самого окна. Для этого требуется выполнить дополнительные действия.

Типы данных в Windows

В Windows-программах вообще не слишком широко применяются стандартные типы данных из С или С++, такие как int или char*. Вместо них используются типы данных, определенные в различных библиотечных (header) файлах. Наиболее часто используемыми типами являются HANDLE, HWND, BYTE, WORD, DWORD, UNIT, LONG, BOOL, LPSTR и LPCSTR. Тип HANDLE обозначает 32-разрядное целое, используемое в качестве дескриптора. Есть несколько похожих типов данных, но все они имеют ту же длину, что и HANDLE, и начинаются с литеры Н. Дескриптор – это просто число, определяющее некоторый ресурс. Например, тип HWND обозначает 32-разрядное целое – дескриптор окна. Тип BYTE обозначает 8-разрядное беззнаковое символьное значение, тип WORD – 16-разрядное беззнаковое короткое целое, тип DWORD – беззнаковое длинное целое, тип UNIT - беззнаковое 32-разрядное целое. Тип LONG эквивалентен типу long. Тип BOOL обозначает целое и используется, когда значение может быть либо истинным, либо ложным. Тип LPSTR определяет указатель на строку, а LPCSTR – константный (const) указатель на строку.

Общие концепции программирования графики в Windows

С точки зрения программиста Windows является системой, не зависящей от устройств (device independent). Эту независимость со стороны Windows обеспечивает библиотека GDI32.dll, а со стороны устройства - драйвер этого устройства. С точки зрения программы связующим звеном между программой и устройством является контекст устройства (Device Context - DC). Если программе нужно осуществить обмен с внешним устройством, программа должна оповесить GDI о необходимости подготовить устройство для операции ввода-вывода. После того, как устройство подготовленно, программа получает хэндл контекста устройства, т.е. хэндл структуры, содержащей набор характеристик этого устройства. В этот набор входят: bitmap(битовая карта, изображение), отображаемый в окне, перо для прорисовки линий, кисть, палитра, шрифти т.д. Программа никогда напрямую не обращается к контексту устройства, она обращается к нему опосредствованно, через определенные функции. После того, как все действия произведены, и необходимость в использовании устройства отпала, программа должна освободить контекст устройства, чтобы не занимать память. Есть еще одна причина, из-за которой необходимо освобождать контекст устройства. В системе может существовать одновременно только ограниченное число контекстов устройств. Если контекст устройства не будет освобождаться после операций вывода, то через несколько перерисовок окна система может повиснуть. Так что не стоит забывайть освобождать контексты устройств!

Когда программа требует контекст устройства, она получает его уже заполненным значениями по умолчанию. Объект в составе контекста называется текущим объектом. Само слово - текущий - говорит о том, что контекст устройства можно изменить. Программа может создать новый объект, скажем, bitmap или шрифт, и сделать его текущим. Замещенный объект автоматически из памяти не удаляется, его необходимо позже удалить отдельно. Само собой разумеется, что программа может получить характеристики текущего устройства. А вот изменить эти характеристики, увы, можно только через замену объекта (впрочем, это и так понятно).

В Windows поддерживаются несколько типов контекстов устройств. Одним из них является контекст дисплея.

Windows поддерживает три типа контекста дисплея – контекст класса, приватный контекст и общий контекст. Первые два типа используются в приложениях, которые выводят на экран большое количество информации. Ярким примером такого рода приложений являются настольные издательские системы, графические пакеты и т.д.

Приложения, которые не очень интенсивно работают с экраном, испольуют общий контекст. Контекст класса является устаревшим и поддерживается только для обеспечения совместимости с предыдущими версиями Windows. Microsoft не рекомендует использовать его при разработке новых приложений и рекомендует использовать только приватный контекст.

Контексты устройств хранятся в кэше, управляемом системой. Хэндл общего контекста программа получает с помощью функций GetDC(), GetDCEx() или BeginPaint(). После того, как программа отработает с дисплеем, она должна освободить контекст, вызвав функцию ReleaseDC() или EndPaint() (в случае, если контекст получался с помощью BeginPaint()). После того, как контекст дисплея освобожден, все изменения, внесенные в него программой, теряются и при повторном получении контекста все действия по изменению контекста необходимо повторять заново.

3 ОСНОВНАЯ ЧАСТЬ

Вся работа по выводу времени разбивается на две части: вывод времени в аналоговой и цифровой форме. Вывод времени в цыфровой форме сложности не представлят, тогда как вывод в аналоговой форме может быть описан довольно большим числом функций. Ниже приведена функция для вывода времени в цифровой форме.

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.

К-во Просмотров: 751
Бесплатно скачать Курсовая работа: Разработка программного приложения с использованием интерфейса Windows API