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
原文地址:https://www.cnblogs.com/rixiang/p/6979460.html