函数BOOL Draw( CDC *pDC, bool m_gdi_draw=true,int nX=0, int nY=0, int nWidth=-1, int nHeight=-1 )实现位图显示。为了说明利用GDI函数设计的图像缩放函数优于直接使用StretchDIBits,Draw函数实现了两种图像缩放显示方式,如果m_gdi_draw为true,表示采用GDI设计的缩放函数显示;如果为false,则表示直接使用StretchDIBits显示。参数中的(nX, nY)表示绘制位图的开始位置偏离屏幕左上角的距离,nWidth和nHeight分别表示图像显示的宽度和高度,函数的具体代码如下:
BOOL CMyBitmap::Draw( CDC *pDC, bool m_gdi_draw, int nX, int nY, int nWidth, int nHeight )
{
if( m_PixelBuffer == NULL ) return( FALSE ); //如果没有数据,则不绘制
SetPalette(pDC); //如果是调色板图像,则选择调色板
if( nWidth == -1 ) nWidth = DisplayWidth; //如果不指定大小,则以缩放后的大小进行绘制
if( nHeight == -1 ) nHeight= DisplayHeight;
if (m_gdi_draw==true) //如果选择GDI方式绘制,则利用显示单元进行绘制
StretchDIBits(pDC->m_hDC, nX, nY,nWidth, nHeight,0, 0,DisplayWidth, DisplayHeight,DisplayData,lpbmi, BI_RGB, SRCCOPY );
else //利用原图像数据进行绘制
StretchDIBits(pDC->m_hDC, nX, nY,nWidth,nHeight ,0, 0,m_Width, m_Height,m_PixelBuffer,bInfo, BI_RGB, SRCCOPY );
return TRUE;
}
5 实例设计
利用Visual C++6.0开发工具设计一个基于多文档框架的位图浏览器,实现位图的放大和缩小,以说明缩放函数是有效实用的,具体步骤如下。
5.1 建立多文档框架应用程序 启动VC++后,新建一个“MFC AppWizard(exe)”类型的项目,名为BmpScale。在MFC AppWizard的第一步,选择“Multiple documents”,在最后一步,视图类的类基选择具有滚动条的“CScrollView”。在默认情况下,启动多文档应用程序时将自动新建一个文档,可通过在CBmpScaleApp的InitInstance()函数中加入代码“cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing”将该功能屏蔽,该代码应在ParseCommandLine(cmdInfo)之后。同时,在上述代码后面加入以下程序
|