CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

Canvas->CopyRect 画不出来

楼主asdmusic8(asdmusic8)2001-09-24 16:23:21 在 C++ Builder / 基础类 提问

我的FORM上有   两个IMAGE    
  IMAGE1我已经装载了图片。IMAGE2没有。  
  我用  
    TRect   r1;  
    TRect   r2;  
    Image2->Canvas->CopyMode   =cmSrcCopy;  
    r1   =   Rect(0,   0,   Image1->Width,   Image1->Height);  
    r2   =   Rect(0,   0,   Image2->Width,   Image2->Height);  
    Image2->Canvas->CopyRect(r2,   Image1->Canvas,   r1);  
  Image2上显示出图片。  
  我再用  
    TRect   r2;  
    TPrinter   *prn=Printer();  
    prn->Canvas->CopyMode   =cmSrcCopy;  
    r2   =   Rect(0,   0,   Image2->Width,   Image2->Height);  
    prn->BeginDoc();  
    prn->Canvas->CopyRect(r2,   Image2->Canvas,   r2);  
    prn->EndDoc();  
  没有打印出来。怎么回事。 问题点数:50、回复次数:32Top

1 楼nofeal(无情)回复于 2001-09-24 16:33:47 得分 0

CopyRect()   例子://   好象只支持Bitmap   型。   所以不行。  
   
   
  Graphics::TBitmap   *Bitmap;  
   
  TRect       MyRect,   MyOther;  
   
  MyRect   =   Rect(10,10,100,100);  
   
  MyOther   =   Rect(10,111,100,   201);  
  Bitmap   =   new   Graphics::TBitmap;  
  Bitmap->LoadFromFile("c:\\windows\\tartan.bmp");  
  Form1->Canvas->BrushCopy(MyRect,   Bitmap,   MyRect,   clBlack);  
  Form1->Canvas->CopyRect(MyOther,   Bitmap->Canvas,   MyRect);  
  delete   Bitmap;Top

2 楼asdmusic8(asdmusic8)回复于 2001-09-24 16:47:59 得分 0

我要把IMAGE2打印到打印机。  
  那它为什么能   从IMAGE2   到IMAGE3   而不能到打印机  
    TRect   r1;  
    TRect   r2;  
    Image3->Canvas->CopyMode   =cmSrcCopy;  
    r1   =   Rect(0,   0,   Image2->Width,   Image2->Height);  
    r2   =   Rect(0,   0,   Image3->Width,   Image3->Height);  
    Image3->Canvas->CopyRect(r2,   Image2->Canvas,   r1);  
  Top

3 楼qing3962(有解)回复于 2001-09-24 16:57:19 得分 0

不可能吧??Top

4 楼asdmusic8(asdmusic8)回复于 2001-09-24 17:26:36 得分 0

to   qing3962(一个不回家的人) 你试一下代码很简单。Top

5 楼whyjld(白痴)回复于 2001-09-24 17:35:59 得分 40

伙计,多加两分好吗?  
  这个问题虽然很简单就可以解决,但是我花了整整一天才找到原因,而且我相信很多人都找不到原因。我觉得应该值得多一点。  
   
  Image2->HandleType   =   bmDIBTop

6 楼asdmusic8(asdmusic8)回复于 2001-09-24 17:48:15 得分 0

没有这个属性吗Top

7 楼whyjld(白痴)回复于 2001-09-24 17:50:24 得分 0

什么意思?  
  写错了,你的用一个Graphics::TBitmap作为缓冲区。  
  先创建一个TBitmap,把图象拷到TBitmap内,设好属性,再拷到Printer上Top

