问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

DELPHI如何做像WORD的标尺,水平和垂直的都要,要有刻度.

发布网友 发布时间:2022-05-18 01:20

我来回答

2个回答

热心网友 时间:2023-11-21 13:55

搜一下:DELPHI如何做像WORD的标尺,水平和垂直的都要,要有刻度.

热心网友 时间:2023-11-21 13:55

这个东西需要自己绘制,并不复杂的。我把fastreport裏面现成给给你拷贝出来
声明:
TfrxRulerUnits = (ruCM, ruInches, ruPixels, ruChars);

TfrxRuler = class(TPanel)
private
FOffset: Integer;
FScale: Extended;
FStart: Integer;
FUnits: TfrxRulerUnits;
FPosition: Extended;
FSize: Integer;
procere SetOffset(const Value: Integer);
procere SetScale(const Value: Extended);
procere SetStart(const Value: Integer);
procere SetUnits(const Value: TfrxRulerUnits);
procere SetPosition(const Value: Extended);
procere WMEraseBackground(var Message: TMessage); message WM_ERASEBKGND;
procere SetSize(const Value: Integer);
public
constructor Create(AOwner: TComponent); override;
procere Paint; override;
published
property Offset: Integer read FOffset write SetOffset;
property Scale: Extended read FScale write SetScale;
property Start: Integer read FStart write SetStart;
property Units: TfrxRulerUnits read FUnits write SetUnits default ruPixels;
property Position: Extended read FPosition write SetPosition;
property Size: Integer read FSize write SetSize;
end;

实现:
{ TfrxRuler }

constructor TfrxRuler.Create(AOwner: TComponent);
begin
inherited;
FScale := 1;
DoubleBuffered := True;
end;

procere TfrxRuler.WMEraseBackground(var Message: TMessage);
begin
//
end;

procere TfrxRuler.Paint;
var
fh, oldfh: HFont;
sz: Integer;

function CreateRotatedFont(Font: TFont): HFont;
var
F: TLogFont;
begin
GetObject(Font.Handle, SizeOf(TLogFont), @F);
F.lfEscapement := 90 * 10;
F.lfOrientation := 90 * 10;
Result := CreateFontIndirect(F);
end;

procere Line(x, y, dx, dy: Integer);
begin
Canvas.MoveTo(x, y);
Canvas.LineTo(x + dx, y + dy);
end;

procere DrawLines;
var
i, dx, maxi: Extended;
i1, h, w, w5, w10, maxw, ofs: Integer;
s: String;
begin
with Canvas do
begin
Pen.Color := clBlack;
Brush.Style := bsClear;
w5 := 5;
w10 := 10;
if FUnits = ruCM then
dx := fr01cm * FScale
else if FUnits = ruInches then
dx := fr01in * FScale
else if FUnits = ruChars then
begin
if Align = alLeft then
dx := fr1CharY * FScale / 10 else
dx := fr1CharX * FScale / 10
end
else
begin
dx := FScale;
w5 := 50;
w10 := 100;
end;

if FSize = 0 then
begin
if Align = alLeft then
maxi := Height + FStart else
maxi := Width + FStart;
end
else
maxi := FSize;

if FUnits = ruPixels then
s := IntToStr(FStart + Round(maxi / dx)) else
s := IntToStr((FStart + Round(maxi / dx)) div 10);

maxw := TextWidth(s);
ofs := FOffset - FStart;
if FUnits = ruChars then
begin
if Align = alLeft then
Inc(ofs, Round(fr1CharY * FScale / 2)) else
Inc(ofs, Round(fr1CharX * FScale / 2))
end;

i := 0;
i1 := 0;
while i < maxi do
begin
h := 0;
if i1 = 0 then
h := 0
else if i1 mod w10 = 0 then
h := 6
else if i1 mod w5 = 0 then
h := 4
else if FUnits <> ruPixels then
h := 2;

if (h = 2) and (dx * w10 < 41) then
h := 0;
if (h = 4) and (dx * w10 < 21) then
h := 0;

w := 0;
if h = 6 then
begin
if maxw > dx * w10 * 1.5 then
w := w10 * 4
else if maxw > dx * w10 * 0.7 then
w := w10 * 2
else
w := w10;
end;

if FUnits = ruPixels then
s := IntToStr(i1) else
s := IntToStr(i1 div 10);

if (w <> 0) and (i1 mod w = 0) and (ofs + i >= FOffset) then
if Align = alLeft then
TextOut(Width - TextHeight(s) - 6, ofs + Round(i) + TextWidth(s) div 2 + 1, s) else
TextOut(ofs + Round(i) - TextWidth(s) div 2 + 1, 4, s)
else if (h <> 0) and (ofs + i >= FOffset) then
if Align = alLeft then
Line(3 + (13 - h) div 2, ofs + Round(i), h, 0) else
Line(ofs + Round(i), 3 + (13 - h) div 2, 0, h);

