- •Часть II. Проектирование пользовательских интерфейсов средствами win32 api п 1. Основы приложений для Windows. П 1.1 Типы данных Windows.
- •П. 1.2 Главная функция приложения WinMain().
- •П. 1.3 Оконная функция.
- •П. 1.4 Сообщения от окна
- •П. 1.5 Сообщения от мыши
- •1.5.1 Сообщения мыши, связанные с рабочей областью окна
- •1.5.3 Двойные щелчки мыши
- •1.5.4 Сообщения мыши, связанные с нерабочей областью окна
- •1.5.5 Захват мыши
- •П. 1.6 Сообщения от клавиатуры
- •1.6.1 Синхронизация событий клавиатуры
- •1.6.2 Игнорирование событий клавиатуры
- •1.6.3 Понятие фокуса ввода
- •1.6.4 Категории клавиатурных сообщений
- •1.6.5 Аппаратные сообщения
- •1.6.6 Символьные сообщения
- •П. 1.7 Таймеры Windows и служба времени.
- •П. 1.8 Классы окон
- •1.8.1. Описание используемых классом окон ресурсов
- •1.8.2. Регистрация класса окон
- •1.8.3. Создание окон
- •1.8.4. Стили окна
- •П. 1.9 Цикл обработки сообщений
- •П. 1.10 Структура текста приложения
- •П. 1.11 Вспомогательные функции создания окон
- •1.11.1 Функции отображения и перерисовки окон
- •1.11.2 Функции поиска и определения состояния окон
- •1.11.3 Функции перемещения окон
- •1.11.4 Сообщения приложения для пользователя
- •П. 1.12 Примеры создания окон
- •П 2. Органы управления
- •П 2.1. Кнопки
- •2.1.1. Создание кнопок
- •2.1.2. Кнопки и сообщения
- •2.1.3. Флажки и переключатели
- •П 2.2. Статический орган управления
- •П 2.3. Полоса прокрутки
- •2.3.1. Общие сведения
- •2.3.2. Создание полосы прокрутки
- •2.3.3. Простейшие полосы прокрутки
- •2.3.4. Сообщения от полосы прокрутки
- •2.3.5. Управление полосой прокрутки
- •П 2.4 Редактор текста
- •2.4.1. Создание редактора
- •2.4.2. Сообщения для редактора текста
- •2.4.3. Сообщения от редактора текста
- •П 2.5. Списки строк
- •2.5.1. Создание списка
- •2.5.2. Сообщения от списка
- •2.5.3. Сообщения для списка
- •П. 2.6. Комбинированный список
- •2.6.1. Создание комбинированного списка
- •2.6.2. Коды извещения
- •2.6.3. Сообщения для комбинированного списка
- •П 3. Вывод в окно
- •П. 3.1. Виды контекста отображения
- •П 3.2. Сообщение wm_paint
- •П 3.3. Установка атрибутов контекста отображения для текста
- •П 3.4. Вывод текста
- •3.4.1. Настройка параметров шрифта
- •3.4.2. Выбор шрифта в контекст отображения
- •3.4.3. Функции вывода текста
- •3.4.4. Определение метрик шрифта
- •П 3.5. Рисование геометрических фигур
- •3.5.1 Установка атрибутов контекста отображения для рисования.
- •3.5.1. Функции рисования точки
- •3.5.2. Функции рисования линий
- •3.5.3. Функции рисования замкнутых фигур
- •3.5.4 Функции создания и рисования регионов
- •П. 4 Ресурсы приложения и их использование. П. 4.1 Файл ресурсов.
- •П 4.2 Главное меню
- •П. 4.2.1 Элементы меню
- •П. 4.2.2 Создание меню
- •П. 4.2.3 Сообщения от меню
- •П. 4.3. Плавающее меню
- •П. 4.4. Акселераторы
- •П. 4.5. Панель инструментов
- •4.5.1. Создание панели инструментов
- •4.5.2. Управление состоянием кнопок панели
- •4.5.3. Вывод подсказок в панели инструментов
- •П. 4.6. Строка состояния
- •4.6.1. Создание строки состояния
- •4.6.2. Сообщения о меню в строке состояний
- •П 5. Диалоговые панели п. 5.1. Характеристики диалоговых панелей
- •5.1.1. Единицы диалоговой панели '
- •5.1.2. Стили диалоговой панели
- •5.1.3. Функция окна диалоговой панели
- •П. 5.2. Создание диалоговой панели
- •5.2.1 Создание окна модальной диалоговой панели
- •5.2.2 Создание окна немодальной диалоговой панели
- •П. 5.3 Разработка и компоновка диалоговых панелей.
- •П. 5.4 Сообщения и диалоговые панели
- •П. 5.5. Стандартные диалоговые панели
- •5.5.1. Панели для открытия или сохранения файлов
- •5.5.2. Панель для выбора цветов
- •5.5.3. Панель для выбора шрифта
3.5.1. Функции рисования точки
Функция SetPixel устанавливает заданный цвет в точке с указанными координатами:
COLORREF SetPixel( HDC hdc, int x, int у, COLORREF crColor);
Параметры x и у определяют логические координаты точки, цвет которой будет изменен. Параметр crColor задает цвет окраски точки. В случае успешного выполнения функция возвращает установленное значение цвета. Это значение может отличаться от цвета crColor, если для цвета crColor не найден точно соответствующий цвет. В случае функциональных сбоев функция возвращает значение -1. Сбои могут быть связаны, например, с тем, что указанные координаты выходят за пределы области вывода.
Пример. Следующий оператор "окрашивает" красным цветом точку в начале системы координат (0, 0): SetPixel( hdc, 0, 0, RGB( 255, 0, 0));
Функция GetPixel определяет цвет точки с указанными координатами:
COLORREF GetPixel( HDC hdc, int x, int у );
Параметры x и у указывают логические координаты точки, цвет которой нужно определить. В случае успешного выполнения функция возвращает цвет точки, иначе - CLR_INVALID.
С помощью следующих трех макрокоманд можно определить значения цветовых компонент цвета rgb:
#define GetRValue(rgb) ((BYTE)(rgb))
#define GetGValue(rgb) ((BYTE)(((WORD)(rgb))>>8))
#define GetBValue(rgb) ((BYTE)((rgb)>>16))
3.5.2. Функции рисования линий
При рисовании линий активно используют значение текущей позиции пера. Чтобы узнать текущую позицию пера, вызывают функцию GetCurrentPositionEx:
BOOL GetCurrentPositionEx( HDC hdc, LPPOINT lpPoint);
Параметр lpPoint указывает на структуру типа POINT, в которую будут записаны логические координаты текущей позиции. В случае успешного выполнения функция возвращает ненулевое значение.
Чтобы нарисовать прямуюринию, вызывают функцию LineTo:
BOOL LineTo( HDC hdc, int x, int у);
В случае успешного выполнения функция LineTo рисует прямую линию из текущей позиции до (но не включая ее) точки с координатами (x, у). При этом текущая позиция переносится в точку (x, у), а возвращаемое значение отлично от нуля. Для рисования прямой используются текущие установки пера и, если прерывистая линия, текущие установки кисти фона вывода.
При рисовании прямых линий часто приходится сначала перемещать текущую позицию в начало рисуемой прямой и, только затем, вызывать функцию LineTo. Bo избежание такой "сложности" описывают функцию следующего вида:
BOOL DrawLine( HDC hdc, int xO, int yO, int x, int у)
{ POINTpt;
MoveToEx(hdc,xO,yO,&pt);
return LineTo(hdc, x, у); }
Эта функция рисует прямую, начиная от точки (xO, yO), до точки (x, у) и переносит текущую позицию в точку (x, у). I
Функция Агс рисует дугу эллипса или окружности:
BOOL Arc( HDC hdc, int I, int t, int r, int b, int xO, int yO, int x, int у);
Следующий рисунок истолковывает геометрический смысл параметров функции Arc.
Представим, что эллипс вписан в прямоугольник, левый верхний угол которого определяется координатами (1, t), а правый нижний угол - (r, b). Здесь логические координаты 1 и г отсчитываются по горизонтали, t и b -по вертикали. Тогда воображаемый центр эллипса определяется равенствами xc=(l+r)/2 и yc=(t+b)/2. Начало дуги эллипса определяется пересечением эллипса с воображаемой прямой линией, проведенной из центра эллипса (xc, ус) в точку (xO, yO). Конец дуги определяется аналогично -как пересечение эллипса с воображаемой прямой линией, проведенной из центра эллипса в точку (x, у). Дуга рисуется от начальной точки к конечной, в направлении против ходачасовой стрелки. Если начальная и конечная точки дуги совпадают, то рисуется полный эллипс. Функция Arc игнорирует текущую позицию.
В случае успешного выполнения функция возвращает ненулевое значение.
При вызове функции Arc аргументы 1, t, r и b задают в зависимости от места расположения эллипса, и их выбор обычно не вызывает затруднений. Для выбора значений аргументов xO, yO, x и у удобно эти точки расположить на дуге эллипса и использовать формулы расчета в полярных координатах. Например, координата любой точки (x, у) дуги эллипса на рис. 3.1 определяется по формуле
x=xc+0.5*(r-l)*cos(cp), y=yc-0.5*(b-t)*sin(cp).
Геометрическая интерпретация параметров функции Агс
Здесь ф - угол наклона прямой, проведенной от центра эллипса в точку (x, у). Угол отсчитывают против хода часовой стрелки.
Функция Polyline предназначена для рисования ломаных линий:
BOOL Polyline(HDC hdc, CONST POINT *lppt, int cPoints);
Она соединяет прямыми линиями точки, координаты которых указаны в массиве структур типа РОШТ. Параметр lppt указывает на массив структур POINT, cPoints равен количеству точек в массиве и должен быть больше 1. В случае успешного выполнения функция возвращает ненулевое значение. Функция Polyline игнорирует текущую позицию. Прямые рисуют от точки
первого элемента массива к точке второго элемента и т. д. Если ломаная линия не замкнута, ее последняя точка не рисуется.