参考:https://blog.csdn.net/pudongdong/article/details/69396600

之前写过win32动态显示图片的博客(程序线程检测图片变动自动刷新,而非按按钮再刷新的情况),这次用到了mfc。原理是一样的。

OnInitDialog函数初始化

BOOL CXxxDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_bmp.m_hObject != NULL)
m_bmp.DeleteObject();
/*载入图片*/
HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),L"initPic.bmp", IMAGE_BITMAP, , , LR_CREATEDIBSECTION | LR_LOADFROMFILE);
if (hbmp == NULL)
return FALSE;
/*取得加载的BMP的信息*/
m_bmp.Attach(hbmp);
DIBSECTION ds;
BITMAPINFOHEADER &bminfo = ds.dsBmih;
m_bmp.GetObject(sizeof(ds), &ds);
int cx = bminfo.biWidth;
int cy = bminfo.biHeight;
/*得到了图像的宽度和高度后,对图像大小进行适应,即调整控件的大小,让它正好显示一张图片*/
CRect rect;
GetDlgItem(IDC_PIC_ZONE)->GetWindowRect(&rect);
ScreenToClient(&rect);
/*调整大小*/
GetDlgItem(IDC_PIC_ZONE)->MoveWindow(rect.left, rect.top, cx, cy, true);
return TRUE;
}

OnPaint具体画图。

IDC_PIC_ZONE为picture control控件。
void CXxxDlg::OnPaint()
{
if (m_bmp.m_hObject != NULL)
m_bmp.DeleteObject();
/*重新载入图片,因为可能刷新*/
HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), L"initPic.bmp", IMAGE_BITMAP, , , LR_CREATEDIBSECTION | LR_LOADFROMFILE);
if (hbmp == NULL)
return;
/*取得加载的BMP的信息*/
m_bmp.Attach(hbmp);
DIBSECTION ds;
BITMAPINFOHEADER &bminfo = ds.dsBmih;
m_bmp.GetObject(sizeof(ds), &ds);
/*若用此句,得到的是对话框的DC,图片将被绘制在对话框上*/
//CPaintDC dc(this);
/*用此句,得到picture控件的DC,图像将被绘制在控件上 */
CPaintDC dc(GetDlgItem(IDC_PIC_ZONE));
/*若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上*/
// CDC dc;
// dc.m_hDC=::GetDC(NULL);
CRect rcclient;
GetDlgItem(IDC_PIC_ZONE)->GetClientRect(&rcclient);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
memdc.SelectObject(&bitmap);
CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC, );
CDC maskdc;
maskdc.CreateCompatibleDC(&dc);
CBitmap maskbitmap;
maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), , , NULL);
maskdc.SelectObject(&maskbitmap);
maskdc.BitBlt(, , rcclient.Width(), rcclient.Height(), &memdc,
rcclient.left, rcclient.top, SRCCOPY);
CBrush brush;
brush.CreatePatternBrush(&m_bmp);
dc.FillRect(rcclient, &brush);
dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
&memdc, rcclient.left, rcclient.top, SRCPAINT);
brush.DeleteObject();
}

这个程序功能是在设备上按手指后,界面自动刷新指静脉的图片

所以界面的刷新要自己写代码刷新(刷新区域在RECT里设置,不要刷新面积太大,否则整个界面都闪烁):

void CXxDlg::refreshImg()
{
RECT rect;
//idcPicZone.GetWindowRect(&rect);
SetRect(&rect, , , , );
InvalidateRect( &rect, true);
UpdateWindow();
}

注意,要想程序运行到OnPaint方法,需要在BEGIN_MESSAGE_MAP注册ON_WM_PAINT()

效果:


上面程序那样写。是由特定需求决定的:程序检测图片更新后自动刷新图片,而非按了什么按钮产生事件响应。另外,还进行了位图的转化

由于不触发事件,需要自己手动刷新界面

实际上,如果是按按钮就刷新界面的话,写法就简单了:

void CXxDlg::_setPic()
{
CImage image;
CWnd* pWnd = GetDlgItem(IDC_SKIN_SHOW);
CDC* pDC = pWnd->GetDC();
HDC hDC = pDC->m_hDC;
CRect rect_frame;
pWnd->GetClientRect(&rect_frame);
image.Load(L"xxx\\xxx.png");
::SetStretchBltMode(hDC, HALFTONE);
::SetBrushOrgEx(hDC, , , NULL);
image.Draw(hDC, rect_frame);
ReleaseDC(pDC);
image.Destroy();
}

在事件响应函数里加入这样代码就可以刷新图片了(图片是load的路径)

因为有事件响应,界面自动刷新

不过有个问题,如果是想打开程序后,初始界面显示一张图片的话,把上面的代码写在OnInitDialog()函数里是没用效果的

必须要把上面的代码写在OnPaint()里:

void CXxDlg::OnPaint()
{
/*默认显示第一张预览图*/
………………………………
__super::OnPaint();
}

