参考文章: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图像及刷新的更多相关文章

  1. VC加载显示bmp图片的函数

    void ShowBitmap(HDC hdc,const char *srcpath) { HBITMAP hBitmap = (HBITMAP)::LoadImage(0, srcpath, IM ...

  2. [ActionScript 3.0] AS3.0 动态加载显示内容

    可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...

  3. Microsoft Corporation 去掉 windows 修改 启动加载 版权

    windows 修改 开机界面 boot启动界面 windows 修改 启动加载 版权 windows 系统如何修改开机画面的版权文字“Microsoft Corporation ... ◎Micro ...

  4. 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像

    远程控制编写之屏幕传输  MFC实现  屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_x ...

  5. html img加载不同大小图像速度

    最近要想法提高网页的性能,在查看图片加载时,产生了试验的想法.一直以来都没有太去深究,还是挖掘一下的好. 很简单的试验,<img>加载两个图像,一个2.3MB,5000*5000,一个22 ...

  6. [技术翻译]预加载响应式图像,从Chrome 73开始实现

    本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...

  7. 删除 Windows 旧 OS 加载器

    装过多个系统,然后又删除掉了,系统启动引导时,又把以前的废弃的系统引导给带了出来,试过多种方式,以下方法是最好的. 开始->运行->cmd bcdedit /v 查看要删除的"W ...

  8. bootstrap模态框modal使用remote第二次加载显示相同内容解决办法

    bootstrap模态框modal使用remote动态加载内容,第二次加载显示相同内容解决办法 bootstrap的modal中,使用remote可以动态加载页面到modal-body中,并弹窗显示 ...

  9. maven在windows环境下加载settings.xml文件

    今天发现maven在windows环境下加载的settings.xml文件是c:下的,就算修改conf下的settings.xml里的<localRepository>给他明确指向也没用.

随机推荐

  1. jquery easyui的datagrid在初始化的时候会请求两次URL?

    我们项目前端用的是jquery easyui,刚开始使用datagrid加载列表初始化时总是请求两次URL,这让人非常不解,怎么总是请求两次呢?数据一多,加载速度明显变慢,通过查资料才知道原来是重复声 ...

  2. js图片轮播

    html部分 <a href="" id="pta"><div id="picture" class="pt&q ...

  3. hdu1083二分图匹配模板题

    onsider a group of N students and P courses. Each student visits zero, one or more than one courses. ...

  4. Windows 10 碎片整理程序使用

    1.打开 此电脑 2.右击任意一个磁盘,这里以C盘为例,点击 属性 3.点击 工具  选项卡--->优化 4.选中其中的一个盘  优化 5.然后静等结束,就好啦. 虽然不知道有什么用,...

  5. AOJ/树二叉搜索树习题集

    ALDS1_7_A-RootedTree. Description: A graph G = (V, E) is a data structure where V is a finite set of ...

  6. String属于“假引用类型”,代码为证(一个String引发的血案...)

    一直以为String是引用类型,今天写了个浅拷贝的测试,发现String有基本类型的特征. class A{ public int a = 555; } class User implements C ...

  7. 用PHP删除ftp下载导致的文件空行

    使用FTP上传下载文件,如果没有设置传输方式为二进制,可能会导致文件出现空行的情况,例如: 使用PHP对文件的空行进行删除,使用正则: <?php $file = './abc.inc.php' ...

  8. 倒计时(距离活动结束还有X天X小时X分X秒)

    一个简单的倒计时,可以设定结束时间,然后自动计算出距离活动结束还有X天X小时X分X秒. 废话不多说,上代码,挺简单的,代码里有注释: // 活动倒计时 var time_end = new Date( ...

  9. 关于SqlServer远程跨库修改数据

    今天遇到一个需求需要修改远程服务器上的数据,如何直接修改,并且垮库,跨库简单,直接加上数据库名字,远程的话则需要创建链接服务器,具体步骤如下: --创建链接服务器  exec sp_addlinked ...

  10. OC—Setter、Getter

    一.本篇以Setter和Getter 来进行成员变量的赋值. 二.Setter 与 Getter 1. 命名规范 为对象中的某个实例变量赋值的方法称为修改方法,用来修改对象的状态这类修改方法称为set ...