- •1. Тема: “ Контекстно –независимый вывод текстовой информации”
- •1. 1 Цель
- •1. 2. Методические указания для подготовки к работе
- •Другой способ получения описателя контекста устройства - в теле обработчика сообщения , отличного от wm_paint:
- •Основные понятия о шрифтах
- •Структура logfont и параметры шрифтов
- •Пример создания и использования шрифтов
- •1. 4 Общие требования и варианты заданий
- •4.3. Краткие теоретические сведения
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ТЕХНОЛОГИЧЕСКИЙ
ИНСТИТУТ
В
ОСТОЧНО-УКРАИНСКОГО
НАЦИОНАЛЬНОГО УНИВЕРСИТЕТА
имени
ВЛАДИМИРА ДАЛЯ
(г. Северодонецк)
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
для выполнения практических заданий и контрольных работ
по дисциплине “СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ”
Прогаммирование в многозадачных системах
для студентов специальностей 7.091502 «Системное программирование», 7.091501«Компьютерные системы и сети», дневной и заочной форм обучения
Северодонецк- 2010г.
УДК 681.3.06
Методические указания к выполнению практических и контрольных занятий по дисциплине "Системное программное обеспечение" (для студентов дневного и заочного отделений, обучающихся по направлению 6.0915 «Компьютерная инженерия», специальности 7.091502 «Системное программирование») / Сост. А.М. Ларгина, Г.М. Смирнов. - Северодонецк: Издательство ТИ, 2010. - 75с. Данный курс практических занятий позволит студентам получить практические навыки использования интерфейса прикладного программирования (API - Application Programming Interface) многозадачной операционной системы на примере Windows. Использование API для программирования ввода-вывода позволяет разрабатывать платформо - независимые приложения.
Составитель: А.М. Ларгина
Рецензент:
Затверджено Вченою радою інституту.
Протокол № ___ від «___» __________ 2010 р.
Голова Вченої ради
ВВЕДЕНИЕ. ИСПОЛЬЗОВАНИЕ СИСТЕМНЫХ ФУНКЦИЙ ОС WINDOWS ДЛЯ РАЗРАБОТКИ API - ПРИЛОЖЕНИЙ
Прикладные программы, работающие под управлением OS Windows, имеют ряд особенностей (по сравнению с MS DOS), связанных с организацией ввода-вывода информации:
Прикладные программы не имеют возможности напрямую взаимодействовать с устройствами ввода-вывода. В случае необходимости осуществления ввода-вывода информации, прикладные программы «обязаны» обращаться с соответствующими запросами к OS Windows. С этой целью в составе OS Windows имеется большой набор подпрограмм (не только для организации ввода вывода), называемый интерфейсом прикладного программирования (английская аббревиатура – API). Такой подход к организации ввода вывода имеет то преимущество, что фактически с аппаратными устройствами компьютера взаимодействует только одна программа – операционная система, что резко снижает вероятность конфликтных ситуаций, что особенно важно для многозадачных ОС, каковой и является OS Windows. Запросы на ввод-вывод, поступающие от разных прикладных программ, OS Windows имеет возможность сохранять в очередях и соответствующим образом обрабатывать. Кроме того, программные модули операционной системы, взаимодействующие с аппаратными устройствами компьютера, заведомо обладают достаточно высокой надежностью, чего было бы трудно ожидать от всех возможных прикладных программ. Этот момент оказывает значительное положительное влияние на устойчивость работы системы в целом.
Подавляющее большинство программ, работающих под управлением OS Windows, осуществляют ввод-вывод информации в графическом режиме (в отличие от MS DOS). Преимущества графического режима очевидны: рисунки, схемы, графики, шрифты различных размеров и конфигураций – все это делает пользовательский интерфейс прикладной программы наиболее удобным и информативным.
Одним из основополагающих идеологических принципов построения OS Windows и прикладных приложений данной операционной системы, является унификация пользовательского интерфейса. Здесь основная идея заключается в том, что экранные управляющие элементы различных программ (такие как меню, кнопки, строки ввода) должны, по возможности, выглядеть сходно и иметь сходное расположение. То же касается управляющих комбинаций клавиш. Соблюдение этого требования позволяет пользователям быстро осваивать приемы работы с приложениями, уделяя при этом максимум внимания содержательной стороне дела, а не пользовательскому интерфейсу.
Любая Windows-программа осуществляет вывод информации на то или иное устройство. Для того, чтобы абстрагироваться от конкретного аппаратного устройства, и разделить процессы построения изображения и его вывод, Windows поддерживает работу с т.н. контекстом графического устройства и набором аппаратно-независимых подпрограмм – интерфейсом графического устройства (GDI, подмножество API). За непосредственный вывод информации отвечают специальные программные модули – драйверы, которые являются специфичными для каждого из устройств ввода-вывода и выполняют действия, предписываемые аппаратно независимыми подпрограммами GDI.
Контекст графического устройства (HDC) – это информационная структура, которая создается и управляется операционной системой и предназначенная для организации построения аппаратно-независимой графики. Именно через эту структуру подпрограммы GDI взаимодействуют с драйвером графического устройства. Эта структура содержит основные характеристики устройства, а также различные средства отображения – кисти, карандаши, цвета, шрифты и т.д. Драйвер того устройства, которое используется для отображения информации, преобразует вызовы аппаратно-независимых подпрограмм GDI в команды конкретного устройства.
Рассмотренный подход, делает прикладную программу и саму операционную систему аппаратно-независимыми и позволяет им работать на компьютерах с различной аппаратной конфигурацией. Главное условие – наличие драйвера для имеющихся устройств ввода-вывода.
При работе в MS-DOS программа, использующая полноэкранный режим вывода информации, может выводить текст в любую часть экрана. Поскольку система однозадачная, то все, что программа вывела на экран, там и останется и никуда не исчезнет. Программе уже не нужна информация, необходимая для повторного вывода информации на экран. Если другая программа (например, резидентная) закроет часть экрана, тогда эта резидентная программа и должна, после завершения своей работы, восстановить содержимое экрана.
В Windows можно выводить информацию только в рабочую область окна, и вы не можете быть уверены в том, что там что-нибудь будет оставаться, до тех пор, пока ваша программа специально не выведет что-нибудь поверх. Например, окно диалога другого приложения может перекрыть часть рабочей области. Хотя Windows будет пытаться сохранить и восстановить область экрана под окном диалога, это не всегда получается. После того как окно диалога удаляется с экрана, Windows выдаст запрос, требующий, чтобы ваша программа перерисовала эту часть рабочей области.
Windows — это операционная система, управляемая сообщениями. Windows уведомляет приложения о различных событиях путем постановки синхронных сообщений в очередь сообщений приложения или путем отправки асинхронных сообщений соответствующей процедуре окна. Посылая синхронное сообщение WM_PAINT, Windows уведомляет оконную процедуру о том, что часть рабочей области окна необходимо обновить.
Программирование в OS Windows
Любое оконное приложение, написанное под Windows должно содержать в себе следующие элементы:
Функцию регистрации класса окна.
Функцию создания окна.
Оконную процедуру.
Цикл обработки сообщений.
Далее по тексту приводится пример простейшей программы под Windows, которая выводит на экран окно приложения с надписью "Привет, друзья!". Данную программу необходимо взять за основу при решении своего варианта задания. Программа содержит, все необходимые для понимания ее работы, комментарии.
#include <windows.h> // подключение библиотеки с функциями API
// Глобальные переменные:
HINSTANCE hInst; // Указатель приложения
// Предварительное описание функций
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// Основная программа
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
// Регистрация класса окна
MyRegisterClass(hInstance);
// Создание окна приложения
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
// Цикл обработки сообщений
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// FUNCTION: MyRegisterClass()
// Регистрирует класс окна
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW; // стиль окна
wcex.lpfnWndProc = (WNDPROC)WndProc; // оконная процедура
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance; // указатель приложения
wcex.hIcon = MyIcon1; // определение иконки
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
// определение курсора
wcex.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
// установка фона
wcex.lpszMenuName = NULL; // определение меню
wcex.lpszClassName = szWindowClass; // имя класса
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex); // регистрация класса окна
}
// FUNCTION: InitInstance(HANDLE, int)
// Создает окно приложения и сохраняет указатель приложения в переменной hInst
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // сохраняет указатель приложения в переменной hInst
hWnd=CreateWindow(szWindowClass, // имя класса окна
szTitle, // имя приложения
WS_OVERLAPPEDWINDOW, // стиль окна
CW_USEDEFAULT, // положение по Х
CW_USEDEFAULT, // положение по Y
CW_USEDEFAULT, // размер по Х
CW_USEDEFAULT, // размер по Y
NULL, // описатель родительского окна
NULL, // описатель меню окна
hInstance, // указатель приложения
NULL); // параметры создания.
if (!hWnd) // Если окно не создалось, функция возвращает FALSE
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow); // Показать окно
UpdateWindow(hWnd); // Обновить окно
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
// Оконная процедура. Принимает и обрабатывает все
// сообщения, приходящие в приложение
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rt;
switch (message)
{
case WM_CREATE: // Сообщение приходит при создании окна
break;
case WM_PAINT: // Перерисовать окно
hdc = BeginPaint(hWnd, &ps); // Начать графический вывод
GetClientRect(hWnd, &rt); // Область окна для рисования
DrawText(hdc, " Привет, друзья!", -1, &rt,
DT_SINGLELINE|DT_CENTER | DT_VCENTER);
EndPaint(hWnd, &ps); // Закончить графический вывод
break;
case WM_DESTROY: // Завершение работы
PostQuitMessage(0);
break;
default:
// Обработка сообщений, которые не обработаны пользователем
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Подробное описание параметров функций регистрации, создания окна и оконной процедуре можно узнать при помощи MSDN.
Следует обратить внимание, что в дальнейшем по тексту методических указаний будет отсутствовать такое подробное рассмотрение программ, а будут приведены ряд функций, которые соответствуют теме.
Итак, Windows. Пожалуй, это самая распространенная операционная система для PC. Она обладает собственным графическим интерфейсом и берет на себя большинство задач по обработке графики. Во времена текстовой системы DOS, если была нужна программа с графическим интерфейсом, приходилось программировать его самостоятельно, так же, как и работать с выводом графики. (Программисты напрямую работали с видеопамятью машины, используя низкоуровневый язык Ассемблер). Сейчас же можно сравнительно просто создавать программы со стандартным графическим интерфейсом Windows (кнопки, меню, полосы прокрутки) - достаточно вызвать соответствующие функции Windows API.
API это сокращение от application programming interface, то есть интерфейс программирования приложений. Он представляет собой набор функций, вызывая которые из нашей программы, мы обращаемся к динамически подключаемым библиотекам (.DLL файлы), реализующим те или иные действия.
1. Тема: “ Контекстно –независимый вывод текстовой информации”
1. 1 Цель
Знакомство со структурой API - программы. Изучить формат и правила применения структуры управления шрифтами, цветом. Получение практических навыков разработки приложений, осуществляющих вывод текстовой информации различными шрифтами, управляя атрибутами цвета.
1. 2. Методические указания для подготовки к работе
Необходимо изучить принцип построения и логику работы Windows-приложения, обратив внимание на порядок создания приложения (формирование структуры класса окна, регистрация класса, написание оконной процедуры, создание и отображение окна, цикл обработки сообщений).
Необходимо освоить основные принципы контекстной концепции представления устройств вывода информации, структуру данных контекстов, а также порядок использования основных функций работы с контекстами устройств.
Изучить формат структуры LOGFONT и параметры шрифтов и правила применения структуры управления шрифтами, цветом.
При подготовке к работе необходимо изучить методические указания, теоретичеприведены ряд функций, которые соответствуют теме.
Итак, Windows. Пожалуй, это самая распространенная операционная система для PC. Она обладает собственным графическим интерфейсом и берет на себя большинство задач по обработке графики. Во времена текстовой системы DOS, если была нужна программа с графическим интерфейсом, приходилось программировать его самостоятельно, так же, как и работать с выводом графики. (Программисты напрямую работали с видеопамятью машины, используя низкоуровневый язык Ассемблер). Сейчас же можно сравнительно просто создавать программы со стандартным графическим интерфейсом Windows (кнопки, меню, полосы прокрутки) - достаточно вызвать соответствующие функции Windows API.
API это сокращение от application programming interface, то есть интерфейс программирования приложений. Он представляет собой набор функций, вызывая которые из нашей программы, мы обращаемся к динамически подключаемым библиотекам (.DLL файлы), реализующим те или иные действия.
1. Тема: “ Контекстно –независимый вывод текстовой информации”
1. 1 Цель
Знакомство со структурой API - программы. Изучить формат и правила применения структуры управления шрифтами, цветом. Получение практических навыков разработки приложений, осуществляющих вывод текстовой информации различными шрифтами, управляя атрибутами цвета.
1. 2. Методические указания для подготовки к работе
Необходимо изучить принцип построения и логику работы Windows-приложения, обратив внимание на порядок создания приложения (формирование структуры класса окна, регистрация класса, написание оконной процедуры, создание и отображение окна, цикл обработки сообщений).
Необходимо освоить основные принципы контекстной концепции представления устройств вывода информации, структуру данных контекстов, а также порядок использования основных функций работы с контекстами устройств.
Изучить формат структуры LOGFONT и параметры шрифтов и правила применения структуры управления шрифтами, цветом.
При подготовке к работе необходимо изучить методические указания, теоретические сведения данного методического пособия (1. 3) а также разделы, указанные в [16, c.4-52], [17, c.7-26], [16, c.57-62], [17, c.28-32].
1. 3. Краткие теоретические сведения
Для вывода текстовой информации в составе OS Windows имеются специальные инструментальные средства:
- информационные структуры – Шрифты (Fonts).
- системные подпрограммы для вывода текста с использованием контекста графического устройства.
Контекст устройства (32-разрядное беззнаковое целое) фактически является структурой данных, которая поддерживается GDI.
Некоторые значения в контексте устройства являются графическими атрибутами. Например, цвет текста, цвет фона для текста, шрифт - эти параметры являются частью контекста устройства. Когда их необходимо изменить один из этих атрибутов, вызывают функцию, изменяющую значение атрибута в контексте устройства.
Когда программе необходимо начать рисование, она должна получить описатель контекста устройства. После окончания рисования программа должна освободить описатель. После освобождения описатель является недействительным и не должен далее использоваться.
Получение описателя контекста устройства
Существует несколько методов получения описателя (дескриптора) контекста устройства.
Наиболее общий метод получения контекста устройства и его освобождения состоит в использовании системных функций BeginPaint и EndPaint при обработке сообщения WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
[другие строки программы]
EndPaint(hwnd, &ps);
где переменная ps - структура типа PAINTSTRUCT. PAINTSTRUCT ps;
Это структура определяется так:
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT;
В программе можно использовать только первые три поля этой структуры. Остальные используются Windows.
Первое поле hdc - это описатель контекста устройства, который кроме того еще и возвращается функцией BeginPaint.
Второе поле fErase - задает Windows обновление (флаг TRUE) фона недействительного прямоугольника с использованием кисти, заданной в структуре класса окна (wndclass).
Третье поле rcPaint - структура типа RECT (прямоугольник), определяющая прямоугольную область, содержащую недействительный регион клиентской (рабочей) области окна. Получив описатель контекста устройства, можно рисовать только в пределах этого региона. Функция BeginPaint делает этот регион действительным. Эти координаты можно получить в любое другое время, вызвав функцию GetUpdateRect.
