用DrawDib函数组显示bmp和tiff图,为什么在拖动滚动条时严重的“拖尾”呢?
用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




