- •Вопрос 77. Требования к программному и аппаратному обеспечению Windows приложений. Требования к программному обеспечению. Требования к аппаратуре.
- •Вопрос 78. Доступ к оболочке Windows. Система координат. Основные режимы отображения. Координаты устройства.
- •Вопрос 79. Доступ к оболочке Windows. Поля вывода. Изменение пределов поля вывода и окна. Координаты, определяемые пользователем. Выбор начальных атрибутов окна.
- •Вопрос 80. Вывод окна. Изменение вида окна. Часто используемые элементы управления и диалоговые окна. Статические элементы управления. Элементы управления - кнопки.
- •Модальная диалоговая панель
- •Немодальная диалоговая панель
- •Элементы управления
Вопрос 79. Доступ к оболочке Windows. Поля вывода. Изменение пределов поля вывода и окна. Координаты, определяемые пользователем. Выбор начальных атрибутов окна.
В операционной системе Windows параллельно работающие приложения должны совместно использовать экран. Для этого они создают перекрывающиеся и перемещаемые окна, в которые и выполняют вывод текста или графических изображений. Windows следит за перемещением и изменением размера окон и при необходимости извещает приложения, о том, что им следует перерисовать содержимое окна. Для извещения в очередь приложения записывается сообщение с идентификатором WM_PAINT. Получив такое сообщение, функция окна должна выполнить перерисовку всего окна или его части, в зависимости от дополнительной информации, полученной вместе с сообщением WM_PAINT.
Приложение должно хранить информацию, на основании которой оно может в любой момент времени перерисовать окно. При получении сообщения WM_PAINT приложение должно определить, какой участок окна необходимо перерисовать и какому диапазону адресов памяти этот участок соответствует.
Сообщение WM_PAINT передается функции окна, если стала видна область окна, скрытая раньше другими окнами, если вы изменили размер окна или выполнили операцию свертки (пролистывания) изображения в окне. Приложение может передать функции окна сообщение WM_PAINT явным образом, вызывая функции UpdateWindow, InvalidateRect или InvalidateRgn.
Иногда операционная система Windows может сама восстановить содержимое окна, не посылая сообщение WM_PAINT. Например, при перемещении курсора мыши или пиктограммы свернутого приложения Windows самостоятельно восстанавливает содержимое окна. Если же Windows не может восстановить окно, функция окна получает сообщение WM_PAINT и перерисовывает окно самостоятельно.
Начальные координаты и размер области, подлежащей обновлению в процессе обработки сообщения WM_PAINT, передаются через поле rcPaint. Это поле представляет собой структуру типа RECT, описывающую прямоугольную область:
typedef struct tagRECT
{
int left;
int top;
int right;
int bottom;
} RECT;
Поля left, top, right и bottom задают координаты области следующим образом:
Поле |
Описание |
Left |
x-координата верхнего левого угла области |
Top |
y-координата верхнего левого угла области |
Right |
x-координата правого нижнего угла области |
bottom |
y-координата правого нижнего угла области |
Координаты задаются в единицах измерения, называемых пикселами. Пикселы - это маленькие точки, из которых строится изображение.
Если окно содержит несколько областей, подлежащих обновлению, приложение получает только одно сообщение WM_PAINT, в котором определена область, охватывающая все указанные выше области.
Некоторые функции, имеющие отношение к сообщению WM_PAINT.
Функция UpdateWindow имеет следующий прототип:
void UpdateWindow(HWND hwnd);
Эта функция посылает сообщение WM_PAINT функции окна, идентификатор которого задан в качестве параметра hwnd. Сообщение посылается в обход очереди сообщений приложения, и только в том случае, если для окна существует непустая область обновления. Если в окне обновлять нечего, сообщение WM_PAINT не посылается.
При помощи функции InvalidateRect вы можете объявить любую область окна как требующую обновления. Прототип функции:
void InvalidateRect(HWND hwnd, LPRECT lprc, BOOL fErase);
Первый параметр (hwnd) функции является идентификатором окна, для которого выполняется операция. Второй параметр (lprc) - дальний указатель на структуру типа RECT, определяющую прямоугольную область, подлежащую обновлению. Третий параметр (fErase) определяет необходимость стирания фона окна. Если этот параметр задан как TRUE, фон окна подлежит стиранию.
Функция ValidateRect удаляет прямоугольную область из списка областей, подлежащих обновлению. Она имеет следующий прототип:
void ValidateRect(HWND hwnd, LPRECT lprc);
Первый параметр определяет идентификатор окна, второй является дальним указателем на структуру типа RECT, определяющую прямоугольную область, которая должна быть исключена из области обновления. Если в результате вызова функции ValidateRect в окне не остается областей, подлежащих обновлению, сообщение WM_PAINT удаляется из очереди сообщений приложения.
При обработке сообщения WM_PAINT перед выводом текста вызывается функция BeginPaint, возвращающая идентификатор так называемого контекста отображения (display context):
hdc = BeginPaint(hwnd, &ps);
Контекст отображения используется функцией вывода текста - TextOut:
TextOut(hdc, 10, 10, "Сообщение WM_PAINT", 18);
Перед завершением обработки сообщения WM_PAINT приложение должно обязательно вызвать функцию EndPaint, освобождающую полученный ранее контекст отображения устройства:
EndPaint(hwnd, &ps);
HDC hdc;-индекс контекст устройства
HWND hwnd;-идентификатор окна
Идентификатор окна задаётся при определении класса окна:
class Window
{
HWND hwnd; // Идентификатор окна
int errno; // Флаг ошибки
public:
// Конструктор
Window (HINSTANCE, LPSTR, LPSTR);
// Проверка флага ошибки
int Error(void) { return errno; }
// Отображение окна
void Show(int nCmdShow) { ShowWindow(hwnd, nCmdShow); }
// Передача функции WndProc сообщения WM_PAINT
void Update(void) { UpdateWindow(hwnd); }
};
// В классе Window определена переменная типа HWND для хранения идентификатора окна и флаг ошибок errno. Там же определены конструктор, функции-методы Show (отображение окна), Update (передача в функцию окна сообщения WM_PAINT) и Error (проверка флага ошибок).
// Конструктор класса Window
// -------------------------------------
Window::Window (HINSTANCE hInstance, LPSTR szClassName,
LPSTR szWindowTitle)
{
// Сбрасываем флаг ошибки
errno = 0;
// Создаем окно
hwnd = CreateWindow(
szClassName, // имя класса окна
szWindowTitle, // заголовок окна
WS_OVERLAPPEDWINDOW, // стиль окна
CW_USEDEFAULT, // задаем размеры и расположение
CW_USEDEFAULT, // окна, принятые по умолчанию
CW_USEDEFAULT,
CW_USEDEFAULT,
0, // идентификатор родительского окна
0, // идентификатор меню
hInstance, // идентификатор приложения
NULL); // указатель на дополнительные параметры
// Если при создании окна были ошибки,
// устанавливаем флаг ошибки
if(!hwnd)
{
errno = 1;
return;
}
}
Конструктор класса Window сбрасывает флаг ошибок и создает окно, вызывая для этого функцию CreateWindow. Если при создании окна были ошибки, устанавливается флаг ошибок.
Контекст отображения представляет собой структуру в памяти, описывающую окно. В этой структуре находятся характеристики окна, используемые для вывода в него текста и графических изображений, такие, как цвет фона и цвет кисти, используемой для рисования текста или графики, шрифт для вывода текста, толщина и вид рисуемых линий и т. д. Весь вывод в окно должен выполняться с использованием функций интерфейса графических устройств GDI, составляющих подмножество программного интерфейса Windows.
Функция TextOut, которая используется для вывода текста, также относится к интерфейсу GDI. Она имеет пять параметров:
BOOL TextOut(HDC hdc, int nXStart, int nYStart,LPCSTR lpszString, int cbString);
Первый параметр (hdc) определяет используемый контекст отображения. При обработке сообщения WM_PAINT контекст отображения создается функцией BeginPaint для того окна, идентификатор которого указывается этой функции в качестве первого параметра.
Второй (nXStart) и третий (nYStart) параметры задают координаты (x, y) начальной позиции, начиная с которой будет выполняться вывод текста.
Четвертый параметр (lpszString) является дальним указателем на выводимую строку, длина которой определяется последним, пятым параметром (cbString).
Функция TextOut не имеет параметров, определяющих шрифт, размер букв, цвет фона, цвет букв и т. п. Все эти характеристики текста хранятся в структуре контекста отображения. Идентификатор контекста отображения передается функции TextOut в качестве первого параметра.
Когда вы создаете контекст отображения, Windows заполняет соответствующую структуру значениями по умолчанию.
Используемая система координат также определяется в контексте отображения.
Существует и другой способ получения контекста отображения, который должен использоваться при обработке других, отличных от WM_PAINT, сообщений:
hdc = GetDC(hwnd);
TextOut(hdc, 10, 40, "Сообщение WM_LBUTTONDOWN", 24);
ReleaseDC(hwnd, hdc);
Для получения контекста отображения в этом случае следует воспользоваться функцией GetDC. После использования необходимо освободить контекст, вызвав функцию ReleaseDC.
