怎么通过hdc获得CanVas对象的大小(10分)

  • 主题发起人 主题发起人 邹光先
  • 开始时间 开始时间

邹光先

Unregistered / Unconfirmed
GUEST, unregistred user!
比如说Form1.Canvas.然后我用了lCanvas:=form1.canvas来访问form1.canvas,这个时候,为了画图,我想知道form1的大小,以便画坐标,我该怎么做?谢谢!
 
你到底是想知道form的大小还是canvas大小?
针对你的这个问题,只要知道form大小不就可以了??
 
对,就是要知道form的大小,但是不能通过直接访问form来得到,请问怎么办?!
 
或者说,怎么得到lCanvas的拥有者这个对象?
 
那就奇怪了,当你lCanvas:=form1.canvas的时候不就直接访问这个form了吗?

难道是外部程序? 外部程序也不能用lCanvas:=form1.canvas这样的方法牙?
只能lCanvas.handle:=GetDC(外部窗口),即使这样,你也应该能知道"外部窗口"
的大小牙!
 
如果要得到一个外部程序的window大小,可以用
GetWindowRect(windowHandle, myRect);
返回值保存在myRect里面.
 
对于Form来说:
var
I: Integer;
F: TCustomForm;
begin
F := nil;
for I := 0 to Screen.FormCount-1 do
begin
if Screen.Forms.Canvas = lCanvas then
begin
//Screen.Forms就是lCanvas的拥有者
F := Screen.Forms;
Break;
end;
end;
if Assigned(F) then ...
end;
//这是我的想法,不知有没有更好的方法
 
是这样的。我定义了一个类
TRamus=class
private
procedure Draw;
:

public
property canvas:TCanvas read fCanvas write SetCanvas;
End;

procedure TRamus.Draw;
var
lCanvas:TCanvas;
Begin
lCanvas:=fCanvas;
//使用这个类的时候是这样的:
//var ramus:TRamus;
//ramus.canvas:=form1.canvas;
//下面要在canvas上画一个坐标,因此要知道拥有canvas的对象,如form1的大小
//才能在form1上居中画线
//这里我就不知道怎么处理来得到canvas的拥有者这个对象form1了。
End;
请再帮忙!谢谢!
 
cAkk说的没错,再你用lCanvas := form1.Canvas时就已经访问了那个Form对
象。如果是外部程序的话,用cAkk的方法就对了。我刚才没注意到这点,上
面的代码只适用于同一程序内的Form对象。
 
k! 如果仅仅在自己程序里面用,你完全可以用一个^Tform指针随时指向
当前lCanvas的拥有者form.
 
这样的话,你可以试一下我上面写的代码。
 
呵呵,如果按cAkk的办法,要先得到windowhandle,这又怎么做?
 
越看越奇怪:

//使用这个类的时候是这样的:
//var ramus:TRamus;
//ramus.canvas:=form1.canvas;
//下面要在canvas上画一个坐标,因此要知道拥有canvas的对象,
//如form1的大小,才能在form1上居中画线
//这里我就不知道怎么处理来得到canvas的拥有者这个对象form1了。

var ramus:TRamus;
ramus.canvas:=form1.canvas;
紧接着你就使用form1的width,height属性不就可以知道居中的坐标了吗?

奇怪奇怪真奇怪! 难道我还没有理解题意????


 
呵呵,问题是我是在类中TRamus.Draw中来画图的,也就是说这个form1对Tramus
来说是我想让他 们直接关联很小。
不好意思,没说明白!:)
 
procedure TForm1.Button1Click(Sender: TObject);
var
tr:TRect;
begin
tr:=form1.Canvas.ClipRect;
showmessage(inttostr(tr.Right-tr.Left));
showmessage(inttostr(tr.bottom-tr.top));
  
end;
 
呵呵,这样吧! 既然你已经定义成了一个class,那就简单了,你再给你的class
增加一个成员属性,比如叫 OwnerForm, 每次给FCanvas属性赋值的时候,
也就是在你的SetCanvas函数里面,顺便添加一条语句,把OwnerForm也赋值,
让他始终指向你的class的拥有者form,这样在你的draw函数里面就可以直接
使用OwnerForm这个成员属性的东西了(width,height......).

反正你的这个TRamus类看起来挺单薄的,加个成员进去显得酷一点. :-)
 
谢谢大家。希望不嫌分数太少。:)
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部