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>给他明确指向也没用.
随机推荐
- 【BFS + Hash】拼图——携程2017春招编程题2
写在前面 前天参加了携程的网测--还是感觉自己太!渣!了! _(:з」∠)_ 时光匆匆啊,已经到了开始思考人生的时候了(算了不矫情了)--总之写个博客来督促一下自己.之前太懒了,很多时候都是输在 ...
- Html5-audio标签简介及手机端不自动播放问题
1.audio:html5音频标签 <audio loop src="/photo/aa.mp3" id="audio" autoplay preload ...
- 玩转Eclipse--如何使用eclipse可以更好的提高我们的工作效率
工欲善其事必先利其器,更加了解我们的开发工具有利于提高开发效率,而合理使用快捷键可以使我们事半功倍,这里收集了eclipse中的几种常见设置,eclipse的优化以及非常全面的快捷键介绍,大家有用到的 ...
- Cygwin在线安装指南
详细说明请看文章http://www.crifan.com/files/doc/docbook/cygwin_intro/release/htmls/install_cygwin_setup_exe. ...
- [进程管理]linux 下 进程和线程的区别(baidu 面试)
进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是CPU调度和分派的 ...
- 【算法系列学习】Dijkstra算法变形 [kuangbin带你飞]专题四 最短路练习
https://vjudge.net/contest/66569#problem/B 类试题:noip2013 货物运输 POJ 1797 Heavy Transportation 方法一:Dijks ...
- springboot(十一):Spring boot中mongodb的使用
mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...
- Hopfield神经网络实现污染字体的识别
这个网络的内部使用的是hebb学习规则 贴上两段代码: package geym.nn.hopfiled; import java.util.Arrays; import org.neuroph.co ...
- bootstrap实例 之 响应式表格-----2017-05-15
Bootstrap 的响应式 CSS 能够自适应于台式机.平板电脑和手机,现在就bootstrap的响应式举一个例子: 如上图所示,要实现该表格在手机等移动端上只显示代号.名称.和价格,其他以查看详情 ...
- PHP面向对象之解释器模式
在博客园逛了1年多,从来都是看文章但没发表过什么文章.主要是因为技术太菜了,只有学习的份,自己那点水平实在也没什么好去分享的.但是最近在看 “深入PHP面向对象模式与实践” ,学习书中的内容后瞬间觉得 ...