Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Изменить режим координат

01.01.2007
{
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.