8 楼asdmusic8(asdmusic8)回复于 2001-09-24 18:15:06 得分 0

  to     whyjld(白痴)   
   
  还是没有  
    Graphics::TBitmap   *pBitmap   =   new   Graphics::TBitmap();  
    TRect   r1,r2;  
    TPrinter   *prn=Printer();  
   
      pBitmap->Canvas->CopyMode   =cmSrcCopy;  
      pBitmap->HandleType=bmDIB;  
   
    r1   =   Rect(0,   0,   Image1->Width,   Image1->Height);  
    r2   =   Rect(0,   0,   Image1->Width*9,   Image1->Height*9);  
    pBitmap->Canvas->CopyRect(r2,Image1->Canvas,   r1);  
   
    prn->Canvas->CopyMode   =cmSrcCopy;  
    r2   =   Rect(0,   0,pBitmap->Width,   pBitmap->Height);  
   
    prn->BeginDoc();  
    prn->Canvas->CopyRect(r2,pBitmap->Canvas,   r2);  
    prn->EndDoc();  
  delete   pBitmap;Top

9 楼whyjld(白痴)回复于 2001-09-24 18:19:45 得分 0

改的几处,你看看吧。  
  我要下班了,相信没有问题。  
  Graphics::TBitmap   *pBitmap   =   new   Graphics::TBitmap();  
  TRect   r1,r2;  
  TPrinter   *prn=Printer();  
   
  r1   =   Rect(0,   0,   Image1->Width,   Image1->Height);  
  r2   =   Rect(0,   0,   Image1->Width*9,   Image1->Height*9);  
   
  pBitmap->Width   =   Image1->Width   *   9;  
  pbitmap->Height   =   Image1->Height   *   9;  
   
  pBitmap->Canvas->CopyRect(r2,Image1->Canvas,   r1);  
   
  pBitmap->HandleType=bmDIB;  
   
  r2   =   Rect(0,   0,pBitmap->Width,   pBitmap->Height);  
   
  prn->BeginDoc();  
  prn->Canvas->CopyRect(r2,pBitmap->Canvas,   r2);  
  prn->EndDoc();  
  delete   pBitmap;   Top

10 楼asdmusic8(asdmusic8)回复于 2001-09-24 18:22:22 得分 0

除了   Image2->Picture->LoadFromFile("e:\\setup.bmp");   可以改变IMAGE2   的实际尺寸(picture->Width,picture->Height)  
  还有没有其他方法。image2->Width=image2->Width*9   并没有改变实际尺寸当用  
  CopyRect   时还是显示的原来的尺寸空间。Top

11 楼asdmusic8(asdmusic8)回复于 2001-09-24 18:26:25 得分 0

打出来了,但是没有放大Top

12 楼whyjld(白痴)回复于 2001-09-25 08:43:37 得分 0

用这种方法吧  
  Graphics::TBitmap   *pBitmap   =   new   Graphics::TBitmap();  
  TRect   r1,r2;  
  TPrinter   *prn=Printer();  
   
  r1   =   Rect(0,   0,   Image1->Width,   Image1->Height);  
   
  pBitmap->Width   =   Image1->Width;  
  pbitmap->Height   =   Image1->Height;  
   
  pBitmap->Canvas->CopyRect(r1,Image1->Canvas,   r1);  
   
  pBitmap->HandleType=bmDIB;  
   
  r2   =   Rect(0,   0,pBitmap->Width,   pBitmap->Height);  
   
  prn->BeginDoc();  
  prn->Canvas->StretchDraw(r2,   pbitmap);  
  prn->EndDoc();  
  delete   pBitmap;    
  Top

13 楼asdmusic8(asdmusic8)回复于 2001-09-25 09:00:48 得分 0

这个也不能放大。而且如果我取   IMAGE2上的一部分,那我还得要把   pBitmap在拷一次。Top

14 楼asdmusic8(asdmusic8)回复于 2001-09-25 09:02:29 得分 0

我用LoadFromFile   来改变PICTURE的大小后,怎么把PICTURE   设为空。Top

15 楼whyjld(白痴)回复于 2001-09-25 09:12:29 得分 0

只取一部分在第一次从Image1到pBitmap的时候确定一部分就行。  
  另:打印机的分辨率远高于显示器,你乘9以后只要比原大打印大9倍就对了。Top

16 楼wilddragon(东瀛倭族自治州州长)回复于 2001-09-25 10:01:33 得分 0

哈哈Top

17 楼whyjld(白痴)回复于 2001-09-25 10:30:02 得分 0