i := i + dx;
Inc(i1);
end;

i := FPosition * dx;
if FUnits <> ruPixels then
i := i * 10;
if ofs + i >= FOffset then
if Align = alLeft then
Line(3, ofs + Round(i), 13, 0) else
Line(ofs + Round(i), 3, 0, 13);
end;
end;

begin
fh := 0; oldfh := 0;
with Canvas do
begin
Brush.Color := clBtnFace;
Brush.Style := bsSolid;
FillRect(Rect(0, 0, Width, Height));
Brush.Color := clWindow;

Font.Name := 'Arial';
Font.Size := 7;
if Align = alLeft then
begin
if FSize = 0 then
sz := Height
else
sz := FSize + FOffset;
FillRect(Rect(3, FOffset, Width - 5, sz));
fh := CreateRotatedFont(Font);
oldfh := SelectObject(Handle, fh);
end
else
begin
if FSize = 0 then
sz := Width
else
sz := FSize + FOffset;
FillRect(Rect(FOffset, 3, sz, Height - 5));
end;
end;

DrawLines;

if Align = alLeft then
begin
SelectObject(Canvas.Handle, oldfh);
DeleteObject(fh);
end;
end;

procere TfrxRuler.SetOffset(const Value: Integer);
begin
FOffset := Value;
Invalidate;
end;

procere TfrxRuler.SetPosition(const Value: Extended);
begin
FPosition := Value;
Invalidate;
end;

procere TfrxRuler.SetScale(const Value: Extended);
begin
FScale := Value;
Invalidate;
end;

procere TfrxRuler.SetStart(const Value: Integer);
begin
FStart := Value;
Invalidate;
end;

procere TfrxRuler.SetUnits(const Value: TfrxRulerUnits);
begin
FUnits := Value;
Invalidate;
end;

procere TfrxRuler.SetSize(const Value: Integer);
begin
FSize := Value;
Invalidate;
end;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
GUND 18寸泰迪熊 毛绒玩具-详细介绍 玩具熊好玩吗 毛绒玩具熊如何清洗保存 毛绒熊好玩吗 毛绒玩具熊好玩在哪里 吉吉熊毛绒玩具的填充物是什么? 合肥十大免费景点排行榜 合肥免门票的景点有哪些 不要门票的地方... ...是1、9、8、7,从笫五个数起,每一个数都是它前面相邻四个数之和的... ...从第五个数开始,每个数都是它前面四个数之和的末位数。 ...第五个数起,每个数字都等于它前面四个数字之和的个位数字,这样一... ...从第五个数起,每个数都等于前面四个数的和是的个位数,这样一直写下 ... ...9,8...从第5个数起,每个数都等于前4个数字之和的个位,在前99个数... 桥式整流会不会在前面串接一个1/4W的100欧金属膜电阻? 为什么手机显示SD卡不能用? 索尼T2和T50到底买哪个啊? 关于hao123.com的问题 《小康中国 餐桌上的革命》免费在线听mp3音频资源,求百度网盘 我的电脑配置是否合理 我是一个服务员现要写工作总结和2015年的工作计划怎么写呀 floating point error 一圆盘绕过盘心且与盘面垂直的光滑固定轴o以角速度w 饭店吧台或者服务员新一年的工作计划 我是自考新闻学的专科毕业生,能参加记者证考吗? 记者证可以自考吗 我是一名高中生,能否自考记者证 自考记者证,需要做哪些准备 我是一个专科生,想自考记者证,请问需要做哪些准备 有什么关于咏雪的诗 咏雪诗十首有哪些呢? 关于咏雪的古诗有哪些? 有哪些常见的咏雪的诗句?? 表示咏雪的诗句有哪些 cad2010申请号09F0 XJ8W QG5R 4Z2P SVGV C785 V5YL DH3Z 求序列号 和 产品密钥 祝福语句送朋友前程似锦 用html和javascript在这个基础上加每添加一行表格的同时,在表格每一行后边有一个编辑,编辑有一个超链接 有德无才指的是什么意思? 有德无才是庸才。是什么意思? “有德无才,不是人才,有才无德,是个祸害”怎样理解这句话 无德有才.有德无才,怎样理解? 有德无才者,其善多为小善,谓之为平庸什么意思 对“有德有才重用,有德无才德”理解 有德无才便是什么 有德无才 有德无才学后用 什么意思 美即面膜用完要洗掉吗 敷完美即补水面膜要洗脸吗 做完美即面膜要洗脸么? 美即面膜做完用洗脸么 敷完美即面膜和眼膜要用清水洗脸吗? 美即祛痘面膜用了之后要洗脸吗 emacs org-mode 中输入 [[link][desc]] 自动转成超链接,怎么输入普通的 [[link][desc]] 字符串 美即面膜的正确使用方法是怎样的?面膜和精华分开的可咋整?