Hi,
you should set DotPerUnit to the DPI value, for inches, DPI/2.54 for centimeters and so on.
z := ImageEnView1.Zoom / 100;
if pixels? then
m_dpi := 1
else if inchies? then
m_dpi := ImageEnView1.IO.Params.Dpi
else if centimeters? then
m_dpi := ImageEnView1.IO.Params.Dpi / 2.54
...etc...
HorizRuler.ViewPos := ImageEnView1.ViewX / z / m_dpi;
VertRuler.ViewPos := ImageEnView1.ViewY / z / m_dpi;
HorizRuler.DotPerUnit := z * m_dpi;
VertRuler.DotPerUnit := z * m_dpi;
Here is the Others/RulerBox example modified (Pixels1, Inches1 and Centimeters1 are menu items to select the measure unit):
unit umain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ieview, imageenview, rulerbox, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
VertRuler: TRulerBox;
ImageEnView1: TImageEnView;
MainMenu1: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
StatusBar1: TStatusBar;
Panel1: TPanel;
HorizRuler: TRulerBox;
Panel2: TPanel;
View1: TMenuItem;
Center1: TMenuItem;
Units1: TMenuItem;
Pixels1: TMenuItem;
Inches1: TMenuItem;
Centimeters1: TMenuItem;
procedure Exit1Click(Sender: TObject);
procedure Open1Click(Sender: TObject);
procedure ImageEnView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure ImageEnView1ViewChange(Sender: TObject; Change: Integer);
procedure Center1Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure OnSelectUnits(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
m_dpi: double;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{$R WindowsXP.RES}
procedure TForm1.FormCreate(Sender: TObject);
begin
m_dpi := 1; // pixels
end;
// File | Exit
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;
// File | Open
procedure TForm1.Open1Click(Sender: TObject);
begin
with ImageEnView1.IO do
LoadFromFile( ExecuteOpenDialog('','',false,1,'') );
FormResize(self);
end;
// mouse move
procedure TForm1.ImageEnView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
HorizRuler.GripsPos[0] := ImageEnView1.XScr2Bmp( X );
VertRuler.GripsPos[0] := ImageEnView1.YScr2Bmp( Y );
end;
// scroll or zoom
procedure TForm1.ImageEnView1ViewChange(Sender: TObject; Change: Integer);
var
z: double;
begin
z := ImageEnView1.Zoom / 100;
HorizRuler.ViewPos := ImageEnView1.ViewX / z / m_dpi;
VertRuler.ViewPos := ImageEnView1.ViewY / z / m_dpi;
HorizRuler.DotPerUnit := z * m_dpi;
VertRuler.DotPerUnit := z * m_dpi;
HorizRuler.Frequency := 10 / HorizRuler.DotPerUnit;
VertRuler.Frequency := 10 / VertRuler.DotPerUnit;
HorizRuler.LabelFreq := 100 / HorizRuler.DotPerUnit;
VertRuler.LabelFreq := 100 / VertRuler.DotPerUnit;
StatusBar1.SimpleText := 'Zoom ' + FloatToStr( ImageEnView1.Zoom ) + '%';
if Change = 1 then
FormResize(self);
end;
// View -> Center
procedure TForm1.Center1Click(Sender: TObject);
begin
ImageEnView1.Center := Center1.Checked;
FormResize(self);
end;
// Form resize, adjust rulers offsets
procedure TForm1.FormResize(Sender: TObject);
begin
HorizRuler.OffsetX := ImageEnView1.OffsetX;
VertRuler.OffsetY := ImageEnView1.OffsetY;
end;
procedure TForm1.OnSelectUnits(Sender: TObject);
begin
if Sender = Pixels1 then
m_dpi := 1
else if Sender = Inches1 then
m_dpi := ImageEnView1.IO.Params.Dpi
else if Sender = Centimeters1 then
m_dpi := ImageEnView1.IO.Params.Dpi / 2.54;
ImageEnView1ViewChange(self, 1);
end;
end.