Изменение начала координат
Операционная система позволяет изменять местоположение точки начала отсчета координат области вывода и окна. Для этого предусмотрены две функции Win32 API. Для установки начала координат области просмотра контекста устройства DC предназначен метод:
functionSetViewportOrgEx(DC : HDC; x, y : Integer; Point : PPoint) : Boolean;
где (x, y) – координаты нового начала координат области просмотра в единицах измерения устройства, а Point – указатель на запись типа TPoint; в эту запись будет сохранено предыдущее значение начала координат. Если эти данные не нужны, синтаксис функции вместо указателя на структуру до276Глава 10. Графическая подсистема пускает передачу пустого указателя nil. В случае успеха функция порадует нас результатом true. Работа метода поясняется в следующем листинге:
procedureTForm1.FormPaint(Sender: TObject);
varDC:hDC;
Begin
DC:=Form1.Canvas.Handle;
SetViewportOrgEx(DC,
Form1.ClientWidth div 2, //точка x - середина клиентской области
Form1.ClientHeight div 2, //точка y - середина клиентской области
nil);
MoveToEx(DC,-100,0,nil); LineTo(DC,100,0); //рисуем ось x из точки -100 в 100
MoveToEx(DC,0,-100,nil); LineTo(DC,0,100); //рисуем ось y из точки -100 в 100
TextOut(DC,1,1,PChar('0,0'),3); //подпись начала координат
end;
В примере начало координат переносится в точку, находящуюся точно посередине клиентской области формы. Координаты новой точки выясняются при помощи элементарных операций деления ширины и высоты клиентской области формы на 2. После переноса начала координат в новое место мы рисуем две линии, соответствующие новым координатным осям X и Y. Затем чуть ниже точки начала координат выводим подпись «0,0». Результаты нашей деятельности наглядно представлены на рис. 10.13. Точно такой же результат может быть получен с помощью функции SetWindowOrgEx():
functionSetWindowOrgEx(DC : HDC; x, y : Integer; Point : PPoint) : Boolean;
Основное отличие этого метода от рассмотренного ранее SetViewportOrgEx() состоит в том, что здесь аргументы (x, y) задаются в логических координатах. Таким образом, метод позволяет манипулировать удобными единицами измерения. В следующем листинге за единицу измерения принята 0,1 мм:
procedureTForm1.FormPaint(Sender: TObject);
varDC:hDC;
Begin
DC:=Form1.Canvas.Handle;
SetMapMode(DC,MM_LOMETRIC); //шаг режима 0.1 мм
SetViewportOrgEx(DC, 10, 10, Nil); //перенос точки
MoveToEx(DC,-90,0,Nil); LineTo(DC,1000,0);
MoveToEx(DC,0,-1000,Nil); LineTo(DC,0,90);
TextOut(DC,5,-5,PChar('0,0'),3);
end;
Теперь начало координат перенесено в точку, отстоящую на 10 мм от верхнего левого угла клиентской области формы (рис. 10.14). Настала очередь рассказать о функциях, информирующих программиста о положении начала координат:
functionGetViewportOrgEx(DC : HDC; Point : PPoint) : Boolean;
functionGetWindowOrgEx(DC : HDC; Point : PPoint) : Boolean;
Оба метода из контекста DC берут информацию о координатах начала области вывода и помещают данные в структуру типа TPoint. Первый метод возвращает значение в координатах устройства, второй – в логических координатах.
Дата добавления: 2016-03-15; просмотров: 814;