- •5. Программирование в операционной системе windows
- •5.1. Основные концепции Windows
- •Контрольные вопросы
- •5.2. Архитектура, управляемая событиями
- •Контрольные вопросы
- •5.3. Примеры программ.
- •Int winapi WinMain (hinstance hInstance,
- •Int CmdShow)
- •Int winapi WinMain (hinstance hInstance,
- •Int MessageBox (hwnd hWnd, lpctstr lpText, lpctstr lpCaption, uint uType).
- •Int winapi WinMain(hinstance hInstance, hinstance hPrevInstance, lptstr lpCmdLine, int nCmdShow)
- •If (!RegisterClassEx(&wc))
- •If (!hMainWnd)
- •Int nWidth,
- •Int nHeight,
- •Контрольные вопросы
- •5.4. Программирование графики
- •Bool InvalidateRect (hwnd hWnd, const rect* lpRect, bool bErase);
- •Bool InvalidateRgn (hwnd hWnd, hrgn hRgn, bool bErase);
- •Bool ClientToScreen(hwnd hWnd, lpoint lpPoint); bool ScreenToClient(hwnd hWnd, lpoint lpPoint);
- •Контрольные вопросы
- •5.5. Рисование линий, фигур, текста
- •GetCurrentPositionEx (hdc, &pt);
- •Bool Polyline (hdc hdc, const point* lppt, int cPoints);
- •Bool PolylineTo (hdc hdc, const point* lppt, dword cPoints);
- •Bool Arc (hdc hdc, int xLeft, int yTop, int xRight, int yBottom, int xStart, int yStart, int xEnd, int yEnd);
- •SetArcDirection (hdc, ad_clockwise);
- •Bool Rectangle (hdc hdc, int xLeft, int yTop, int xRight int yBottom);
- •Bool Ellipse (hdc hdc, int xLeft, int yTop, int xRight, int yBottom);
- •Bool Polygon (hdc hdc, const point * lpPoints, int nCount);
- •Контрольные вопросы
- •5.6. Средства ввода
- •If (!RegisterClassEx(&wc))
- •X, y, width, height, hParent,
- •If (!hWnd)
Bool InvalidateRect (hwnd hWnd, const rect* lpRect, bool bErase);
Параметры этой функции перечислены в следующем списке:
hWnd – дескриптор окна, у которого изменился обновляемый регион. Если этот параметр равен NULL, то система обновляет и перерисовывает все окна приложения, а также посылает сообщения WM_ERASEBKGND и WM_NCPAINT оконной процедуре до возврата из функции.
lpRect – указатель на структуру типа RECT, содержащую клиентские координаты прямоугольника, который добавляется к обновляемому региону. Если этот параметр имеет значение NULL, то к обновляемому региону добавляется вся клиентская область.
bErase – флаг, определяющий, будет ли стираться фон обновляемого региона. Если этот параметр равен TRUE, то фон стирается, когда вызывается функция BeginPaint. Если указано значение FALSE, то фон остается без изменения.
Последний параметр очень важен. Нужно быть очень внимательным, определяя его значение. Ни в коем случае нельзя передавать значение TRUE, если можно обойтись значением FALSE, т.к. это может оказаться причиной очень неприятного мерцания фона окна. Если же стирание фона все-таки необходимо, следует постараться минимизировать обновляемый регион. Иными словами, если можно ограничить стираемую область некоторым прямоугольником rcUpdate, то в качестве второго параметра следует передавать ссылку на этот прямоугольник, а не значение NULL.
Функция InvalidateRgn имеет следующий прототип:
Bool InvalidateRgn (hwnd hWnd, hrgn hRgn, bool bErase);
В этой функции все параметры, кроме второго, имеют тот же смысл, что и в предыдущей функции. Параметр hRgn содержит дескриптор региона, добавлемого к обновляемому региону. Этот дескриптор можно получить при помощи функций типа CreateRectRgn, CreatePolygonRgn и других функций.
Таким образом, и функция InvalidateRect, и функция InvalidateRgn изменяют обновляемый регион так, что в любом случае он уже не является пустым. Если же обновляемый регион пуст, то система отправляет окну hWnd сообщение WM_PAINT.
5.4.8. Системы координат и преобразования. Экранные, оконные и клиентские координаты.
Система координат для окна базируется на координатной системе дисплея. Основной единицей измерения служит пиксел. Точки на экране задаются парой координат (x, y). При этом x – координаты возрастают слева направо, а y – координаты – сверху вниз. Расположение начала координат зависит от режима отображения.
Позиция окна на экране задается в приложениях в так называемых экранных координатах (screen coordinates), либо в клиентских координатах (client coordinates), для которых началом координат является левый верхний угол экрана. Часто эта позиция описывается структурой типа RECT, содержащей экранные координаты левого верхнего угла и правого нижнего угла окна.
Позиция точки в окне задается либо в оконных координатах (window coordinates), либо в клиентских координатах (client coordinates) (рис. 5.5). Выбор системы координат зависит от используемых функций Windows, поэтому следует обращать внимание на спецификацию системы координат в справочных материалах. Оконные и клиентские координаты гарантируют надлежащее позиционирование точки в окне независимо от положения окна на экране.
Системы координат Windows
Рис. 5.5
Приложения используют координатные системы и геометрические преобразования для масштабирования, вращения, перемещения, сдвига и зеркального отражения графических объектов. Каждая из используемых систем является некоторой разновидностью декартовой прямоугольной системы координат. По практическим соображениям в Windows реализована поддержка четырех координатных систем, функционирующих подобно некоторому конвейеру, по которому движется геометрическая модель, описывающая размеры и местонахождение объектов:
мировая система координат (world space) может использоваться как начальная система координат, обеспечивающая любое преобразование;
страничная система координат (page space) используется или как следующая система координат после мировой системы координат, или как стартовая система, которая поддерживает ограниченные преобразования. В этой системе могут устанавливаться режимы отображения;
система координат устройства (device space) используется после страничной системы. В ней осуществляется только перемещение начала координат, чтобы обеспечить надлежащее положение изображения в физической системе координат;
физическая система координат (physical device space) – последняя система в конвейере геометрических преобразований. Она используется драйвером графического устройства.
Физическая система координат представляет собой матрицу пикселов фиксированной ширины и высоты. Начало координат находится в левом верхнем углу. Ось Х направлена слева направо, а ось Y - сверху вниз. Максимальный размер физического устройства 227227 пикселов.
Для дисплея физические координаты называют также экранными координатами. Экранные координаты обычно используются в операциях управления окнами. Например, функция GetWindowRect возвращает ограничивающий прямоугольник окна в экранных координатах. Также экранные координаты содержатся в параметрах таких сообщений, как WM_NCMOUSEMOVE. Это сообщение генерируется при перемещении курсора мыши в пределах неклиентской части окна.
Следует учитывать, что бывают случаи, когда не все пикселы физической поверхности могут отображаться устройством. Например, для принтеров существуют механические ограничения, не позволяющие печатать у краев страниц. В таких ситуациях приложение должно получить информацию об отображаемой части поверхности при помощи функции GetDeviceCap.
Система координат устройства. Координаты устройства (device coordinates) используются при работе контекстами устройств. В общем случае система координат устройства является подмножеством соответствующей физической системы координат.
Для контекстов устройств, созданных функциями CreateDC, CreateIC и CreateCompatibleDC, система координат устройства идентична физической системе координат.
Для контекстов устройств, связанных с конкретными окнами (то есть возвращаемых функциями GetDC, GetWindowDC и BeginPaint), система коррдинат устройства определяется прямоугольником окна или его клиентской области.
Как и в физической системе координат, левый верхний угол системы координат устройства имеет координаты (0, 0), ось Х направлена слева направо, а ось Y – сверху вниз. Зная дескриптор контекста устройства, можно узнать относительную позицию системы координат устройства в его физических координатах при помощи функции GetDCOrgEx.
В интерактивных графических приложениях, использующих сообщения мыши, для работы с графическими объектами, возникает необходимость преобразования между физическими экранными координатами и координатами устройств (клиентскими координатами). Windows предлагает соответствующие функции для решения этой задачи:
