WINDOWS程序设计对话框加载显示bmp图像及刷新
参考文章:http://blog.csdn.net/wangjian8006/article/details/7464431
图片的加载与显示也是属于窗口绘制这一部分的。所以其代码要写在消息函数的WM_PAINT消息下。
(这个代码图片路径是写死的,图片不会变,下面会讲该怎么刷新图片)
// 处理对话框消息
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HDC hdcMem;
HBITMAP hbmp; //一张位图的句柄
BITMAP bmp; WCHAR txt[32]; switch (msg)
{
case WM_INITDIALOG:
break;
case WM_PAINT:
hdc = BeginPaint(hdlg,&ps);
hdcMem = CreateCompatibleDC(hdc); hbmp = (HBITMAP)LoadImage(NULL, _T("E:\\Bmp\\Bmp\\2.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetObject(hbmp, sizeof(BITMAP), &bmp); //得到一个位图对象 SelectObject(hdcMem, hbmp);
BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY); //显示位图 DeleteDC(hdcMem);
DeleteObject(hbmp); EndPaint(hdlg,&ps);
break;
case WM_COMMAND:
{
switch(LOWORD(wParam)) {
case IDC_BUTTON1:
NewInitInstance( hInst,g_hwnd, 5);
break;
case IDC_BUTTON2:
MessageBox(hdlg, L"嘿嘿嘿嘿嘿嘿嘿", L"提示", MB_OK | MB_ICONINFORMATION);
break;
default:
break;
}
}
return 0;
}
return (INT_PTR)FALSE;
}
HDC(设备上下文句柄)、PAINTSTRUCT(该结构体包含了某应用程序用来绘制它所拥有的窗口客户区所需要的信息)这些是属于win32绘图必备的,就不多解释了。
如何动态改变图片?LoadImage函数的参数之一为图片路径,将其设置为全局变量WCHAR txt[32]; 理论上改变这个路径值,图片就会改变。 补充:
并不是像我想象的那样WM_PAINT一直自动调用,也是需要触发条件的。
所以当我们要更换图片时候除了像上文那样重新设置路径值,还需要刷新窗口,触发WM_PAINT。
这时就需要UpdateWindow函数。
但UpdateWindow刷新有一个前提条件,那就是需要先设置一个无效区域,之后UpdateWindow就会刷新那个区域。
写法:
RECT rect;
SetRect(&rect, 0, 0, 100, 100);
InvalidateRect(hdlg,&rect,true);
UpdateWindow(hdlg);
上面代码是刷新一个长宽100的方形。大小自行调节了。和图片大小一致。
需要更换图片的时候1要全局变量重新设置路径,2是使用上面代码刷新窗口。
修改代码:
// 处理对话框消息
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HDC hdcMem;
HBITMAP hbmp; //一张位图的句柄
BITMAP bmp; WCHAR txt[32]; //要替换的图片路径
WCHAR *tmp_path = L"E:\\Bmp\\Bmp\\3.bmp"; switch (msg)
{
case WM_INITDIALOG:
break;
case WM_PAINT:
hdc = BeginPaint(hdlg,&ps);
hdcMem = CreateCompatibleDC(hdc); hbmp = (HBITMAP)LoadImage(NULL, pic_path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetObject(hbmp, sizeof(BITMAP), &bmp); //得到一个位图对象 SelectObject(hdcMem, hbmp);
BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY); //显示位图 DeleteDC(hdcMem);
DeleteObject(hbmp);
EndPaint(hdlg,&ps);
break;
case WM_COMMAND:
{
switch(LOWORD(wParam)) {
case IDC_BUTTON1:
//新窗口,演示文本框
NewInitInstance( hInst,g_hwnd, 5);
break;
case IDC_BUTTON2:
//更换图片(路径)
memcpy(pic_path, tmp_path, 32); //局部(图片),刷新重绘
RECT rect;
SetRect(&rect, 0, 0, 500, 300);
InvalidateRect(hdlg,&rect,true);
UpdateWindow(hdlg); break;
default:
break;
}
}
return 0;
}
return (INT_PTR)FALSE;
}
WCHAR pic_path[32];为全局变量,用于存储路径。点击按钮更改路径,并刷新窗口,于是显示新的图片。
运行效果:

