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是不能设置的,惨!!

如果方法比较兴,我可以再加分的。
...全文
543 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
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内的内容。它应该是可以设置的,但是现在我记不起来用哪一个函数了。你查一下帮助,里面应该有的。如果你愿意等的话,我明天可以给你答复。:)

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