В приложении SCROLL мы создаем в главном окне приложения две полосы просмотра - вертикальную и горизонтальную, указывая соответствующие флаги при вызове функции WinCreateStdWindow. Эти полосы используются для просмотра метрик шрифта с названием Courier (8.5).
8.5. Просмотра метрик шрифта Courier в окне приложения SCROLL
В одной из следующих наших книг, посвященной программированию для операционной системы IBM OS/2 Warp, мы изучим эти метрики. А пока вы можете убедиться, что кроме высоты и ширины символов для описания шрифта используется дополнительно несколько десятков других параметров.
Исходные тексты приложения SCROLL приведены в листинге 8.9.
Листинг 8.9. Файл scroll\scroll.c
// ================================================= // Определения // =================================================
// Флаги для создания окна Frame Window // Добавляем флаги FCF_VERTSCROLL и FCF_HORZSCROLL , // в результате чего в главном окне будут созданы // вертикальная и горизонтальная полосы просмотра ULONG flFrameFlags = FCF_SYSMENU | FCF_TITLEBAR | FCF_MINMAX | FCF_SIZEBORDER | FCF_SHELLPOSITION | FCF_TASKLIST | FCF_ICON | FCF_VERTSCROLL | FCF_HORZSCROLL ;
// Имя класса главного окна CHAR szWndClass[] = "SCRDEMO";
// Начальные координаты для вывода текста cyCurrentPosition = cyClient; cxCurrentPosition = nXScrollPos * cxChar + cxChar;
// Определяем идентификатор окна для // вертикальной полосы просмотра hwndYScroll = WinWindowFromID( WinQueryWindow(hWnd, QW_PARENT), FID_VERTSCROLL),
// Устанавливаем диапазон изменений координат // движка и начальное положение для // вертикальной полосы просмотра WinSendMsg(hwndYScroll, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, YSIZE));
// Выполняем аналогичные действия для // горизонтальной полосы просмотра hwndXScroll = WinWindowFromID( WinQueryWindow(hWnd, QW_PARENT), FID_HORZSCROLL),
// Устанавливаем шрифт, выбранный в пространство // отображения по умолчанию ResetFont(hps);
// Возвращаем пространство отображения WinEndPaint(hps); return 0; }
case WM_ERASEBACKGROUND: return(MRFROMLONG(1L));
// Это сообщение приходит от вертикальной // полосы просмотра case WM_VSCROLL: { // В зависимости от кода извещения // изменяем содержимое переменной, в которой // хранится координата движка switch (SHORT2FROMMP(mp2)) { case SB_LINEDOWN: { nYScrollPos += 1; break; } case SB_LINEUP: { nYScrollPos -= 1; break; } case SB_PAGEDOWN: { nYScrollPos += cyClient / cyChar; break; } case SB_PAGEUP: { nYScrollPos -= cyClient / cyChar; break; } case SB_SLIDERTRACK: { nYScrollPos = SHORT1FROMMP(mp2); break; }
// Это сообщение приходит от горизонтальной // полосы просмотра case WM_HSCROLL: { // В зависимости от кода извещения // изменяем содержимое переменной, в которой // хранится координата движка switch (SHORT2FROMMP(mp2)) { case SB_LINELEFT: { nXScrollPos -= 1; break; } case SB_LINERIGHT: { nXScrollPos += 1; break; } case SB_PAGERIGHT: { nXScrollPos += 10; break; } case SB_PAGELEFT: { nXScrollPos -= 10; break; } case SB_SLIDERTRACK: { nXScrollPos = SHORT1FROMMP(mp2); break; }
// Это сообщение появляется, когда пользователь // нажимает или отжимает клавишу case WM_CHAR: { // Пропускаем только виртуальные клавиши if(!(CHARMSG(&msg) ->fs & KC_VIRTUALKEY)) return 0;
// ================================================= // Выбор шрифта с фиксированной шириной символов // =================================================
// Изменяем текущую позицию для вывода cyCurrentPosition -= cyChar; }
// ================================================= // Вывод в окне значения переменной типа LONG // =================================================
void PrintLong(HPS hps, LONG lValue, PSZ pszName) { int i; CHAR szBuf[80]; POINTL ptl;