原理:
创建内存位图对象;
创建内存DC;
将位图对象选入到内存DC,便可以在内存DC中画图;
最后将内存DC中的图拷贝到窗口DC
在BOOL C***Dlg::OnEraseBkgnd(CDC* pDC) 中实现:
CDC MemDC; //定义一个显示设备对象 CBitmap MemBitmap;//定义一个内存位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也可以用自己应该用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图(如果是现成的位图,只要LoadBitmap一下资源就可以直接贴图了) MemDC.MoveTo(……); MemDC.LineTo(……); //将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//还原内存DC原来位图(通常省略)
memDC.SelectObject(pOldBmp); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC();
例如:
//加载图片 CBitmap m_BkGndBmp; m_BkGndBmp.LoadBitmap(IDB_BITMAP3); //获取窗口大小 CRect rcClient; GetClientRect(&rcClient); //获取图片大小 BITMAP bm; m_BkGndBmp.GetBitmap(&bm); //创建内存DC CDC memDC; memDC.CreateCompatibleDC(pDC); //将为图选入DC CBitmap *pOldBmp = memDC.SelectObject(&m_BkGndBmp); //拷贝DC到窗口 pDC->StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); //清理内存 memDC.SelectObject(pOldBmp); memDC.DeleteDC();
位图拷贝函数说明(区别在于StretchBlt()可进行图片拉伸或压缩):
该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。 BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop); 函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。 BOOL StretchBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop);
时间: 2024-10-12 19:33:30