1 说明
在一个窗口中显示一副位图的方法
①创建位图,加载位图
②创建兼容DC
③将位图选到兼容DC
④把位图从兼容DC中拷贝至目的DC
NOTE:窗口绘制有两步:首先擦除(WM_ERASEBKGND)窗口,然后重绘(OnDraw(CDC* pDC)),把上述代码写在第一步里位图的更新显示速度要快一些。
2 实例
①位图按1:1的比例从兼容DC拷贝至目的DC,此时图片不会缩小拉伸,原来多大就是多大。
CDC::BitBlt
BOOL BitBlt(
int x,//目的DC左上角x坐标
int y,//目的DC左上角y坐标
int nWidth,//目的DC宽度
int nHeight, //目的DC高度
CDC *pSrcDC,//源DC指针
int xSrc,//源DC左上角x坐标
int ySrc,//源DC左上角y坐标
DWORD dwRop //拷贝方式
);
eg.
BOOL CMy56View::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
BOOL bRet;
CBitmap bitmap;
bitmap.LoadBitmap(IDB_DESKTOP); //创建/加载位图
CDC dcCompatible; //创建兼容DC
dcCompatible.CreateCompatibleDC(pDC); //选择兼容DC的目的DC
dcCompatible.SelectObject(&bitmap);//将位图选至兼容DC
CRect rect;
GetClientRect(&rect); //取得客户区大小
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY);
bRet = TRUE;
return bRet;
//return CView::OnEraseBkgnd(pDC); //如果不屏蔽此句则返回后不能显示出图片(一闪而过)。
}
②图片可伸缩形式显示
CDC::StretchBlt
BOOL StretchBlt(
int x,//目的DC左上角x坐标
int y,//目的DC左上角y坐标
int nWidth,//目的DC宽度
int nHeight, //目的DC高度
CDC *pSrcDC,//源DC
int xSrc,//源DC左上角x坐标
int ySrc,//源DC左上角y坐标
int nSrcWidth,//源DC宽度
int nSrcHeight, //源DC高度 可由CBitmap类成员函数GetBitmap(BITMAP *bitmap)取得 见下
DWORD dwRop //拷贝模式
);
CBitmap::GetBitmap
int GetBitmap( BITMAP*pBitMap); BITMAP为一个结构体类型
typedef struct tagBITMAP { /* bm */
int bmType;
int bmWidth; //位图宽度
int bmHeight; //位图高度
int bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
LPVOID bmBits;
} BITMAP
eg.
BOOL CMy56View::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
BOOL bRet;
CBitmap bitmap;
bitmap.LoadBitmap(IDB_DESKTOP);
BITMAP bmp; //定义BITMAP结构体
bitmap.GetBitmap(&bmp); //取得宽度高度等信息
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
bRet = TRUE;
return bRet;
//return CView::OnEraseBkgnd(pDC);
}
?