1. 程式人生 > >WINDOWS程序設計對話框加載顯示bmp圖像及刷新

WINDOWS程序設計對話框加載顯示bmp圖像及刷新

包含 delet select wid 應用程序 format cas cme null

參考文章: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圖像及刷新