使用MFC绘制时,不仅仅是绘制单独的线条、圆、正方形等。
还需要显示图像等功能。
要在MFC中显示图像,需要CDC类和CBitmap等类的函数。
下面以加载一张位图为例,在MFC中增加一张位图。
定义1位图对象和CDC绘图设备对象
位图; //定义位图对象CDC m_dc定义绘图设备2将位图资源加载到位图对象中
bitmap.loadbitmap(IDB_bitmap1; //加载位图资源并将位图资源加载到位图对象中在CDC对象上显示位图
void C图Dlg:OnPaint () { CRect rect; 获取客户端(rect; caintDCDC(this; //用于绘制的设备上下文m_DC.createcompatibledc(DC; 与//PDC指定设备兼容的设备上下文存储器m_DC.selectobject(bitmap ); //将位图对象添加到设备上下文中的DC.bitblt (0,0,rect.Width )、rect.Height )、m_dc、0,0,SRCCOPY ); } 4释放CDC类对象
m_dc.DeleteDC (; 释放m_dc的执行结果:
加载一张透明位图
定义1位图对象和CDC绘图设备对象
位图; //定义位图对象CDC m_dc定义绘图设备2将位图资源加载到位图对象中
bitmap.loadbitmap(IDB_bitmap2; //加载位图资源并将位图资源加载到位图对象的OnPaint函数中加载透明位图
void C图Dlg:OnPaint () { CRect rect; 获取客户端(rect; caintDCDC(this; //用于绘制的设备上下文m_DC.createcompatibledc(DC; 与//PDC指定设备兼容的设备上下文存储器m_DC.selectobject(bitmap ); CDC直流图像; //创建临时直流字节映射Bmp; BMP.createcompatiblebitmap(DC,rect.Width ),rect.Height ); DCimage.createcompatibledc(DC; DCimage.selectobject(BMP; cbitmap BMP掩码; //创建临时dcbmpmask.create bitmap (rect.width )、rect.Height )、1,1,NULL; //创建单色蒙版位图CDC dcMask; //掩码DCDCmask.createcompatibledc(DC; DCmask.selectobject(BMPmask; //将加载到位图中的内存DC的位图添加到临时DC的DC image.bitblt (0,0,rect.Width ),rect.Height ),m_dc,0,0,0,src //设置临时DC的透明色DC image.setbkcolor (RGB (0,0,0 ) ); //蒙版DC的透明区域为白色,其他区域为黑色的DC mask.bitblt (0,0,rect.Width ),rect.Height ),dcImage,0,0,SRCCOPY ); //临时直流透明区域为黑色,其他区域为DC image.setbkcolor (RGB (0,0,0 ) ); 直流图像
.SetTextColor(RGB(255, 255, 255)); dcImage.BitBlt(0, 0, rect.Width(), rect.Height(), &dcMask, 0, 0, SRCAND); //目标DC透明部分保持屏幕不变,其他部分变成黑色 dc.SetBkColor(RGB(255, 255, 255)); dc.SetTextColor(RGB(0, 0, 0)); dc.BitBlt(0, 0, rect.Width(), rect.Height(), &dcMask, 0, 0, SRCAND); dc.BitBlt(0, 0, rect.Width(), rect.Height(), &dcImage, 0, 0, SRCPAINT); m_dc.DeleteDC();}4 释放CDC类对象
m_dc.DeleteDC();
原图:
显示透明图:
加载一张动图
1 创建需要用到的CBitmap位图对象加载需要显示的图片(在.h 文件中)
CBitmap bit[8];//定义绘图对象位图数组,用于加载蝴蝶位图2 创建在绘图过程中需要使用的CDC类上下文绘图设备(在.h 文件中)
CDC dc[8];//定义蝴蝶突变设备3 创建定时器和向位图中加载图片(在初始化窗口函数中)
for (int i = 0; i < 8; i++)//加载蝴蝶位图{ bit[i].LoadBitmap(IDB_1+i);} SetTimer(1, 10, NULL);//设计定时器,没10ms触发一次4 在定时器中显示需要显示的图片
void C二级缓存Dlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC cd(this);static int i = 0;if (i > 7){i = 0;}CRect rect;GetClientRect(&rect);dc[i].CreateCompatibleDC(&cd);//产生与pDC指定设备兼容的设备上下文内存dc[i].SelectObject(bit[i]);CDC dcImage;//创建临时DCCBitmap bmp;bmp.CreateCompatibleBitmap(&cd, rect.Width(), rect.Height());dcImage.CreateCompatibleDC(&cd);dcImage.SelectObject(bmp);CBitmap bmpMask;//创建临时DCbmpMask.CreateBitmap(rect.Width(), rect.Height(), 1, 1, NULL);// 创建单色掩码位图CDC dcMask;//掩码DCdcMask.CreateCompatibleDC(&cd);dcMask.SelectObject(bmpMask);//将载入位图的内存DC中的位图,拷贝到临时的DC中dcImage.BitBlt(0, 0, rect.Width(), rect.Height(), &dc[i], 0, 0, SRCCOPY);//设置临时DC的透明色dcImage.SetBkColor(RGB(0, 0, 0));//掩码DC的透明区域为白色其他区域为黑色dcMask.BitBlt(0, 0, rect.Width(), rect.Height(), &dcImage, 0, 0, SRCCOPY);//临时DC透明区域为黑色,其他区域不变dcImage.SetBkColor(RGB(0, 0, 0));dcImage.SetTextColor(RGB(255, 255, 255));dcImage.BitBlt(0, 0, rect.Width(), rect.Height(), &dcMask, 0, 0, SRCAND);//目标DC透明部分保持屏幕不变,其他部分变成黑色cd.SetBkColor(RGB(255, 255, 255));cd.SetTextColor(RGB(0, 0, 0));cd.BitBlt(0, 0, rect.Width(), rect.Height(), &dcMask, 0, 0, SRCAND);cd.BitBlt(0, 0, rect.Width(), rect.Height(), &dcImage, 0, 0, SRCPAINT);dc[i].DeleteDC();i++;CDialogEx::OnTimer(nIDEvent);}