Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Определение возможностей устройств ввода/вывода




В программном интерфейсе Windows имеется функция, позволяющая по контексту устройства определить возможности и параметры драйверов, обслуживающих устройства ввода/вывода:

int GetDeviceCaps (HDC hdc, int iCapability);

· Первый параметр функции задает контекст устройства, для которого необходимо получить информацию о его возможностях (получить контекст устройства можно от функций BeginPaint при обработке сообщения WM_PAINT или GetDC при обработке сообщения, отличного от WM_PAINT). Второй параметр функции GetDeviceCaps определяет параметр устройства, значение которого необходимо получить.

Замечание. Остановимся на некоторых из возможных значений параметров устройства. Значения ASPECTX, ASPECTY, ASPECTXY определяют размеры пиксела. Дело в том, что пикселы не всегда квадратные. Поэтому масштаб изображения по оси x может отличаться от масштаба по оси y. Размеры пиксела позволяют вычислить отношение сторон пиксела и выполнить правильное масштабирование. В этом случае отображаемые окружности будут круглыми, а квадраты - квадратными.

Приведем пример получения информации о соотношение размеров пиксела по осям X и Y при обработке сообщения WM_PAINT в некоторой оконной функции:

case WM_PAINT:

{ PAINTSTRUCT ps;

HDC hDC=BeginPaint(hWnd,&ps); // получение контекста отображения окна hWnd

int asp_xy=GetDeviceCaps(hDC,ASPECTXY);

... // использование asp_xy

EndPaint(hWnd,&ps);

}; return 0;

Определение размера окна

Приложение Windows, как правило, не знает заранее размеров отведенных ему окон. К тому же в любой момент эти размеры можно изменить при помощи мыши. Поэтому приложение Windows должно уметь определять размеры своих окон.

Существует два разных метода определения размера окна.

Первый метод основан на том факте, что при изменении размера окна функция окна получает сообщение WM_SIZE, параметры которого несут с собой информацию о новых размерах. Параметры сообщения WM_SIZE описывают новый размер окна и способ, которым оно изменило размер:

wParam - способ, при помощи которого окно изменило свой размер;

LOWORD(lParam) - новая ширина клиентской части окна;

HIWORD(lParam) - новая высота клиентской части окна.

Параметр wParam может принимать одно из нескольких значений, символические имена которых начинаются с префикса SIZE_ (например, SIZE_MAXIMIZED – окно было максимизировано).

· Обрабатывая сообщение WM_SIZE, функция окна должна сохранить параметры сообщения и послать сама себе сообщение WM_PAINT. Для этого при помощи функции InvalidateRect нужно объявить все окно как недействительное и затем вызвать функцию UpdateWindow. При обработке сообщения WM_PAINT необходимо пользоваться сохраненными значениями новых размеров клиентской части окна.

Второй метод определения размеров окна заключается в вызове функций, возвращающих размеры окна по его идентификатору. Например, функция GetClientRect предназначена для определения координат внутренней области окна (эти координаты вычисляются относительно левого верхнего угла внутренней области окна):

void GetClientRect(HWND hwnd, RECT FAR* lprc);

Приведем фрагменты оконной функции, определяющей размеры клиентской части окна двумя способами и осуществляющей вывод в зависимости от этих размеров:

static h, w;

...

case WM_SIZE:

{ w=LOWORD(lParam); h=HIWORD(lParam);

InvalidateRect(hWnd,NULL);

UpdateWindow(hWnd);

}; return 0;

...

case WM_PAINT:

{ PAINTSTRUCT ps;

HDC hDC=BeginPaint(hWnd,&ps);

// 1-ый способ вывода в соответствии с текущими размерами окна

... // вывод с использованием значений w и h

EndPaint(hWnd,&ps);

}; return 0;

или

...

case WM_PAINT:

{ PAINTSTRUCT ps;

HDC hDC=BeginPaint(hWnd,&ps);

// 2-ой способ вывода в соответствии с текущими размерами окна

Rect r; GetClientRect(hWnd,&r);

... // вывод с использованием значений полей структуры r

EndPaint(hWnd,&ps);

}; return 0;

...

Определение расположения окна

В предыдущем разделе показано, как определять размеры окна. Другая важная задача - определение расположения окна на экране.

При перемещении окна функция окна получает сообщение WM_MOVE, вместе с ним она получает новые координаты внутренней области окна:

wParam - не используется;

LOWORD(lParam) - X-координата верхнего левого угла клиентской части окна;

HIWORD(lParam) - Y-координата верхнего левого угла клиентской части окна.

Замечание. Для окон, имеющих стили WS_OVERLAPPED и WS_POPUP, координаты отсчитываются от верхнего левого угла экрана. Для окон стиля WS_CHILD эти координаты отсчитываются от верхнего левого угла внутренней области родительского окна.

В любой момент времени приложение может также определить расположение и размер окна, вызвав функцию:

