標籤:bit roc obj win32 har proc window ado 解釋
參考文章: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映像及重新整理