TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

10.2.3. Модификация WinCrt для использования графики Windows

Хотя стандартный модуль WinCRT и создает нормальное Windows — окно, воспользоваться дескриптором этого окна и, следовательно, получить с его помощью доступ к графическим возможностям Windows невозможно, т.к. этот параметр «спрятан» в раздел Implementation. Поскольку в поставку ВР входит исходный текст модуля, можно модифицировать этот текст — перенести параметр CrtWindow, хранящий дескриптор окна, в раздел Interface. Следует учесть, что простая перекомпиляция измененного текста модуля не даст желаемого результата, т.к. его rPW—файл1 включен в основную библиотеку System и загружается из нее автоматически при ссылке на модуль WinCRT. Наиболее простым выходом из положения является переименование модуля и ссылка на его измененное имя в основной программе. Например:

Unit Win_Crt;

{$S-} interface uses WinTypes, WinProcs, WinDos;

const

CrtWindow: HWnd 3S 0; {Дескриптор окна}

implementation

• • • • •

end.

Следующая программа создает окно, показанное на рис. 10.1. В этой программе график функции у = sin(x) (см. программу WinCRT_Demo в п. 10.2) строится с использованием графических средств Windows.

Uses Win_CRT, WinProcs, WinTypes, Strings;

var

k:.Integer; {Параметр цикла}

DC: hDC;

R: TRect;

01dFont,Font: hFont;

LogFont: TLogFont;

const

1 В файлах с таким расширением хранятся результаты компиляции модулей, расчитанных на работу под управлением Windows

NX = 50; {Количество точек по горизонтали}

dt = 2*pi/NX; {Шаг табуляции}

МахХ = 300; {Горизонтальный размер графика}

MaxY = 100; {Амплитуда графика}

dx = МахХ div NX; {Горизонтальный шаг графика}

dd = 20; {Поле по краям графика}

h02451.jpg

________________________________________.....- -"•г

r.'jll^n^nn^I^^

Puc.JOJ.

begin

ScreenSize.X := 80; {Ширина виртуального экрана} ScreenSize.Y := 60; {Длина экрана} AutoTracking :== False; {Запрещаем прокрутку} InitWinCrt; {Создаем окно} DC := GetDC(CrtWindow); {Получаем его контекст} {Выводим светлосерый прямоугольник для фона графика} R.Left := 0;

R.Top := 0;

R.Right := MaxX+3*dd;

R.Bottom := 2*MaxY+3*dd;

FillRect(DC,R,GetStockObject(LtGray_Brush)) ;

{Вычерчиваем оси} MoveTo(DC,dd,dd) ;

LineTo(DC,dd,2*(MaxY+dd)) ;

MoveTo(DC,dd,MaxY+dd) ;

LineTo(DC,MaxX+2*dd,MaxY+dd) ;

{Готовим шрифт для надписи} FillChar(LogFont,SizeOf(LogFont) ,0);

with LogFont do

begin

IfHeight := 20; {Высота букв} If Italic := 1; {Наклоннный шрифт} • IfUnderline :== 1; {Подчеркнутый шрифт} ifWeight := fw Bold; {Жирный шрифт} StrCopy(lfFaceName,'Arial Cyr') {Имя шрифта} end;

Font := CreateFontIndirect(LogPont); {Создаем шрифт} OldFont := SelectObject(DC,Font); {Вставляем его в

контекст окна} . SetBkMode(DC,Transparent); {Отключаем изменение

фона надписи} {Выводим надпись} DrawText(DC,'График синуса',13,R,dt_Center);

SelectObject(DC,OldFont); {Восстанавливаем контекст} DeleteObject(Font); {Уничтожаем шрифт} {Цикл построения графика и вывода таблицы значений} for k := 0 to NX do begin

{Выводим точки графика:} LineTo(DC,k*dx+dd,Round(MaxY*(1-sin(dt*k)))+dd) ;

{Формируем таблицу значений:} GotoXY(NX+5,k+l) ;

Write(dt*k:4:2,sin(dt*k):8:2) end;

ReleaseDC(CrtWindow,DC) {Освобождаем контекст} end.

Сначала несколько пояснений. Обычно Windows—окно создается в момент первого обращения программы к процедуре вывода Write/WriteLn. До этого момента окно не создано и его дескриптор недействителен. Поскольку программа вначале выводит серый фоновый прямоугольник и оси графика, ей понадобится дескриптор окна, поэтому она обращается к процедуре InitWinCrt для «досрочного» создания окна. Далее, графический вывод в Windows реализуется с помощью так называемого контекста графического устройства. Программа обращается к API— функции GetDC, чтобы Windows создала контекст окна. Стандартный контекст включает три чертежных инструмента: кисть, перо и шрифт. Кисть предназначена для закрашивания больших поверхностей, перо — для вычерчивания фигур, а шрифт — для вывода надписей.

Для вывода светлосерого прямоугольника программа обращается к Ар/функции FilIRect, передавая ей три параметра: контекст устройства, размеры прямоугольника и светло-серую кисть. Размеры прямоугольника задаются переменной R в виде координат левого верхнего и правого нижнего углов прямоугольника. Координаты указываются в пикселах экрана и отсчитываются от левого верхнего угла рабочей области окна. Чтобы указать светло-серую кисть, вызывается функция GetStockObject с

параметром LtGray_Bmsh. В стандартный контекст входят также черная, белая и темно — серая кисти.

Вывод осей графика и самого графика осуществляется с помощью пера и двух АРУ—функций: MoveTo и LineTo. Первая перемещает перо в заданное положение на контексте устройства, вторая вычерчивает линию от текущего положения пера к указанной точке и оставляет перо в этой точ — ке. Стандартный контекст оснащен пером, вычерчивающим черные линии толщиной в 1 пиксел. Если бы программе понадобилось другое перо, она должна была бы предварительно его создать и включить в контекст, а после использования — удалить его из контекста и уничтожить.

Именно такие действия осуществляются при выводе заголовка графика. Сначала создается новый шрифт (стандартный шрифт контекста практически не отличается от обычного системного шрифта). Для этого переменная LogFont, содержащая описание шрифта, вначале заполняется нулями, после чего в нее помещаются признаки утолщенного, наклонного и подчеркнутого шрифта, его высота и имя. Описав нужный шрифт, программа обращается к функции CreateFontIndirect, чтобы Windows по этому описанию создала шрифт и вернула его дескриптор, который запоминается в переменной Font. После этого обращением к SeIectObject в контекст окна вместо стандартного шрифта вставляется новый, причем дескриптор старого шрифта запоминается в переменной OldFont. Теперь все готово для вывода надписи. После обращения к SetBkMode (этот вызов необходим для отключения прорисовки фона букв) вызывается функция DrawText, которой передается подготовленный контекст, текст надписи, длина текста, охватывающий прямоугольник (переменная R) и признак центрирования надписи по горизонтали. По завершению вывода в контекст вставляется стандартный инструмент, а ненужный более шрифт уничтожается.

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

Полученный таким способом график крайне недолговечен: стоит изменить размеры окна или сделать его прокрутку, как он тут же бесследно исчезнет. Осуществив более глубокую модификацию модуля WinCRT, графику можно придать необходимую «прочность». Я мог бы описать необходимые изменения, но... может быть лучше заняться серьезным изучением Windows?

 Глава 10

Оглавление

 

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz