首页 > 编程知识 正文

mfc添加位图资源没有出现,mfc对话框导入位图

时间:2023-05-04 00:44:34 阅读:116791 作者:3652

使用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);}

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。