void GetWindowRect(HWND hwnd, RECT FAR* lprc);

· Эта функция выдает информацию о расположении и размере прямоугольной области, ограничивающей окно, с учетом заголовка, рамки и полос просмотра. Все координаты отсчитываются от верхнего левого угла экрана.

Метрики текста

Приложения Windows могут выводить текст с использованием различных шрифтов. Прежде всего, следует отметить, что

Все шрифты можно разделить на две группы относительно ширины букв:

· К первой относятся шрифты с фиксированной шириной букв (fixed-pitch font). Все буквы такого шрифта имеют одинаковую ширину.

· Вторая группа шрифтов - шрифты с переменной шириной букв (variable-pitch font). Для таких шрифтов каждая буква имеет свою ширину.

Кроме того,

Шрифты также можно разделить на следующие группы относительно начертания:

· Растровые шрифты (raster font) состоят из отдельных пикселов. Если выполнить масштабирование растрового шрифта в сторону увеличения размера букв, наклонные линии и закругления будут изображаться в виде “лестницы”.

· Контурные шрифты (stroke font) больше подходят для плоттеров. При масштабировании таких шрифтов можно достигнуть лучших результатов, чем при масштабировании растровых. Однако при большом размере букв результат все равно получается неудовлетворительный.

· Масштабируемые шрифты TrueType сохраняют начертание символов при любом изменении размеров, поэтому они используются чаще всего.

В контекст отображения по умолчанию выбран так называемый системный шрифт SYSTEM_FONT. Системный шрифт используется в Windows, например, для текста в заголовках окон, меню и диалоговых панелях.

· Системный шрифт относится к растровым шрифтам с переменной шириной букв.

Переменная ширина букв усложняет задачу вывода текста, но в составе программного интерфейса Windows имеется функция, предназначенная для подсчета длины текстовой строки lpszString длиной cbString

DWORD GetTextExtent(HDC hdc, LPSTR lpszString,int cbString);

Для получения информации о шрифте, выбранном в контекст устройства, предназначена функция:

BOOL GetTextMetrics(HDC hdc, TEXTMETRIC FAR* lptm);

Хорошо спроектированное приложение позволяет пользователю выбирать для отображения текста произвольные шрифты. Поэтому приложение никогда не должно ориентироваться на конкретные размеры шрифта. Вместо этого следует определять эти размеры динамически с помощью специально предназначенных для этого средств.

Управление окнами Windows

Окно в Windows можно определить как прямоугольную область на экране. Однако это определение в своей простоте скрывает множество функциональных возможностей под абстрактной идеей окна как основной единицы взаимодействия пользователя и Windows-приложения.

Окна Windows

Окно – это не только область на экране, посредством которой приложение может представить свой вывод, это еще и адресат событий и сообщений в среде Windows.

· Окно идентифицируется по дескриптору окна. Этот дескриптор (переменная типа HWND) однозначно определяет каждое окно в системе. Список окон содержит очевидные окна приложений и диалоговых панелей, а также менее очевидные, такие, как рабочий стол, пиктограммы или кнопки.

· События пользовательского интерфейса объединяются с дескриптором соответствующего окна, образуя сообщение Windows, и посылаются или помещаются в очередь приложения (точнее, в очередь потока), который владеет этим окном.

Естественно, Win32 API предоставляет множество функций по созданию и управлению окнами.

Иерархия окон

Windows организует свои окна в иерархическую структуру:

· Каждое окно имеет родителя, корнем дерева всех окон является окно рабочего стола, создаваемого Windows при загрузке.

· Для всех окон верхнего уровня (для главных окон приложений и других перекрывающихся и всплывающих окон приложений) родительским окном является рабочий стол.

· Родитель дочернего окна – окно верхнего уровня или другое дочернее окно, более высокого уровня по иерархии.

Между окнами верхнего уровня (перекрывающиеся и всплывающие окна) существует еще одна иерархическая связь. Владельцем окна верхнего уровня может быть другое окно того же уровня. Окно, имеющее владельца, всегда отображается поверх своего владельца и исчезает при минимизации окна-владельца.

· Типичным случаем владения одного окна верхнего уровня другим является приложение, отображающее диалоговое окно. Диалоговое окно не является дочерним окном (оно является всплывающим окном), но его владельцем остается окно приложения.

Рассмотрим несколько наиболее часто употребляемых функций, позволяющих приложению исследовать иерархию окон и находить определенные окна:

· GetDesktopWindow – позволяет приложению получить дескриптор окна рабочего стола.

· FindWindow – используется для поиска окна верхнего уровня по имени его класса окна или по заголовку окна.

· GetParent – идентифицирует родительское окно указанного окна.

· GetWindow – предоставляет наиболее гибкий способ с иерархией окон. В зависимости от значения второго параметра эту функцию можно использовать для получения идентификатора родительского окна, владельца, окон одного уровня или дочерних окон.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...