![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Изменить режим координатDelphi , Графика и Игры , CanvasАвтор: Xavier Pacheco { Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira } unit MainFrm; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, Menus, DB, DBCGrids, DBTables; type TMainForm = class(TForm) mmMain: TMainMenu; mmiMappingMode: TMenuItem; mmiMM_ISOTROPIC: TMenuItem; mmiMM_ANSITROPIC: TMenuItem; mmiMM_LOENGLISH: TMenuItem; mmiMM_HIINGLISH: TMenuItem; mmiMM_LOMETRIC: TMenuItem; mmiMM_HIMETRIC: TMenuItem; procedure FormCreate(Sender: TObject); procedure mmiMM_ISOTROPICClick(Sender: TObject); procedure mmiMM_ANSITROPICClick(Sender: TObject); procedure mmiMM_LOENGLISHClick(Sender: TObject); procedure mmiMM_HIINGLISHClick(Sender: TObject); procedure mmiMM_LOMETRICClick(Sender: TObject); procedure mmiMM_HIMETRICClick(Sender: TObject); public MappingMode: Integer; procedure ClearCanvas; procedure DrawMapMode(Sender: TObject); end; var MainForm: TMainForm; implementation {$R *.DFM} procedure TMainForm.ClearCanvas; begin with Canvas do begin Brush.Style := bsSolid; Brush.Color := clWhite; FillRect(ClipRect); end; end; procedure TMainForm.DrawMapMode(Sender: TObject); var PrevMapMode: Integer; begin ClearCanvas; Canvas.TextOut(0, 0, (Sender as TMenuItem).Caption); // Set mapping mode to MM_LOENGLISH and save the previous mapping mode PrevMapMode := SetMapMode(Canvas.Handle, MappingMode); try // Set the viewport org to left, bottom SetViewPortOrgEx(Canvas.Handle, 0, ClientHeight, nil); { Draw some shapes to illustrate drawing shapes with different mapping modes specified by MappingMode } Canvas.Rectangle(0, 0, 200, 200); Canvas.Rectangle(200, 200, 400, 400); Canvas.Ellipse(200, 200, 400, 400); Canvas.MoveTo(0, 0); Canvas.LineTo(400, 400); Canvas.MoveTo(0, 200); Canvas.LineTo(200, 0); finally // Restore previous mapping mode SetMapMode(Canvas.Handle, PrevMapMode); end; end; procedure TMainForm.FormCreate(Sender: TObject); begin MappingMode := MM_TEXT; end; procedure TMainForm.mmiMM_ISOTROPICClick(Sender: TObject); var PrevMapMode: Integer; begin ClearCanvas; // Set mapping mode to MM_ISOTROPIC and save the previous mapping mode PrevMapMode := SetMapMode(Canvas.Handle, MM_ISOTROPIC); try // Set the window extent to 500 x 500 SetWindowExtEx(Canvas.Handle, 500, 500, nil); // Set the Viewport extent to the Window's client area SetViewportExtEx(Canvas.Handle, ClientWidth, ClientHeight, nil); // Set the ViewPortOrg to the center of the client area SetViewportOrgEx(Canvas.Handle, ClientWidth div 2, ClientHeight div 2, nil); // Draw a rectangle based on current settings Canvas.Rectangle(0, 0, 250, 250); { Set the viewport extent to a different value, and draw another rectangle. continue to do this three more times so that a rectangle is draw to represent the plane in a four-quadrant square } SetViewportExtEx(Canvas.Handle, ClientWidth, -ClientHeight, nil); Canvas.Rectangle(0, 0, 250, 250); SetViewportExtEx(Canvas.Handle, -ClientWidth, -ClientHeight, nil); Canvas.Rectangle(0, 0, 250, 250); SetViewportExtEx(Canvas.Handle, -ClientWidth, ClientHeight, nil); Canvas.Rectangle(0, 0, 250, 250); // Draw an ellipse in the center of the client area Canvas.Ellipse(-50, -50, 50, 50); finally // Restore the previous mapping mode SetMapMode(Canvas.Handle, PrevMapMode); end; end; procedure TMainForm.mmiMM_ANSITROPICClick(Sender: TObject); var PrevMapMode: Integer; begin ClearCanvas; // Set the mapping mode to MM_ANISOTROPIC and save the previous mapping mode PrevMapMode := SetMapMode(Canvas.Handle, MM_ANISOTROPIC); try // Set the window extent to 500 x 500 SetWindowExtEx(Canvas.Handle, 500, 500, nil); // Set the Viewport extent to that of the Window's client area SetViewportExtEx(Canvas.Handle, ClientWidth, ClientHeight, nil); // Set the ViewPortOrg to the center of the client area SetViewportOrgEx(Canvas.Handle, ClientWidth div 2, ClientHeight div 2, nil); // Draw a rectangle based on current settings Canvas.Rectangle(0, 0, 250, 250); { Set the viewport extent to a different value, and draw another rectangle. continue to do this three more times so that a rectangle is draw to represent the plane in a four-quadrant square } SetViewportExtEx(Canvas.Handle, ClientWidth, -ClientHeight, nil); Canvas.Rectangle(0, 0, 250, 250); SetViewportExtEx(Canvas.Handle, -ClientWidth, -ClientHeight, nil); Canvas.Rectangle(0, 0, 250, 250); SetViewportExtEx(Canvas.Handle, -ClientWidth, ClientHeight, nil); Canvas.Rectangle(0, 0, 250, 250); // Draw an ellipse in the center of the client area Canvas.Ellipse(-50, -50, 50, 50); finally //Restore the previous mapping mode SetMapMode(Canvas.Handle, PrevMapMode); end; end; procedure TMainForm.mmiMM_LOENGLISHClick(Sender: TObject); begin MappingMode := MM_LOENGLISH; DrawMapMode(Sender); end; procedure TMainForm.mmiMM_HIINGLISHClick(Sender: TObject); begin MappingMode := MM_HIENGLISH; DrawMapMode(Sender); end; procedure TMainForm.mmiMM_LOMETRICClick(Sender: TObject); begin MappingMode := MM_LOMETRIC; DrawMapMode(Sender); end; procedure TMainForm.mmiMM_HIMETRICClick(Sender: TObject); begin MappingMode := MM_HIMETRIC; DrawMapMode(Sender); end; end. Программа на Delphi, демонстрирующая изменение режима координат в канвасе графики с помощью различных режимов отображения, предоставляемых Windows API. Основная форма (TMainForm) содержит компонент TMainMenu с несколькими пунктами меню, каждый из которых соответствует другому режиму отображения: MM_TEXT, MM_ISOTROPIC, MM_ANISOTROPIC, MM_LOENGLISH, MM_HIENGLISH, MM_LOMETRIC и MM_HIMETRIC. Процедура FormCreate устанавливает начальную схему отображения в режиме MM_TEXT. Когда пункт меню кликается, соответствующая процедура (например, mmiMM_ISOTROPICClick) изменяет схему отображения с помощью функции SetMapMode и затем рисует некоторые фигуры на канвасе в соответствии с новой схемой отображения. Вот пример того, что каждый режим отображения делает:
Обратите внимание, что каждый режим отображения имеет свои функции и ограничения, поэтому перед использованием их в вашей приложении необходимо понимать, как они работают. Изменение режима координат в программе Delphi для отображения различных типов карт. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |