<= назад к списку работ

Содержание:
1)модуль Wincrt
2)Работа с графическими функциями Windows API


В состав ВР входит модуль WinCRT, с помощью которого создается полноценное Windows—окно с собственной оконной функцией. Все действия по созданию окна выполняются в установочной секции модуля и, следовательно, скрыты от программиста. Таким образом, многие MS-DOS—программы можно практически без переделки перенести в среду Windows: для этого достаточно указать ссылку на WinCRT в предложении Uses. Например, следующая программа выводит график и таблицу значений функции у = sin(x):

Program WinCRT_Demo;

Uses WinCRT;

var

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

NX = 50; {Количество точек по горизонтали} dX = 2*pi/NX; {Шаг табуляции} NY = 10; {Амплитуда графика} begin

ScreenSize.X := 80; {Ширина виртуального экрана} ScreenSize.Y := 60; {Длина экрана} AutoTracking := False;{Запрещаем прокрутку} for k := 0 to NX do begin

{Выводим ось абсцисс:}

GotoXY(k+l,NY) ;

Write(' -') ;

{Выводим точки графика:}

GotoXY(k+1,Round(NY*(1+sin(dX*k))));

Write ('*');

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

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

end.

После ссылки на WinCRT в распоряжение программы предоставляются некоторые из процедур и функций стандартного модуля CRT, рассчитанные на текстовый режим работы. В частности, программа может использовать стандартные процедуры ввода—вывода ReadLn и WriteLn, функции KeyPressed и ReadKey, процедуру GotoXY. Для программы создается специальное окно, размеры и положение которого можно менять. В это окно направляется текстовый вывод программы, причем с помощью стандартных для Windows полос управления по бокам окна можно просмотреть вывод, не умещающийся полностью в пределах окна.

Следует учесть что кодировка символов кириллицы в Windows отличается от широко используемой альтернативной кодировки ДОС, поэтому, если Ваша программа посылает на экран русскоязычные сообщения, в Windows—окне эти сообщения будет невозможно прочитать. Символы кириллицы в Windows используют последние 64 значения кодов: диапазон от 192 до 223 занимают коды заглавных букв от А до Я (без Ё), а диапазон от 224 до 255 — коды строчных буквы от а до я (без ё). Код буквы Ё — 168, а ё - 184.

Для преобразования символов можно использовать такую функцию:

Function OEM_to_ANSI(S: String): String;

var

k: Integer;

begin

for k := 1 to Length(S) do case S[k] of

•A'..'Я': S[k] := chr(ord(S[k])-ord('A')+192) ;

'a'..'!!': S[k] := chr(ord(S[k])-ord('a')+224) ;

•p'..'я': S[k] := chr(ord(S[k])-ord('p')+240) end;

OEM_to_ANSI := S end;

Вставьте в текст предыдущей программы эту функцию, а перед оператором

for k := 0 to NX do добавьте

WriteLn(OEM_to_ANSI('График функции SIN(X)')) ;

чтобы в Windows — окне напечатать заголовок графика.

Переменные модуля WinCRT

WindorfOrg: TPoint

Содержит начало координат виртуального окна. По умолчанию — 0,0.

WindowSize: TPoint

Содержит начальный размер окна.

ScreenSize: TPoint

Содержит размер экрана в символах. Начальное значение:

ScreenSize.X = 80 ScreenSize.Y = 25

Если вывод программы содержит более ScreenSize. У строк, лишние строки будут безвозвратно потеряны, поэтому перед первым выводом на экран следует поместить в это поле подходящее значение (см. пример выше). Точно так же следует настроить ScreenSize,X, если на экран выводятся длинные строки.

Cursor: TPoint

Содержит текущую позицию курсора. Левый верхний угол окна соответствует координатам 0,0. Это поле доступно только для чтения, его значение меняется при обращении к CursorTo или GotoXY.

Origin: TPoint

Содержит координаты левого верхнего угла окна просмотра относительно границ виртуального экрана. Поле доступно только для чтения, его значение меняется при обращении к процедуре ScrolITo.

InactiveTitle: PChar

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

AutoTracking: Boolean

Управляет «прокруткой» содержимого окна: если содержит True, окно автоматически сдвигает свое содержимое при выходе вывода за границы, если False — прокрутка запрещена. В неактивном окне можно использовать управляющие полосы для просмотра вывода даже в том случае, когда AutoTracking = False — окно просмотра меняет свое положение в пределах ScreenSize.

CheckEOF: Boolean

Содержит True, если программа обнаружила конец файла.

CheckBreak: Boolean

Содержит True, если пользователь нажал Ctrl—Break.

WindowTitle: array [0..79] of Char

Содержит заголовок активного окна (т.е. окна в момент работы программы).

Процедуры и функции

Procedure AssignCRT(var F: Text)

Связывает содержимое файловой переменной F с виртуальным экраном.

Procedure CIrEOL

Очищает строку от текущего положения курсора до конца строки.

Procedure CIrScr

Очищает виртуальное окно.

Procedure CursorTo(X,Y: Integer)

Переводит курсор в заданную точку виртуального экрана. Начало отсчета соответствует точке 0,0.

Procedure DoneWinCRT