注意要写__super::OnPaint();

否则整个界面就只画这一张图了

mfc动态显示图片的更多相关文章

  1. vs2010 opencv2.4.10 配置过程出现的问题 & mfc打开图片

    配置参考网址: http://blog.csdn.net/zy122121cs/article/details/49180541 无法启动程序,系统找不到指定的文件:原因是程序编译有错误(不是路径之类 ...

  2. MFC绘制图片闪烁详解

    用MFC如何高效地绘图             显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题.     而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案.     MFC的 ...

  3. 基于MFC简单图片裁剪工具

    话说这几天又没干啥正事,看书没效率,游戏也没怎么玩,尼玛时间都去哪儿了! --------------------------------------------------------------- ...

  4. 【OpenCV】【MFC】图片、视频、摄像头输入响应【详细图解】

    记住新建项目后,要配置OpenCV环境!参考链接http://blog.csdn.net/zy122121cs/article/details/49180541 做工程搭建框架什么的,基本的要熟练啊. ...

  5. MFC存储图片到SQL Server数据库

    第一步:建立数据库表,比如:id char,pic image. 第二步:建立MFC单文档应用程序,再添加类CMyRecordset,基类选择CRecordset,导入数据库的刚建立的表. 第三步:在 ...

  6. DB2保存图片并读取动态显示图片

    博文背景: 客户要求结构化图片信息,而不是文件文档话的管理,故要求将图片信息存储于DB2里,出于技术的角度,真不喜欢将文件存储于数据库, 但客户是上帝,木有办法,故有了如下的测试. 测试环境:DB2 ...

  7. opencv与mfc显示图片操作,MFC的鼠标响应在opencv图片上失效,opencv滚轮事件没有响应问题描述解决。

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11588758.html 用mfc 与OPENCV编写成. 出了很多冲突异常事件导致鼠标操作没有 ...

  8. MFC 显示图片

    //定义成员变量 CStatic m_picture; m_picture.Create(L"XXX",WS_VISIBLE|WS_CHILD|SS_BITMAP ,CRect(, ...

  9. MFC切换图片防止闪烁

    处理WM_ERASEBKGND消息,在消息处理函数中return TRUE;

随机推荐

  1. System.nanoTime()和System.currentTimeMillis()性能问题

    ​ 之前给模块做性能优化的时候,需要将性能调到毫秒级,使用了System.nanoTime()和System.currentTimeMillis()对代码分片计时分析耗时操作,后发现在串行情况下性能达 ...

  2. 【t059】序列

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 生活中,大多数事物都是有序的,因为顺序的美是最令人陶醉的.所以现在RCDH看了不顺的东西就头痛.所以他 ...

  3. 从PHP到Node

    花12天时间,断断续续学了PHP和MySQL.学完PHP基础后,本以为很快就能做个中等项目,发现还是不行,可是是学习PHP的时间太短了吧,需要一定强度的练习,学新框架才行.PHP就先放一下吧,就当通过 ...

  4. 【43.75%】【codeforces 688E】The Values You Can Make

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  5. 数据集成工具:Teiid实践

    数据集成是把不同来源.格式.特点性质的数据在逻辑上或物理上有机地集中,从而为企业提供全面的数据共享.数据集成的方式多种多样,这里介绍的 Teiid 是其中的一种:通过抽象和联邦技术,实现分布式数据源的 ...

  6. 西门子与三菱PLC报文比较

    1.西门子和三菱的几个区别(上位只关心的通讯层面):1. 西门子PLC通讯端口固定102,但是可以连接多个PC端(客户端),三菱PLC通讯端口可以自定义,最多好像8个,但是每个端口只能连接一个客户端: ...

  7. Redis实战:如何构建类微博的亿级社交平台

    微博及 Twitter 这两大社交平台都重度依赖 Redis 来承载海量用户访问.本文介绍如何使用 Redis 来设计一个社交系统,以及如何扩展 Redis 让其能够承载上亿用户的访问规模. 虽然单台 ...

  8. MyEclipse参加ibatis DTD文件实现xml自己主动提示功能

    当我们写ibatis当配置文件,希xml自己主动提示. 这就要求我们的加盟DTD档 SqlMapConfig.xml中开头部分有这么一句话 <!DOCTYPE sqlMapConfig PUBL ...

  9. CentOS 由 JavaCPP 转让 FFMPEG

    1. Java 与 FFMPEG FFMPEG 它是一种广泛使用的媒体处理库,于Java天地,处理视频较弱的能力,因此,有非常大的需求需求Java 转让 FFMPEG. Java 转让C 的方式有非常 ...

  10. OpenCV dll 源码调试—附加到进程

    使用CMake可以生成OpenCV源码的解决方案,然后就可以对OpenCV函数进行修改,功能剪切等操作了,对这部分内容感兴趣的可以浏览一下上一篇文章:CMake生成OpenCV解决方案&&am ...