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>给他明确指向也没用.
随机推荐
- a标签去掉默认样式并自定义样式
a { text-decoration: none;//去掉下划线 color: inherit; -webkit-user-select: none; -moz-user-select: none; ...
- android参数传递的几种方法
Intent Intent i=new Intent(当前Activity.this,目标Activity.class); 1.传单值 传入: i. i.putExtra("名称" ...
- Linux-进程描述(5)之进程环境
main函数和启动例程 当内核使用一个exec函数执行C程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为程序的起始地址.启动例程从内核获取命令行参数和环境变量,然后为调 ...
- bootstrap快速入门笔记(四)-less用法指南, mixin和变量
一,less变量,less文件 1.bootstrap.less 这是主要的 Less 文件.该文件中导入了一些其他的 less 文件.该文件中没有任何代码. 2.forms.less 这个 Less ...
- PHP获取Post的原始数据方法小结(POST无变量名)
From : http://blog.csdn.net/hotdigger/article/details/6456240 一般我们都用$_POST或$_REQUEST两个预定义变量来接收POST ...
- Redhat 安装ftp服务
介绍: 1 安装ftp服务端及客户端 2 ftp的使用
- 不同浏览器的margin值与padding值
IE-7: 有默认外边距margin样式的元素: dd,menu, ol, ul, blockquote, body, dd, dl, form, h1-6, ul 有默认内边距padding样式的元 ...
- Pangolin学习
0.1. 资料 0.2. 使用说明 0.3. HelloPangolin 0.4. Plot data with ros 0.1. 资料 泡泡机器人 github example opengl中摄像机 ...
- 从foreach语句枚举元素看数组
在foreach语句中使用枚举,可以迭代数组或集合中的元素,且无须知道集合中的元素的个数.如图显示了调用foreach方法的客户端和集合之间的关系.数组或集合实现带GetEnumerator()方法的 ...
- MySQL ProxySQL读写分离使用初探
目的 在美团点评DBProxy读写分离使用说明文章中已经说明了使用目的,本文介绍ProxySQL的使用方法以及和DBProxy的性能差异.具体的介绍可以看官网的相关说明,并且这个中间件也是percon ...