清除图象  
  Image1->Picture->Assign(NULL);Top

18 楼asdmusic8(asdmusic8)回复于 2001-09-25 10:52:47 得分 0

没有比原大打印大9倍Top

19 楼whyjld(白痴)回复于 2001-09-25 10:54:42 得分 0

乘不乘9都一样?Top

20 楼asdmusic8(asdmusic8)回复于 2001-09-25 10:59:18 得分 0

恩Top

21 楼whyjld(白痴)回复于 2001-09-25 11:14:11 得分 0

你用的代码贴出来看看Top

22 楼asdmusic8(asdmusic8)回复于 2001-09-25 11:28:07 得分 0

就是你给我的Top

23 楼osnew(传输协议)回复于 2001-09-25 11:39:34 得分 0

要先使用GETDC()获得设备的Handle.详细情况,可查看SDK帮助。Top

24 楼Jerfly(飞飞虫)回复于 2001-09-25 12:05:47 得分 0

只需  
  prn->BeginDoc();  
  prn->Canvas->CopyRect(r2,   Image2->Canvas,   r2);  
  prn->Canvas->CopyRect(r2,   Image2->Canvas,   r2);  
  prn->EndDoc();  
  即可.  
  Top

25 楼Wingsun(孙春阳)回复于 2001-09-25 12:23:37 得分 5

我觉得,有一点你要注意的是,你的屏幕尺寸比起打印机的尺寸来说实在是太小了,所以你不能这样写  
  r2   =   Rect(0,   0,   Image2->Width,   Image2->Height);  
  prn->BeginDoc();  
  prn->Canvas->CopyRect(r2,   Image2->Canvas,   r2);  
  prn->EndDoc();  
  我觉得你应该重新改写你的代码,最好你使用StretchDraw来完成你的打印任务。  
  你看看这儿的帖子吧!  
  http://www.csdn.net/expert/TopicView.asp?id=94108Top

26 楼whyjld(白痴)回复于 2001-09-25 12:27:06 得分 0

这句错了  
  r2   =   Rect(0,   0,pBitmap->Width,   pBitmap->Height);  
  应该是  
  r2   =   Rect(0,   0,pBitmap->Width   *   9,   pBitmap->Height   *   9);  
   
  Top

27 楼asdmusic8(asdmusic8)回复于 2001-09-25 13:12:42 得分 0

to   whyjld(白痴)    还是不行Top

28 楼whyjld(白痴)回复于 2001-09-25 13:22:06 得分 0

你用的是2001-9-25   8:43:38的那段?Top

29 楼asdmusic8(asdmusic8)回复于 2001-09-25 13:31:52 得分 0

是Top

30 楼wk_knife(学习ORACLE)回复于 2001-09-25 14:36:18 得分 5

鄙人倒感觉,你的图形不在打印机的打印范围内。  
  Rect的起头别从0开始,从500-1000开始。  
  Top

31 楼hantao(憨豆)回复于 2001-09-25 16:02:58 得分 0

gzTop

32 楼wk_knife(学习ORACLE)回复于 2001-09-26 07:42:18 得分 0

此外,还有个刷子的问题,如果打印机不支持你所设的Brush类型,打印机是不会工作的。Top

相关问题

  • Form1->Canvas->CopyRect(Dest1,Bitmap1->Canvas,Source1); What's meaning???
  • copyrect(rect,canvas,rect)有什么用呢
  • Canvas->Ellipse(100,110,200,210)画圆
  • 请问斜线如何画(用控件,不是用canvas)
  • 没有Canvas就不能画了么?苦恼中…………
  • Canvas上的动画为什么不能正确显示?
  • 如何在Image->Canvas画图时不闪烁???
  • 为什么在GroupBox中用Canvas->Rectangle(...)画不出来?????
  • Canvas中画线的问题!
  • canvas

关键词

  • 打印
  • pbitmap
  • prn
  • copyrect
  • canvas
  • image
  • tbitmap
  • cmsrccopy
  • begindoc
  • rect

得分解答快速导航

  • 帖主:asdmusic8
  • whyjld
  • Wingsun
  • wk_knife

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo