
- •Основные понятия ос. Ос как расширенная машина. Ос как система управления ресурсами.
- •Функции ос. Подсистема управления подпрограммами. Диаграмма состояния процесса.
- •Процессы и потоки.
- •Алгоритмы синхронизации потоков. Критическая секция.
- •Синхронизация в режиме ядра. Семафоры, мьютексы. Типичные задачи: производители-потребители и читатели-писатели.
- •Организация памяти компьютера. Логическая память. Сегменты. Связывание адресов.
- •Простейшие схемы управления памятью. Схемы с фиксированными и переменными разделами. Страничная память. Сегментно-страничная организация памяти.
- •Файловые системы.
- •Архитектура ос. Ядро и вспомогательные модули. Микроядерная архитектура. Преимущества и недостатки.
- •Программирование, управляемое событиями. Простейшее приложение Windows.
- •Окна в Windows. Функции окна. Класс окна.
- •Обработка сообщений. Приложение с обработкой сообщений.
- •Вывод текста в окно. Контекст отображения.
- •Стили окна. Приложение, использующее предопределенные в Windows стили окна.
- •Работа с файлами в Windows.
Обработка сообщений. Приложение с обработкой сообщений.
Основная работа, которую выполняет приложение, заключается в обслуживании собственных окон. Приложение в цикле опрашивает в свою очередь сообщения. Обнаружив сообщения, приложение распределяет их в нужную часть окна, который выполняет их обработку.
Сообщение представляет собой следующую структуру:
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
Распределение сообщений между различными приложениями основано на понятии word-атрибут, который в любой момент может относиться к одному окну.
Сообщения от клавиатуры распределяются сначала в очередь расположения сообщений, создавшее окно, а затем в функцию окна, владеющую клавишей ввода. Изменение фокуса ввода происходит при помощи комбинации клавиш клавиатуры, либо мышью.
Сообщения от драйвера мыши всегда передаются в функцию окна, над которой находится курсор мыши.
Цикл обработки сообщений. После отображения окна функция WinMain запускает цикл обработки сообщений.
while (GetMessage(&msg, 0, 0, 0))
{
DispatchMessage(&msg);
}
Функция GetMessage выбирает сообщения из функции приложения.
1 параметр – указатель на структуру типа MSG. В нее записывается выбранное из очереди сообщение.
2 параметр – идентификатор окна, для которого необходимо выбрать сообщения. Для значения 0 будут выбираться сообщения для всех окон приложения.
3 и 4 параметры – определяют диапазон сообщений. При 0 выбираются все сообщения. Если из очереди выбираются сообщения с кодом WM_QUIT, функция возвращает сообщение со значением FALSE, что приводит к окончанию цикла выборки сообщений.
Функция DispatchMessage используется для распределения сообщений в функцию окна, для которой она выполняется.
Приложение определяет один класс окна и на его основе создает главное окно приложения. Функция окна обрабатывает сообщения от главной клавиши мыши. В ответ на сообщения функция окна выводит диалоговую панель.
#include <windows.h>
#include <mem.h> // для работы с динамической памятью
BOOL InitApp(HINSTANCE);
LRESULT CALLBACK WndProc(HWND, HINT, WPARAM, LPARAM);
Нужны 2 глобальных массива:
charsz ClassName[] = “WindowsAppClass”;
charsz WindowTitle[] = “WindowApp”;
int WINAPI WinMain
( HINSTANCE hInstance;
HINSTANCE hPrevInstance;
LPSTR lpszCmdLine;
Int CmdShow);
{
MSG msg;
HWND hwnd;
}
И т.д. из проги.
Вывод текста в окно. Контекст отображения.
Для вывода текста в окно нельзя использовать функции стандартной библиотеки, поскольку эти
функции ориентированы на консольный вывод. Windows и параллельно работающие программы должны совместно использовать экран, для этого они создают перекрывающие и перемещающие окна. Windows следит за перемещением окон и извещает приложения о необходимости перерисовки окна. В этом случае в очередь приложений записывается сообщение с кодом WN_PAINT. Приложение разрабатывается таким образом, чтобы весь вывод в окно осуществлялся при обработке сообщения WM_PAINT. Изображение, созданное при обработке других сообщений будет закрашено. Если логика работы приложения требует изменить содержимое окна в другой точке программы, то в этом случае необходимо вызвать функцию UpdateWindow(HWND hwnd) и передать ей идентификатор окна.
Контекст отображений. Приложения должны хранить информацию о своем текущем состоянии, пользуясь которой функция окна может в любой момент перерисовать свое окно.
Структура данных, описывающая состояния окна, называется контекстом отображения. В этой структуре находятся отображения окна, такие как: цвет фона, цвет текста, толщина и вид линий и т.д. Контекст отображения используется функциями интерфейса графических устройств GDI, которые являются подмножеством WINAPI32. Перед выводом в окно приложение должно создать контекст отображения. Windows заполнит структуру значениями по умолчанию. Приложение может переопределять отдельные значения полей. После окончания вывода, приложение должно вызвать функцию, освобождающую контекст. С этой целью при обработке сообщений используются BeginPaint и EndPaint. При обработке других сообщений используются GetDC и ReleaseDC.
Функция вывода текста в окно:
BOOL TextOut(HDC hdc, int xstart, int ystart, LPCSTR string, int len); // hdc – контекст отображения.
Int WINAPI DrawText(HDC hdc, LPCSTR string, int len, RECTFAR *r, UNIT format);
COLOREF WINAPI SetTextColor(HDC, COLOREF);
Пример функции:
…
HDC hdc, PAINTSTRUCT ps;
switch (msg)
{
case WM_PAINT:
{
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 10, 20, “Сообщение”, 18);
EndPaint(hwnd, &ps);
return 0;
}
break;
case WM_LBUTTONDOWN:
{
hdc = GetDC(hwnd);
TextOut(hdc, 30, 40, “Сообщение”, 24);
ReleaseDC(hwnd, hdc);
return 0;
}
}