Содержание:
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.