• 全部
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

delphi中image.Canvas的ClipRect区域如何改变呢?!

along3000 2002-04-30 12:06:47
Image1: TImage;

Button1效果:
Image1.Width := 100;
Iamge1.Height := 100;
with Image1.Canvas.ClipRect do
Caption := Format('%d, %d, %d, %d', [Left, Top, Right, Bottom]);

Button2效果:
Image1.Width := 200;
Iamge1.Height := 200;
with Image1.Canvas.ClipRect do
Caption := Format('%d, %d, %d, %d', [Left, Top, Right, Bottom]);

Button3效果:(welcome.bmp图像的宽高均为300)
Image1.LoadFromFile('c:\test\welcome.bmp');
with Image1.Canvas.ClipRect do
Caption := Format('%d, %d, %d, %d', [Left, Top, Right, Bottom]);

结果呢,Button1、Button2的结果一样,宽高均为100
Button3的结果正常,宽高均为300

问题来了:
我现在不用LoadFromFile方法如何改变Image1.Canvas.ClipRect的宽高呢?!
Button2中ClipRect的宽高均为100,而不是预期的200,这样画图像时就会
部分图像画不上了。

我试着更改Image1的AutoSize、Center、Stretch等属性,没有任何效果。
我在画图时用StretchBlt和BitBlt结合变量bmp(TBitmap类),结果还是
图像只能画出ClipRect中的哪部分,而且ClipRect是不能设置的,惨!!

如果方法比较兴,我可以再加分的。
...全文
340 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
along3000 2002-05-08
感谢帮助,我也通过问别人得到了另一种方法,与大家共享,
就是更改Canvas.Picture的宽高就可以了。
好了,结帐了。
回复
cooldoghuang 2002-05-03
不好意思,今天才给你答案。不过其实楼上已经给出了相关的函数,你找一下那些函数的相关说明,应该可以解决问题了。下面我举一个例子。

在一般情况下,ClipRect是与Canvas的面积的同等大小的。而且它是只读属性,所以不可更改。但是我们可以利用API函数来重新设置ClipRect.如下所示

void __fastcall TForm1::ButtonClick(TObject * Sender)
{
HRGN myRgn;
myRgn = ::CreateRectRgn(100,100,200,200);
::SelectClipRgn(Image1->Canvas->Handle, myRgn);
Ellipse(Image1->Canvas->Handle, 90, 90, 290, 290);
Image1->Invalidate();
::SelectClipRgn(Image1->Canvas->Handle, NULL);
::DeleteObject(myRgn);
}

首先,调用API函数CreateRectRgn定义一个区域。
然后,调用SelectClipRgn把这个区域作为裁剪矩形。SelectClipRgn函数有两个参数:一是DC,这里既是Canvas->Handle,二是所要选择的区域。
紧接着,画一个椭圆,并调用Invalidate方法。此时VCL将读入定义的ClipRect,接着画图。
在第二次调用SelectClipRgn时,把NULL传给他的第二个参数,即恢复原来的裁剪区域。
最后调用DeleteObject来释放此区域。
回复
along3000 2002-04-30
另外,有些人会说:
你在开始时把Image的Width,Height设为足够大,不就行了吗,

这个方法的确有效,但不是我所希望的,因为这样是有潜在问题的。

并且这种方法实际上ClipRect区域还是初始值,并没有被以后的操作改变。
回复
数字蛋糕 2002-04-30
使用Windows的裁剪函数就行了

参见HRGN, CreateRectRgn(这一组还有很多的功能强大的函数), SelectClipRgn, DeleteObject等.

至于ClipRect属性,正如楼上酷狗所说,是系统用来告知程序,窗体的那一部分需要重绘的.当然程序也可以置之不理,但是如果只针对这一区域进行绘制的话,就能够省不少的时间,尤其是当绘制复杂的图形的时候.
回复
wylove 2002-04-30
clipRect跟你要绘的图形有关,图形多大,clipRect自动优化与之相匹配!
所以,你得想别的办法了!
祝节日快乐!
回复
cooldoghuang 2002-04-30
ClipRect的作用是设定Canvas的重画区域。每次重画时,系统只会刷新ClipRect内的内容。它应该是可以设置的,但是现在我记不起来用哪一个函数了。你查一下帮助,里面应该有的。如果你愿意等的话,我明天可以给你答复。:)
回复
发帖
Delphi
创建于2007-08-02

4870

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2002-04-30 12:06
社区公告
暂无公告