Форма отчета по лабораторной работе. Отчет должен содержать: титульный лист; цель работы; условие задачи; текст программы с комментариями; вывод введенных данных в первом приложении и вывод

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

Вопросы для самоконтроля

1. Режимы открытия файлов.

2. Отличия работы с файлом в текстовом и двоичном режимах.

3. Режимы открытия файлов, в которых файл обязательно должен существовать до открытия.

4. Режимы открытия файлов, в которых файл создается заново (существующий файл очищается).

Лабораторная работа № 8. Изучение приложений с графическим интерфейсом пользователя для Windows

Цель и задачи работы, требования к результатам ее выполнения

Цель работы состоит в овладении навыками разработки приложений с графическим интерфейсом пользователя для операционных систем типа Windows XP/7/8. Для достижения цели необходимо выполнить следующие задачи:

- изучить учебный материал, посвященный разработке приложений с графическим интерфейсом пользователя для операционных систем типа Windows [5];

- разработать программу на языке Си для решения заданного варианта задания;

- отладить программу;

- подготовить отчет по лабораторной работе.

Краткая характеристика объекта изучения

Сообщения Windows

Операционная система (OC) Windows предоставляет пользователю множество системных функций для использования ее возможностей и доступа к аппаратуре компьютера, эти функции составляют API (Application Programming Interface) – Win API. Кроме того, OC Windows обменивается информацией с приложением с помощью механизма сообщений. Сообщение это структура в памяти типа MSG. Когда пользователь выполняет некоторые действия с элементами интерфейса или работает с «мышью», или с клавиатурой, ОС посылает приложению сообщение с информацией об этом. Все стандартные сообщения имеют идентификатор (номер), заданный разработчиками ОС. Примеры идентификаторов сообщений (определены в заголовочных файлах директивой #define, являются целыми константами): WM_LBUTTONUP, WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, WM_MOUSEMOVE, WM_CHAR, WM_KEYUP, WM_KEYDOWN, WM_ACTIVATE, WM_CREATE, WM_DESTROY, WM_MOVE, WM_SIZE, WM_KILLFOCUS, WM_PAINT, WM_COMMAND, WM_TIMER [5].

Структура приложения в Windows

Приложение с графическим интерфейсом пользователя состоит из двух основных частей:

- функция WinMain – точка входа в приложение (как правило, создает окно и запускает цикл обработки сообщений);

- функция окна - является функцией обратного вызова, «вызывается многократно операционной системой» для обработки сообщений приложения.

Стандартный заголовок функции WinMain имеет вид:

int WINAPI WinMain(HINSTANCE hIns, HINSTANCE hPrevIns, LPSTR arg, int WinMode)

Назначение функции WinMain:

- определение класса окна;

- регистрация класса окна;

- создание окна;

- отображение окна;

- запуск цикла обработки сообщений.

Стандартный заголовок функции окна (функции обратного вызова) имеет вид:

LRESULT CALLBACK WinFun(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

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

switch(message)

{

case WM_CREATE: // Создание окна

………. break;

case WM_DESTROY: // Завершение программы

PostQuitMessage(0);

break;

case WM_LBUTTONDOWN: // Нажатие левой клавиши мыши

……. break;

default: // Обработка сообщений по умолчанию

return DefWindowProc(hwnd, message, wParam, lParam);

}

Вывод графики в Windows

Контексты устройств

Контекст устройства (Device Context) – некоторое логическое представление физического устройства (экрана монитора, принтера, и т.д.). Контекст устройства – это внутренняя структура, для управления информацией о выходном устройстве. Она содержит информацию о параметрах и атрибутах («перо», «кисть», шрифт и др.) вывода графики на устройство (например, дисплей или принтер). Вместо направления вывода непосредственно на аппаратное устройство, приложение направляет его в контекст устройства, а затем Windows пересылает вывод в аппаратное устройство.

Типы контекстов устройств:

– контекст дисплея;

– контекст принтера;

– контекст в памяти (моделирует в памяти устройство вывода);

– информационный контекст (служит для получения данных от устройства).

Заголовки функции для получения контекста устройств (в программе используются хэндлы контекстов устройств - HDC):

HDC GetDC(HWND hWnd);

HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);

Освобождение контекста устройств:

int ReleaseDC(HWND hWnd, HDC hDC);

BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);

Графические «перья» и «кисти»

Заголовок функции для получения предопределенных «перьев» или «кистей»:

HGDIOBJ GetStockObject(int);

Возможные параметры:

Для «перьев»:

WHITE_PEN, BLACK_PEN, NULL_PEN

Для «кистей»:

WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH, NULL_BRUSH

Заголовок функции для создания «пера»:

HPEN CreatePen(int, int, COLORREF);

Первый параметр определяет стиль, возможные значения (заданы константами в заголовочных файлах):

PS_SOLID /* ______ */

PS_DASH /* ------- */

PS_DOT /* ....... */

PS_DASHDOT /* _._._._ */

PS_DASHDOTDOT /* _.._.._ */

PS_NULL

Второй параметр определяет толщину.

Третий параметр определяет цвет, для получения цвета можно использовать макрос:

RGB(r,g,b)

он возвращает тип объявленный как

typedef DWORD COLORREF;

Заголовок функции для создания сплошной «кисти»:

HBRUSH CreateSolidBrush(COLORREF);

Заголовок функции для создания «кисти» с заданным стилем:

HBRUSH CreateHatchBrush(int, COLORREF);

Первый параметр определяет стиль, возможные значения, определенные в заголовочных файлах:

HS_HORIZONTAL /* ----- */

HS_VERTICAL /* || */

HS_FDIAGONAL /* \\\\\ */

HS_BDIAGONAL /* ///// */

HS_CROSS /* +++++ */

HS_DIAGCROSS /* xxxxx */

Заголовок функции для загрузки «пера» или «кисти» в контекст устройства:

HGDIOBJ SelectObject(HDC, HGDIOBJ);

После работы с объектами («пером» и «кистью») их необходимо удалить, заголовок функции для удаления имеет вид:

BOOL DeleteObject(HGDIOBJ);

Наши рекомендации