Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

3.2.12 Не хватает места!

В программе SYSMETS1 проявляется одна очень неприятная проблема: если у вас нет огромного экрана и видеоадаптера с высоким разрешением, вы не сможете увидеть последних строк перечня измерений системы. Если вы сузите окно, то не сможете увидеть даже сами значения.

Программа SYSMETS1 ничего не знает о ширине рабочей области. Программа выводит текст, начиная от верхнего края окна, и заставляет Windows отрезать все, что оказывается вне рамок рабочей области. Это нежелательно.

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

3.2.13 Размер рабочей области

Если вы уже работаете с существующими приложениями для Windows, то обнаружите, что размер окон может меняться в очень широких пределах. Большинство (если предположить отсутствие в окнах меню или полос прокрутки) окон можно развернуть, и рабочая область займет весь экран, за исключением панели заголовка программы. Полный размер этой развернутой рабочей области становится доступным, благодаря функции GetSystemMetrics, использующей параметры SM_CXFULLSCREEN и SM_CYFULLSCREEN. Для дисплея типа VGA возвращаемые значения равны 640 и 461 пикселей. Минимальный размер окна может быть совершенно незначительным, иногда почти невидимым, когда рабочая область фактически исчезает.

Одним из наиболее общих способов определения размера рабочей области окна является обработка сообщения WM_SIZE в оконной процедуре. Windows посылает в оконную процедуру сообщение WM_SIZE при любом изменении размеров окна. Переменная lParam, переданная в оконную процедуру, содержит ширину рабочей области в младшем слове и высоту в старшем слове. Код программы для обработки этого сообщения часто выглядит следующим образом:

static int cxClient, cyClient;

[другие инструкции программы]

case WM_SIZE:

cxClient = LOWORD(lParam);

cyClient = HIWORD(lParam);

return 0;

Макросы LOWORD и HIWORD определяются в заголовочных файлах Windows. Также как cxChar и cyChar, переменные cxClient и cyClient определяются внутри оконной процедуры в качестве статических, так как они используются позднее при обработке других сообщений.

В конечном итоге за сообщением WM_SIZE будет следовать сообщение WM_PAINT. Почему? Потому что при определении класса окна мы следующим образом задали стиль класса:

CS_HREDRAW | CS_VREDRAW

Такой стиль класса указывает Windows на необходимость перерисовки как при горизонтальных изменениях размеров, так и при вертикальных.

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

cyClient / cyChar

Результат может быть равен 0, если высота рабочей области слишком мала для вывода на экран целого символа.

Аналогично, примерное число строчных символов, которые вы сможете горизонтально изобразить в рабочей области равно:

cxClient / cxChar

Если вы определяете cxChar и cyChar при обработке сообщения WM_CREATE, не беспокойтесь о возможном делении на 0 в этом выражении. Ваша оконная процедура получает сообщение WM_CREATE, когда WinMain вызывает CreateWindow. Первое сообщение WM_SIZE приходит несколько позднее, когда WinMain вызывает ShowWindow, благодаря этому cxChar и cyChar всегда являются положительными ненулевыми величинами.

Знание размера рабочей области окна является первым шагом в обеспечении возможности для пользователя двигать текст внутри рабочей области, если рабочая область недостаточно велика, чтобы вместить в себя что-либо целиком. Если вы хорошо знакомы с другими приложениями для Windows, имеющими аналогичные требования, вы, вероятно, знаете, что нам нужно: добавить такие великолепные средства, как полосы прокрутки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]