MFC显示位图和显示透明位图
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显示位图和显示透明位图相关推荐
- 透明位图的显示(TransparentBlt函数)
包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码 ...
- TransparentBlt 透明位图的显示
from : http://www.cnblogs.com/syxchina/archive/2010/06/01/2197688.html 包含透明色的位图的绘制方法有多种,最简单的方法是调用现成 ...
- TransparentBitmap函数设置透明位图的原理分析
1.函数的功能:把一张位图设置成透明,不影响背景图的显示,并可改变大小 2.函数的思想: (1)以当前的hdc创建5个设备兼容dc(HDC):hMem,hSave,hBack,hObject,hTem ...
- vc实现透明位图,透明背景
vc实现透明位图,透明背景 我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并 ...
- 透明位图Ron Gery Microsoft 网络开发技术小组
摘要 这篇文章讨论了在 Microsoft Windows 图形环境中用位图达到透明和屏蔽效果的几种方法,包括通过仿真和使用特殊的驱动器功能.包含其中的一个小样本应用程序 TRANSBLT 详细阐明了 ...
- C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图
背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...
- 如何画透明位图(转)
画透明位图通常的方法是使用遮罩.所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分. 假设图A是 ...
- 多区域显示(8)-透明花边
多区域显示(8)-透明花边 设计要点:页面设计.多窗体.图形.链接 阿金:"理工男"?这么难听,好像讽刺的味道. 秀秀:难听么? 阿金:你还"文艺范"呢,称呼这 ...
- Linux如何在任务栏显示时间,在MFC[转载]在MFC状态栏显示时间 状态栏显示时间
c/c++ vc 在mfc状态栏显示时间,在VC的控件中有个Status bar可以在窗体状态栏中添加日期和时间.其实通过简单的代码,你就能创建一个有时钟显示的状态栏,并且还能设置时钟栏的显示方式.举 ...
- 使用StretchBlt函数实现绘制透明位图
背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...
最新文章
- PAT(甲级)2018年冬季考试 7-3 Vertex Coloring
- linux自动下载ftp文件夹,Linux 下FTP定时执行批量下载文件
- 字符串静态顺序结构C/C++实现(数据结构严蔚敏版)
- 软件测试自学钢琴考级,钢琴考级被音基难倒?不要慌,跟着这款钢琴陪练APP一起练...
- 直方图均衡化为何需要累积概率的通俗解释,保证让你秒懂
- 电脑基础c语言,C语言经验: 如何从零基础学习C语言?
- Google Earth 和MS Virtual Earth:虚拟地球简介
- 华为云发布 GaussDB(DWS) 实时数仓,技术创新释放行业数据价值
- 好久不写日志了,现在开始,好好写了。。
- jQuery中的gt和lt
- 2020-12-08
- 视频格式转换(avi、wmv、flv、mkv、rmvb、rm、3gp转MP4、MP3)边学边开发
- 华为Eudumon1000配置PORTAL认证
- Axure RP 8的用途和使用
- 仿XP画图板—升级版
- 笔记本电脑都有光驱吗?
- 熬夜爆肝整理!史上最硬核的Mysql函数大全,还不收藏?
- android 时间颜色,android修改状态栏时间和日期颜色.docx
- 一 简单句和并列句(2021-10-29)
- Polybuild Tool:Blender自带的重拓扑工具