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
时间: 2024-08-03 21:18:49

WINDOWS程序设计对话框加载显示bmp图像及刷新的相关文章

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

windows 修改 开机界面 boot启动界面 windows 修改 启动加载 版权 windows 系统如何修改开机画面的版权文字"Microsoft Corporation ... ◎Microsoft Corporation Microsoft Corporation 去掉 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 通过16进制的编辑器(我用的是winhex)打开winlo

从输入 URL 到页面加载显示完成的过程

前言:"一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?" 这个问题我想大多数人都不会陌生,好像是前端面试题经常会出现的,在此我也好好梳理梳理了一番,总结成这篇文章,希望能对和我一样在前端道路上奋进的小白们有所帮助,一起学习,交流. 我把这个问题拆解成两个过程: 1. 用户输入 url ---> 客户端(浏览器)拿到服务端的数据 2. 浏览器拿到数据 ---> 呈现页面(也就是浏览器工作过程) 搞清楚这两个过程后,我们也算是完整的回答了前言部分所提的问题

Windows Phone 8加载外部动态链接库DLL(非安装包内的)

Windows Phone 8加载外部动态链接库DLL(非安装包内的) 在<动态加载与插件化>中大概介绍了下,wp8加载非安装包的下动态链接库,这次详细梳理下. 加载外部DLL主要的原理: 通过NtCurrentTeb获得线程环境块 从线程环境块中获得进程环境块 在进程环境块中加载过得DLL链表 从链表中找到kernelbase.dll的模块句柄 从kernelbase.dll中获得LoadLibraryEx函数地址 加载指定地址下的DLL 相关的结构体: typedef struct _CL

js数据显示在文本框中(页面加载显示和按钮触动显示)

web代码如下: <!DOCTYPE html> <html> <head> <title>jsTest02.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is

浏览器加载显示html页面内容的顺序

我们经常看到浏览器在加载某个页面时,部分内容先显示出来,又有些内容后显示.那么浏览器加载显示html究竟是按什么顺序进行的呢 其实浏览器加载显示html的顺序是按下面的顺序进行的:1.IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的.2.在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完).3.如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载.4.并且在下载后进行解析,解析过

Windows Live Writer加载代码着色插件步骤

博客园内置支持SyntaxHighlighter代码着色,代码着色语法:<pre class='brush:编程语言'>代码</pre>. 需要注意的是:如何你使用SyntaxHighlighter代码着色,需要将默认编辑器改为TinyMCE.如果使用CuteEditor,CuteEditor会自动去除代码中的空格,造成代码格式破坏.还有需要注意的是,加载完插件后,在Live Writer中是看不到代码着色效果的,发布后就可以看到了. 如果您使用Windows Live Write

windows 程序设计自学:窗口正中显示Hello,World

1 #include <windows.h> 2 3 LRESULT CALLBACK MyWndProc( HWND hwnd, // handle to window 4 UINT uMsg, // message identifier 5 WPARAM wParam, // first message parameter 6 LPARAM lParam // second message parameter 7 ); 8 9 int WINAPI WinMain( HINSTANCE h

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

远程控制编写之屏幕传输  MFC实现  屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_xiehonghao/article/details/37656281 二: 被控端的代码 注意下面代码要放到一个线程中去 因为用到了while死循环 表示一直发送消息  直到对方关闭接收,发送失败后自动退出! 一定要放进线程 DWORD __stdcall SendScreen(LPVOID lpa

linux和windows动态库加载路径区别

# linux和windows动态库加载路径区别 ### 简介------------------------------ linux加载动态库的路径是系统目录/lib和/usr/lib.- windows加载动态库的路径是本地目录下,然后再搜索windows/system和windows/system32目录 ### 备注------------------------------ linux加载动态库的路径方式,对于习惯windows开发的开发者是不太方便的.- 其实linux下可以设置从当