CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

用DrawDib函数组显示bmp和tiff图,为什么在拖动滚动条时严重的“拖尾”呢?

楼主collay()2006-06-01 20:06:22 在 VC/MFC / 基础类 提问

用DrawDib函数组显示bmp和tiff图,为什么在拖动滚动条时严重的“拖尾”呢?  
  可能的原因是什么?  
  大家提示一下! 问题点数:30、回复次数:3Top

1 楼collay()回复于 2006-06-05 10:56:15 得分 0

仅仅是因为每次重绘时都“重绘整个图像”、而没有按照“只重绘当前显示区域”的规则操作么?  
  还是有其他可能的原因?Top

2 楼anothervip(Never ending... ...)回复于 2006-06-05 16:10:19 得分 30

GetClipBox()   并且   重载EraseBackgroundTop

3 楼collay()回复于 2006-06-07 22:59:27 得分 0

下面是我的ScrollView中OnDraw()的代码:  
  void   CImageView::OnDraw(CDC*   pDC)  
  {  
  CDocument*   pDoc   =   GetDocument();  
  //   TODO:   add   draw   code   here  
   
  if(   !m_pPreviewBits   )  
  {  
  return;  
  }  
   
          int             width,   height,   w,   h;  
  CRect         rect;  
          CBitmap     bmp;  
  CDC             memDC;  
  HDRAWDIB   hDrawdib;  
  CBrush       brush(   RGB(   255,   255,   255   )   );  
  CPoint       pt(   0,   0   );    
          BITMAPINFO *pBitmapInfo;  
  int             colors;  
   
  CSize   size=GetTotalSize();  
  rect.SetRect(0,0,size.cx,size.cy);  
  memDC.CreateCompatibleDC(   pDC   );  
  bmp.CreateCompatibleBitmap(   pDC,   rect.Width(),   rect.Height()   );  
  memDC.SelectObject(   &bmp   );  
          memDC.FillRect(   CRect(   0,   0,   rect.Width(),   rect.Height()   ),   &brush   );  
   
  //   图像中要显示区域的高度和宽度  
  width   =   m_bitmapInfoHeader.biWidth;  
  height   =   m_bitmapInfoHeader.biHeight;  
   
  w   =   int   (   width   *   m_fImageZoom   );//乘以放大倍数,这里置为1  
  h   =   int(   height   *   m_fImageZoom   );  
   
  hDrawdib   =   DrawDibOpen();  
   
  //   灰度图时创建调色板  
  if(   m_bitmapInfoHeader.biBitCount   ==   8   )  
  {  
  colors   =   256;  
  }  
  else  
  {  
  colors   =   0;  
  }  
  BYTE     *ptr;  
           
  ptr   =   new   BYTE[   sizeof(BITMAPINFOHEADER)   +   colors   *   sizeof(RGBQUAD)   ];  
  memcpy(   ptr,   &m_bitmapInfoHeader,   sizeof(BITMAPINFOHEADER)   );  
   
  pBitmapInfo   =   (   BITMAPINFO*   )ptr;  
   
   
  if(   m_bitmapInfoHeader.biBitCount   ==   8   )  
  {  
  for(   int   i   =   0;   i   <   256;   i++   )  
  {  
  pBitmapInfo->bmiColors[i].rgbRed=   i;  
  pBitmapInfo->bmiColors[i].rgbGreen   =   i;  
  pBitmapInfo->bmiColors[i].rgbBlue   =   i;  
  pBitmapInfo->bmiColors[i].rgbReserved   =   PC_RESERVED;  
  }  
  }  
   
  //   绘制图像  
  DrawDibBegin(   hDrawdib,   memDC.m_hDC,   rect.Width(),   rect.Height(),    
  (   BITMAPINFOHEADER*   )pBitmapInfo,  
  rect.Width(),   rect.Height(),DDF_SAME_DIB   );  
   
  DrawDibDraw(   hDrawdib,   memDC.m_hDC,   m_ptImageStartPos.x,m_ptImageStartPos.y,   w,   h,    
  (   BITMAPINFOHEADER*   )pBitmapInfo,   m_pPreviewBits,  
  0,   0,   width,   height,   DDF_SAME_DIB   );  
   
  DrawDibClose(   hDrawdib   );  
  delete   ptr;  
   
  //   显示图像  
  pDC->BitBlt(   0,   0,   rect.Width(),   rect.Height(),   &memDC,   0,   0,   SRCCOPY   );  
  }  
  由于图像很大(数百MB),  
  不知道应该怎么改进??Top

相关问题

关键词

得分解答快速导航

  • 帖主:collay
  • anothervip

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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