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>给他明确指向也没用.
随机推荐
- AngularJS创建新指令 - 基本功能
指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令. AngularJS原有的指令 ng-init ...
- 将子域名请求路由到MVC区域
写了个扩展,分享给需要的朋友. 0x01 使用方法 在mvc区域中的{xxxx}AreaRegistration.cs文件中,如ProjectsAreaRegistration.cs <pre& ...
- java 内存管理 —— 《Hotspot内存管理白皮书》
说明 要学习Java或者任意一门技术,我觉得最好的是从官网的资料开始学习.官网所给出的资料总是最权威最知道来龙去脉的.而Java中间,垃圾回收与内存管理是Java中非常重要的一部分.<Hot ...
- [系统启动]Printk与sched_clock_init的一点分析
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 在分析Linu内核启动的过程中,发现一段"不平常" ...
- PHP die() 函数
die() 函数输出一条消息,并退出当前脚本. 该函数是 exit() 函数的别名.
- Linux学习之要点必备
在本节课中我将会带领大家秒懂linux命令 要点一:常见基本命令格式 命令名称+选项+参数 例如:#mkdir -r /var/ruofeng/001/ 我们通过逐级创建目录方式解释这个例子,mkdi ...
- MySQL游标的简单实践
Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十四)谈谈写博客的原因和项目优化
阶段总结 又到了优化篇的收尾阶段了,这其实是一篇阶段总结性的文章,今天是4月29号,距离第一次发布博客已经两个月零5天,这两个多月的时间,完成了第一个项目ssm-demo的更新,过程中也写了33篇博客 ...
- 分针网——每日分享: jquery选择器的用法
jQuery选择器是jQuery库的一大特色,用这些选择器不但可以省去繁琐的JavaScript 书写方式,还可以节省时间和效率,正是有这些jQuery选择器,才让我们更容易的操作JavaScript ...
- HDU4497GCD and LMC最大公约数与最小公倍数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4497 题目大意: 求gcd(x,y,z)=G且lcm(x,y,z)=L的方法数. 题目分析: 起初这 ...