Уничтожает окно вывода программы. Эта процедура автоматически вызывается при закрытии окна.

Procedure GotoXY(X,Y: Integer)

Переводит курсор в нужную точку окна. Начало отсчета соответствует точке 1,1.

Procedure InitWinCRT

Создает виртуальное окно вывода. Эта процедура автоматически вызывается при первом обращении программы к функциям текстового вывода.

Function KeyPressed: Boolean

Возвращает True, если буфер ввода содержит хотя бы один непрочитанный символ.

Function ReadBuf(Buf: PChar; Count: Word): Word

Читает до Count символов из клавиатуры в память, на которую указывает Buf, и возвращает количество действительно прочитанных символов.

Function ReadKey: Char

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

Procedure ScrollTo(X,Y: Integer)

Смещает содержимое окна так, чтобы его левый верхний угол соответствовал точке X,Y (начало отсчета 0,0).

Procedure TrackCursor

Смещает содержимое окна такг чтобы в нем стал виден курсор.

Function WhereX: Byte

Возвращает текущую абсциссу курсора (начало отсчета 1,1).

Function WhereY: Byte

Возвращает текущую ординату курсора (начало отсчета 1,1).

Procedure WriteBuf(Buf: PChar; Count: Word) Выводит в окно Count символов из буфера Buf.

Procedure WriteChar(Ch: Char)

Выводит в текущую позицию окна символ Ch.

Работа с графическими функциями Windows API

При рисовании в окне WinCrt, как и в любом окне Windows, кроме вы-вода текста можно работать и с графикой. При этом надо получить контекст дисплея по окну операторами типа
MyWin:=FindWindow('TPWinCRT',Pchar(0));
MyDC:=GetDC(MyWin);

и при описании переменных указать
Var MyWin:hWnd; {окно} MyDC:hDC; { контекст устройства }
Наиболее употребимые графические функции Windows приведены в приложении. Принципы рисования отличаются от используемых в DOS – здесь сначала нужно создать и выбрать инструмент рисования, например:
{ создание карандаша }
Pen1:=CreatePen( ps_Dash, 1,RGB(140,170,200));
{ создание одной из кистей }
Brush[1]:=CreateHatchBrush(hs_Vertical,RGB(255,0,0));
SelectObject( MyDC,Brush[1]); { выбор кисти }
Затем производится вызов процедур рисования. По их окончании необхо-димо освобождать контекст устройства процедурой ReleaseDC.
Приведем пример программы, демонстрирующие стадии процесса соз-дания графических образов функциями Windows API.

uses WinCrt, WinTypes, WinProcs;
Var MyWin: hWnd; { окно }
MyDC: hDC; { контекст устройства }
Brush: array[1..3] of hBrush; { кисти }
Pen,Pen1: hPen; { карандаши }
p: array[1..4] of TPoint; { набор координат }
i: integer;
Begin
CmdShow:=sw_ShowMaximized; { установка размера окна }
InitWinCRT; { создание окна CRT }
MyWin:=FindWindow('TPWinCRT',Pchar(0));
MyDC:=GetDC(MyWin);
{ создание карандашей }
Pen:=CreatePen( ps_Solid,4,RGB(0,0,0));
Pen1:=CreatePen( ps_Dash, 1,RGB(140,170,200));
{ создание набора кистей }
Brush[1]:=CreateHatchBrush(hs_Vertical, RGB(255,0,0));
Brush[2]:=CreateHatchBrush(hs_FDiagonal,RGB(0,255,0));
Brush[3]:=GetStockObject(LtGray_Brush);
{ По умолчанию используется карандаш Black_Pen и кисть White_Brush }
SelectObject( MyDC,Brush[1]); { выбор кисти }
Rectangle( MyDC,10,10,100,200); { вывод прямоугольника }
CursorTo(2,10);
Write('прямоугольники'); { Вывод текста средствами WinCrt }
SelectObject( MyDC,Pen); { выбор карандаша }
{ вывод прямоугольника со скругленными углами }
RoundRect( MyDC,110,10,200,200,40,90);
Pen:=GetStockObject(White_Pen); { переназначение карандаша }
SelectObject( MyDC,Pen); { выбор карандаша }
SelectObject( MyDC,Brush[2]); { выбор кисти }
{ вывод эллипса по координатам охватывающего прямоугольника }
Ellipse( MyDC,210,10,300,200);
SelectObject( MyDC,Pen1); { выбор карандаша }
SelectObject( MyDC,Brush[3]); { выбор кисти }
{ вывод фрагмента эллипса }
Chord( MyDC,310,10,400,200,320,10,470,200);
{ Вывод текста средствами GDI }
SetTextColor( MyDC,RGB(90,90,230));
SetBkColor( MyDC,RGB(250,90,90)); TextOut(MyDC,300,210,'Эллипсы',7);
{ вывод сектора эллипса }
Pie( MyDC,410,10,500,200,420,10,570,200);
{генерация координат четырехугольника }
For i:=1 to 4 do begin p[i].X:=510+random(100);
p[i].Y:= 10+random(190) end;
{ Вывод заполненного многогранника }
PolyGon( MyDC,p,4);
ReadKey; ReleaseDC(MyWin,MyDC);
DoneWinCrt; end.