过安装字体平滑软件来解决); 4) 在低颜色位数的设备上(如256显示模式)显示高颜色位数的图形(如真彩色)图形失真严重。 三、BMP位图缩放显示 用DrawDib视频函数来显示位图,内存占用少,速度快,而且还可以对图形进行淡化(Dithering)处理。淡化处理是一种图形算法,可以用来在一个支持比图像所用颜色要少的设备上显示彩色图像。BMP位图显示方法如下: 1. 打开视频函数DrawDibOpen(),一般放在在构造函数中 2. 申请内存空间用于存放位图文件 GlobalAlloc(GHND,FileLength); 3. 位图文件读入所申请内存空间中 LoadFileToMemory( mpBitsSrc,mFileName); 4. 在OnPaint等函数中用DrawDibRealize(),DrawDibDraw()显示位图 5. 关闭视频函数DrawDibClose(),一般放在在析构函数中 以上方法的优点是: 1)显示速度快; 2) 内存占用少; 3) 缩放显示时图形失真小,4) 在低颜色位数的设备上显示高颜色位数的图形图形时失真小; 5) 通过直接处理位图数据,可以制作简单动画。 四、CViewBimap类编程要点 1. 在CViewBimap类中添加视频函数等成员 HDRAWDIB m_hDrawDib; // 视频函数HANDLEmhBitsSrc; // 位图文件句柄(内存)LPSTR mpBitsSrc; // 位图文件地址(内存)BITMAPINFOHEADER *mpBitmapInfo; // 位图信息头2. 在CViewBimap类构造函数中添加打开视频函数 m_hDrawDib= DrawDibOpen(); 3. 在CViewBimap类析构函数中添加关闭视频函数 if( m_hDrawDib != NULL){DrawDibClose( m_hDrawDib);m_hDrawDib = NULL;}4. 在CViewBimap类图形显示函数OnPaint中添加GraphicDraw() voidCViewBitmap::OnPaint(){CPaintDC dc(this); // device context for paintingGraphicDraw( );}voidCViewBitmap::GraphicDraw( void ){CClientDC dc(this); // device context for paintingBITMAPFILEHEADER *pBitmapFileHeader;ULONG bfoffBits= 0;CPoint Wid;// 图形文件名有效 (=0 BMP)if( mBitmapFileType < ID_BITMAP_BMP ) return;// 图形文件名有效 (=0 BMP)// 准备显示真彩位图pBitmapFileHeader= (BITMAPFILEHEADER *) mpBitsSrc;bfoffBits= pBitmapFileHeader->bfOffBits;// 使用普通函数显示位图if( m_hDrawDib == NULL || mDispMethod == 0){HBITMAP hBitmap=::CreateDIBitmap(dc.m_hDC,mpBitmapInfo, CBM_INIT, mpBitsSrc+bfoffBits,(LPBITMAPINFO) mpBitmapInfo,DIB_RGB_COLORS); // 建立位图HDC hMemDC=::CreateCompatibleDC(dc.m_hDC);// 建立内存HBITMAP hBitmapOld= SelectBitmap(hMemDC, hBitmap); // 选择对象// 成员CRect mDispR用于指示图形显示区域的大小.// 成员CPoint mPos用于指示图形显示起始位置坐标.if( mPos.x > (mpBitmapInfo- >biWidth - mDispR.Width() ))mPos.x= mpBitmapInfo->biWidth - mDispR.Width() ;if( mPos.y > (mpBitmapInfo- >biHeight- mDispR.Height()))mPos.y= mpBitmapInfo- >biHeight- mDispR.Height();if( mPos.x < 0 ) mPos.x= 0;if( mPos.y < 0 ) mPos.y= 0;if( mFullViewTog == 0){// 显示真彩位图::BitBlt(dc.m_hDC,0,0, mDispR.Width(), mDispR.Height(), hMemDC,mPos.x,mPos.y, SRCCOPY);} else {::StretchBlt(dc.m_hDC,0,0, mDispR.Width(), mDispR.Height(),hMemDC,0,0, mpBitmapInfo- >biWidth, mpBitmapInfo- >biHeight, SRCCOPY);}// 结束显示真彩位图::DeleteObject(SelectObject(hMemDC,hBitmapOld)); // 删 除 位 图} else {// 使用视频函数显示位图if( mPos.x > (mpBitmapInfo- >biWidth - mDispR.Width() ))mPos.x= mpBitmapInfo- >biWidth - mDispR.Width() ;if( mPos.y > (mpBitmapInfo- >biHeight- mDispR.Height()))mPos.y= mpBitmapInfo- >biHeight- mDispR.Height();if( mPos.x < 0 ) mPos.x= 0;if( mPos.y < 0 ) mPos.y= 0;// 显示真彩位图DrawDibRealize( m_hDrawDib, dc.GetSafeHdc(), TRUE);if( mFullViewTog == 0){Wid.x= mDispR.Width();Wid.y= mDispR.Height();// 1:1 显示时, 不能大于图形大小if( Wid.x > mpBitmapInfo- >biWidth ) Wid.x = mpBitmapInfo- >biWidth;if( Wid.y > mpBitmapInfo- >biHeight) Wid.y = mpBitmapInfo- >biHeight;DrawDibDraw( m_hDrawDib, dc.GetSafeHdc(), 0, 0, Wid.x, Wid.y,mpBitmapInfo, (LPVOID) (mpBitsSrc+bfoffBits),mPos.x, mPos.y, Wid.x, Wid.y, DDF_BACKGROUNDPAL);} else {DrawDibDraw( m_hDrawDib, dc.GetSafeHdc(),0, 0, mDispR.Width(), mDispR.Height(),mpBitmapInfo, (LPVOID) (mpBitsSrc+bfoffBits),0, 0, mpBitmapInfo- >biWidth, mpBitmapI