MFC中绘图的时候,不止是绘制单独的线、圆、正方形等。

还需要显示图片等功能。

MFC中显示图片需要用到CDC类和CBitmap等类中的函数。

下面以加载一张位图为例,在MFC中增加一张位图。

1 定义一个位图对象和CDC绘图设备对象

CBitmap bitmap;//定义位图对象
CDC m_dc;//定义绘图设备

2 给位图对象加载一张位图资源

bitmap.LoadBitmap(IDB_BITMAP1);//加载位图资源,将位图资源加载位图对象中

3 使用CDC对象显示位图

void C绘图Dlg::OnPaint()
{CRect rect;GetClientRect(&rect);CPaintDC dc(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绘图设备对象

CBitmap bitmap;//定义位图对象
CDC m_dc;//定义绘图设备

2 给位图对象加载一张位图资源

bitmap.LoadBitmap(IDB_BITMAP2);//加载位图资源,将位图资源加载位图对象中

3 在OnPaint函数中加载透明位图

void C绘图Dlg::OnPaint()
{CRect rect;GetClientRect(&rect);CPaintDC dc(this); // 用于绘制的设备上下文m_dc.CreateCompatibleDC(&dc);//产生与pDC指定设备兼容的设备上下文内存m_dc.SelectObject(bitmap);CDC dcImage;//创建临时DCCBitmap bmp;bmp.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());dcImage.CreateCompatibleDC(&dc);dcImage.SelectObject(bmp);CBitmap bmpMask;//创建临时DCbmpMask.CreateBitmap(rect.Width(), rect.Height(), 1, 1, NULL);// 创建单色掩码位图CDC dcMask;//掩码DCdcMask.CreateCompatibleDC(&dc);dcMask.SelectObject(bmpMask);//将载入位图的内存DC中的位图,拷贝到临时的DC中dcImage.BitBlt(0, 0, rect.Width(), rect.Height(),  &m_dc, 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透明部分保持屏幕不变,其他部分变成黑色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);
}

MFC显示位图和显示透明位图相关推荐

  1. 透明位图的显示(TransparentBlt函数)

    包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码 ...

  2. TransparentBlt 透明位图的显示

    from :  http://www.cnblogs.com/syxchina/archive/2010/06/01/2197688.html 包含透明色的位图的绘制方法有多种,最简单的方法是调用现成 ...

  3. TransparentBitmap函数设置透明位图的原理分析

    1.函数的功能:把一张位图设置成透明,不影响背景图的显示,并可改变大小 2.函数的思想: (1)以当前的hdc创建5个设备兼容dc(HDC):hMem,hSave,hBack,hObject,hTem ...

  4. vc实现透明位图,透明背景

    vc实现透明位图,透明背景 我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并 ...

  5. 透明位图Ron Gery Microsoft 网络开发技术小组

    摘要 这篇文章讨论了在 Microsoft Windows 图形环境中用位图达到透明和屏蔽效果的几种方法,包括通过仿真和使用特殊的驱动器功能.包含其中的一个小样本应用程序 TRANSBLT 详细阐明了 ...

  6. C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图

    背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...

  7. 如何画透明位图(转)

    画透明位图通常的方法是使用遮罩.所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分. 假设图A是 ...

  8. 多区域显示(8)-透明花边

    多区域显示(8)-透明花边 设计要点:页面设计.多窗体.图形.链接 阿金:"理工男"?这么难听,好像讽刺的味道. 秀秀:难听么? 阿金:你还"文艺范"呢,称呼这 ...

  9. Linux如何在任务栏显示时间,在MFC[转载]在MFC状态栏显示时间 状态栏显示时间

    c/c++ vc 在mfc状态栏显示时间,在VC的控件中有个Status bar可以在窗体状态栏中添加日期和时间.其实通过简单的代码,你就能创建一个有时钟显示的状态栏,并且还能设置时钟栏的显示方式.举 ...

  10. 使用StretchBlt函数实现绘制透明位图

    背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...

最新文章

  1. PAT(甲级)2018年冬季考试 7-3 Vertex Coloring
  2. linux自动下载ftp文件夹,Linux 下FTP定时执行批量下载文件
  3. 字符串静态顺序结构C/C++实现(数据结构严蔚敏版)
  4. 软件测试自学钢琴考级,钢琴考级被音基难倒?不要慌,跟着这款钢琴陪练APP一起练...
  5. 直方图均衡化为何需要累积概率的通俗解释,保证让你秒懂
  6. 电脑基础c语言,C语言经验: 如何从零基础学习C语言?
  7. Google Earth 和MS Virtual Earth:虚拟地球简介
  8. 华为云发布 GaussDB(DWS) 实时数仓,技术创新释放行业数据价值
  9. 好久不写日志了,现在开始,好好写了。。
  10. jQuery中的gt和lt
  11. 2020-12-08
  12. 视频格式转换(avi、wmv、flv、mkv、rmvb、rm、3gp转MP4、MP3)边学边开发
  13. 华为Eudumon1000配置PORTAL认证
  14. Axure RP 8的用途和使用
  15. 仿XP画图板—升级版
  16. 笔记本电脑都有光驱吗?
  17. 熬夜爆肝整理!史上最硬核的Mysql函数大全,还不收藏?
  18. android 时间颜色,android修改状态栏时间和日期颜色.docx
  19. 一 简单句和并列句(2021-10-29)
  20. Polybuild Tool:Blender自带的重拓扑工具

热门文章

  1. 怎么把pdf拆分成一页一页的?
  2. 神经网络搭建六步法扩展
  3. opencv 快速生成scv文件 java
  4. 交换机端口vlan模式
  5. 搭建redhat本地yum仓库,用于离线更新其它主机
  6. 计算机学习路线及java图书参考
  7. 禁用某个程序,试试镜像劫持吧!
  8. oracle怎么将数据删除文件,oracle删除数据文件
  9. vc++6.0 下实现的 立体四子棋 程序 (原型来源于北京科技馆)
  10. SMART原则是什么