关于textout输出不到理想的位置(50分)

  • 主题发起人 主题发起人 dhjs
  • 开始时间 开始时间
D

dhjs

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在image上,把某些固定点用X标示出来,当然是要刚好叉在点上,
如用canvas.textout(5,5,'x'),总是偏移点(5,5),点不能刚好落在点上。
pixels倒是可以刚好捕捉住点,但是不能标示X或*之类的特殊字符。

求救啊 帮帮我吧
 
你可能需要考虑字符的偏移,
canvas.textout(x,y,'x'),x,y是指输出字符左上角坐标.
 
先用TextWidth和TextHeight计算文字需占的宽和高,然后计算textout的参数x、y是多少。
 
微调一下不行?就差一个象素点?改下'x'字体试试。
 
同意zywcd说的要偏移 我偏移过 因为要标示很多点,每次mousedown后偏移的都不一样
 
刚开始学 别见笑 我贴出代码帮忙看看
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Edit1: TEdit;
Button1: TButton;
procedure FormPaint(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
var
x0,y0:integer;
//***********绘制一个边框*****************//
begin
with Image1 do
begin
x0:=round(Image1.ClientWidth);
y0:=round(Image1.ClientHeight);
canvas.pen.Color:=clblack;
canvas.pen.Width:=1;
canvas.MoveTo(0,0);
canvas.MoveTo(5,5);
canvas.LineTo(x0-5,5);
canvas.LineTo(x0-5,y0-5);
canvas.LineTo(5,y0-5);
canvas.LineTo(5,5);
end;
end;

//*******类似栅格,但是随着canvas和k的变化,相应的比例也跟着变*******//
procedure TForm1.Button1Click(Sender: TObject);
var
n,k:integer;

begin
k:=strtoint(form1.edit1.Text);
Form1.Image1.Picture.Bitmap:=nil;
with Image1 do
begin

for n:=1 to k-1 do
begin
canvas.MoveTo(round(5+(width-10)*n/k),5);
canvas.LineTo(round(5+(width-10)*n/k),round(height-5));
canvas.MoveTo(5,round(5+(height-10)*n/k));
canvas.LineTo(round(width-5),round(5+(height-10)*n/k));
end;
end;

end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
A,B:array of array of integer;
i,j,x1,y1,k,min:integer;
begin
k:=strtoint(form1.edit1.Text);
min:=sqr(X-5)+sqr(Y-5);
setlength(a,k+1,k+1);
setlength(b,k+1,k+1);
for i:=0 to k do
for j:=0 to k do
begin
A[i,j]:=5+round((Image1.width/k)*j);
B[i,j]:=5+round((Image1.height/k)*i);
if min>=sqr(X-A[i,j])+sqr(Y-B[i,j]) then
begin
min:=sqr(X-A[i,j])+sqr(Y-B[i,j]);
x1:=A[i,j];
y1:=B[i,j];
end;
end;
Form1.Image1.Canvas.Font.Color :=clRed;
Form1.Image1.Canvas.Brush.Style:=bsClear;
Form1.Image1.Canvas.TextOut(x1,y1,'x');
end;
end.

越靠近canvas的右边mousedown,偏移越大,好像偏移量不是固定的,这到底是怎么回事?
 
你取的字符宽度不对,要用这个函数GetTextExtentPoint32
高度可以用 Font.Height
你去看看Panel控件写Caption的那段代码就会知道,这个问题我以前有遇到过
 
问题已经搞定 谢谢
 
多人接受答案了。
 
后退
顶部