该图片为指静脉的位图。 代码已上传github:https://github.com/SonnAdolf/sonne_desktop_graphical_development/tree/master/win32_demo/SonneDemo
WINDOWS程序设计对话框加载显示bmp图像及刷新的更多相关文章
- VC加载显示bmp图片的函数
void ShowBitmap(HDC hdc,const char *srcpath) { HBITMAP hBitmap = (HBITMAP)::LoadImage(0, srcpath, IM ...
- [ActionScript 3.0] AS3.0 动态加载显示内容
可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...
- Microsoft Corporation 去掉 windows 修改 启动加载 版权
windows 修改 开机界面 boot启动界面 windows 修改 启动加载 版权 windows 系统如何修改开机画面的版权文字“Microsoft Corporation ... ◎Micro ...
- 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像
远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_x ...
- html img加载不同大小图像速度
最近要想法提高网页的性能,在查看图片加载时,产生了试验的想法.一直以来都没有太去深究,还是挖掘一下的好. 很简单的试验,<img>加载两个图像,一个2.3MB,5000*5000,一个22 ...
- [技术翻译]预加载响应式图像,从Chrome 73开始实现
本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...
- 删除 Windows 旧 OS 加载器
装过多个系统,然后又删除掉了,系统启动引导时,又把以前的废弃的系统引导给带了出来,试过多种方式,以下方法是最好的. 开始->运行->cmd bcdedit /v 查看要删除的"W ...
- bootstrap模态框modal使用remote第二次加载显示相同内容解决办法
bootstrap模态框modal使用remote动态加载内容,第二次加载显示相同内容解决办法 bootstrap的modal中,使用remote可以动态加载页面到modal-body中,并弹窗显示 ...
- maven在windows环境下加载settings.xml文件
今天发现maven在windows环境下加载的settings.xml文件是c:下的,就算修改conf下的settings.xml里的<localRepository>给他明确指向也没用.
随机推荐
- java:Comparable比较器
/*Comparable 是java.lang中的一个接口,所以是默认导入的,不需要显示的导入. *如果你先直接在本类中实现排序,那么可以直接实现该接口(例如:public class Compara ...
- __builtin_popcount(n)
Gcc提供的内建函数__builtin_popcount(n),可以精确计算n表示成二进制时有多少个1.借助这个函数可以快速判断一个数是否是2的幂. bool isPowerOfTwo(int n) ...
- hdu1150 Machine Schedule 经典二分匹配题目
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150 很经典的二分题目 就是求最小点覆盖集 二分图最小点覆盖集=最大匹配数 代码: #include& ...
- 由"永恒之蓝"病毒而来的电脑科普知识
永恒之蓝病毒事件: 继英国医院被攻击,随后在刚刚过去的5月12日晚上20点左右肆虐中国高校的WannaCry勒索事件,全国各地的高校学生纷纷反映,自己的电脑遭到病毒的攻击,文档被加密,壁纸遭到篡改,并 ...
- 瀑布流原生ajax,demo
最近听朋友们说起瀑布流挺多的,自己就去研究下了,一个简单的原生demo,分享给大家... 简单分为三个文档,有详细的注释 img:ajax.php:demo.php 其中img中放入图片 1.jpg: ...
- Hadoop中MapReduce作业流程图
MapReduce的流程分为11个步骤,4个实体 1.客户端:编写MapReduce的代码,配置作业,提交作业 2.JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作 ...
- java关键字transient与volatile小结
本文转自:http://heaven-arch.iteye.com/blog/1160693 transient和volatile两个关键字一个用于对象序列化,一个用于线程同步,都是Java中比较高阶 ...
- 5、Java Swing布局管理器(FlowLayout、BorderLayout、CardLayout、BoxLayout、GirdBagLayout 和 GirdLayout)
5.Java-Swing常用布局管理器 应用布局管理器都属于相对布局,各组件位置可随界面大小而相应改变,不变的只是其相对位置,布局管理器比较难以控制,一般只在界面大小需要改是才用,但即使这 ...
- 谷歌发布基于机器学习的Android APP安全检测系统:Google Play Protect
Google Play作为众所周知的在线应用市场,因为审查制度的松散,经常会有一些恶意软件伪装成其他应用混入其中.此前阿里聚安全小编就报道了2例关于恶意软件伪装在Google Play上的事件:< ...
- Java 8 Learn Notes - Streams
Main reference [1] http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples 1. How Stream ...