WINDOWS程式設計對話方塊載入顯示bmp映像及重新整理

來源:互聯網
上載者:User

標籤: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映像及重新整理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.