Windows編程(7)|SDK顯示位元影像

來源:互聯網
上載者:User
一.相關函數

1. HBITMAP LoadBitmap(

                                      HINSTANCE hInstance,  // handle to application instance

                                      LPCTSTR lpBitmapName  // name of bitmap resource

                                      );

如果想載入系統位元影像,那麼將第一個參數設為NULL,如果不是系統位元影像,

第一參數是執行個體的控制代碼,第二個參數可以用MAKEINTRESOURCE宏轉換位元影像的ID,不然直接加位元影像的路徑

 

2, HANDLE LoadImage(

                    HINSTANCE hinst,   // handle to instance

                    LPCTSTR lpszName,  // image to load

                    UINT uType,        // image type

                    int cxDesired,     // desired width

                    int cyDesired,     // desired height

                    UINT fuLoad        // load options

);

第一個參數:執行個體控制代碼,若載入OEM映像則可以0;

第二參數:如果載入外部位元影像,直接是位元影像路徑,若載入OEM映像,可以使用MAKEINTRESOURCE宏,

第三個參數:位元影像的類型

 

第四和第五個參數是所載入的映像的寬度和高度,以像素為單位, 如果此參數為零並且參數fuLoad值為LR_DEFAULTSIZE,

那麼函數使用SM_CXICON或SM_CXCURSOR系統公制值設定寬度;如果此參數為零並且值LR_DEFAULTSIZE沒有被使用,

那麼函數使用目前的資源寬度。

 

第五參數:可以使用"|"進行組合

 

 

 

 

 

3. int GetObject(

             HGDIOBJ hgdiobj,  // handle to graphics object

             int cbBuffer,     // size of buffer for object information

             LPVOID lpvObject  // buffer for object information

              );

  用這個函數擷取位元影像的資訊,如位元影像尺寸,

第一個參數:映像的控制代碼,可以是一個邏輯位元影像、一個刷子、一種字型、一個調色盤、筆或通過調用CreateDIBsection函數建立的與裝置無關位元影像的控制代碼

第二個參數:緩衝區的大小,

第三個參數:

 

:

 

4.顯示位元影像

BOOL BitBlt  

(

      HDC hdcDest,                 // 目地裝置環境

      int nXDest, int nYDest,         //目地裝置顯示位元影像的基點

      int nWidth, int nHeight,        // 顯示地區的高寬

      HDC hdcSrc,                   // 源裝置環境

      int nXSrc, int nYSrc,           // 源裝置中位元影像的左上方座標

      DWORD dwRop               // 位元影像的顯示方式

)

 

 

 

最後一個參數顯示方式

 

上文中的內容參考了MSDN,圖片來自MSDN的

 

二. 實現

 

在"資源"上添加一張位元影像並手工簡單繪畫和添加菜單,在菜單中添加"開啟資源位元影像"和"開啟外部位元影像"

 

 

 

我的實現代碼....

//開發工具:VS2008<br />//使用 Unicode 字元集</p><p>#include <windows.h><br />#include <tchar.h> //_T或_TEXT需要的標頭檔<br />#include "resource.h"</p><p>//設計一個視窗類別;<br />//註冊視窗類別;<br />//建立視窗;<br />//顯示及更新視窗。<br />//訊息迴圈<br />//視窗函數</p><p>//全域變數<br />TCHAR szWindowClass[] = _T("示範程式");<br />TCHAR szWindowTitle[] = _T("主視窗標題");<br />HINSTANCE hBmpInstance;<br />HBITMAP hBmp; //位元影像控制代碼<br />BITMAP Bmp; //BITMAP是結構體<br />HDC hDc,hDcMem; //hDcMen相容裝置<br />PAINTSTRUCT Ps;<br />RECT WinRect;<br />TCHAR szPath[] = _T("..\\ShowBmp\\Show.bmp"); //外部位元影像路徑</p><p>//定義的視窗過程函數,是個回呼函數,意思是該函數不是在程式中直接調用<br />//而是在特定的事件或條件發生時由Windows系統調用,對事件或條件的響應<br />LRESULT CALLBACK MyWindowProc(<br />HWND hwnd, // 視窗控制代碼<br />UINT uMsg, // 訊息標識<br />WPARAM wParam, // first message parameter<br />LPARAM lParam // second message parameter<br />);<br />//程式的入口函數<br />int WINAPI WinMain( HINSTANCE hInstance, //記錄程式當前啟動並執行執行個體的控制代碼<br />HINSTANCE hPrevInstance, //已經失去了意義,總為NULL<br />LPSTR lpCmdLine, //命令列參數,記錄當前運行程式的路徑<br />int nShowCmd //指定程式視窗應該如何顯示,通常不檢查這個參數的值<br />)<br />{</p><p>//擷取執行個體<br />hBmpInstance = hInstance;<br />//設計視窗類別,該視窗類別並不是C++中的類,只是表示視窗特徵的結構體</p><p>WNDCLASS MyWndClass; //WNDCLASS是個結構體,該結構體中的成員是指定視窗特徵的資料</p><p>//這兩個變數允許使用者請求Windows內部提供額外的空間以便額外資料與視窗<br />//執行個體發生聯絡,通常不分配空間<br />MyWndClass.cbClsExtra = NULL;<br />MyWndClass.cbWndExtra = NULL;</p><p>//MyWndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);<br />MyWndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);<br />MyWndClass.hIcon = LoadIcon(NULL,IDI_WINLOGO); </p><p> //游標,LoadCursor()的使用與LoadIcon()相同<br /> MyWndClass.hCursor = LoadCursor(NULL,IDC_APPSTARTING);</p><p>MyWndClass.hInstance = hInstance; //當前執行個體的控制代碼<br /> MyWndClass.lpfnWndProc = MyWindowProc; //視窗函數(訊息處理函數),lpfnWndProc是個函數指標<br />MyWndClass.lpszClassName = szWindowClass; //視窗類別名<br /> //MyWndClass.lpszMenuName = NULL ;// 菜單,指定菜單資源的名字,NULL是表示沒有菜單,<br />MyWndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);//一種,MAKEINTRESOURCE()載入菜單<br /> MyWndClass.style = CS_HREDRAW|CS_VREDRAW; //使用|把多種視窗樣式串連在一起<br />//視窗的樣式</p><p>//註冊視窗類別,告訴Windows系統視窗類別設計好了<br />if(!RegisterClass(&MyWndClass))<br />{<br /> return 0; //註冊失敗退出程式<br />}</p><p>//建立視窗,返回視窗的控制代碼<br /> HWND hWnd = CreateWindow(<br /> szWindowClass, //視窗類別名稱<br />szWindowTitle, //視窗標題<br />WS_OVERLAPPEDWINDOW, //視窗樣式,多種樣式<br />CW_USEDEFAULT, //x座標,預設<br />//CW_USEDEFAULT僅適用於WS_OVERLAPPED樣式視窗<br />CW_USEDEFAULT, //y座標,預設<br />400, //寬<br />300, //高<br />NULL, //父視窗<br />NULL, //第二種加菜單<br />hInstance, //視窗執行個體標記<br />NULL //視窗建立時傳入的資料指標,<br /> //多文檔時必須指向CLIENTCREATESTRUCT<br /> );</p><p> //如果視窗建立失敗<br />if(!hWnd)<br />return 0;</p><p>//顯示並更新視窗<br />ShowWindow(hWnd,SW_SHOW);<br />UpdateWindow(hWnd);</p><p>//訊息迴圈,WM_QIUT才停止迴圈,或程式已經推出<br />MSG Msg;<br /> while(GetMessage(&Msg,NULL,0,0))<br />{<br />TranslateMessage(&Msg); //讓Windows為與鍵盤相關的訊息做一些轉換<br />DispatchMessage(&Msg); //指派訊息到視窗過程函數中對訊息處理<br />}<br /> return 1;<br />}</p><p>//視窗過程函數的實現(訊息處理函數)<br />LRESULT CALLBACK MyWindowProc(<br />HWND hwnd, // 視窗控制代碼<br />UINT uMsg, // 訊息標識<br />WPARAM wParam, // first message parameter<br />LPARAM lParam // second message parameter<br /> )<br />{</p><p> switch(uMsg)<br /> {<br /> case WM_PAINT:<br /> {<br /> TCHAR str[] = _T("這是一個Windows的SDK程式!");<br /> hDc =BeginPaint(hwnd,&Ps);//載入裝置內容<br /> hDcMem = CreateCompatibleDC(hDc); //建立相容裝置<br /> SetTextColor(hDc,RGB(13,25,200)); //設定文本顏色<br /> TextOut(hDc,0,0,str,18); //輸出文字<br /> };<br /> break;<br /> case WM_CLOSE: //點擊"X"按鈕時發送此訊息,使訊息迴圈停止<br /> if(IDYES == MessageBox(hwnd,_T("是否要退出?"),_T("提示"),MB_YESNO))<br /> {<br /> DestroyWindow(hwnd); //銷毀視窗,發送WM_DESTROY訊息,注意程式進程還沒退出<br /> };<br /> break;<br /> case WM_DESTROY:<br /> EndPaint(hwnd,&Ps);<br /> DeleteDC(hDcMem);<br /> DeleteObject(hBmp); //清除位元影像<br /> PostQuitMessage(NULL); //進程結束,完全退出程式<br /> break;<br /> case WM_COMMAND:<br /> {<br /> switch(LOWORD(wParam))<br /> {<br /> case ID_40001://載入資源檢視,菜單上的"開啟資源位元影像"訊息處理</p><p>//兩種載入位元影像方法<br /> //hBmp = LoadBitmap(hBmpInstance,MAKEINTRESOURCE(IDB_BITMAP1));<br />hBmp = (HBITMAP)LoadImage(hBmpInstance,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,300,200,LR_CREATEDIBSECTION);</p><p>GetObject(hBmp,sizeof(BITMAP),&Bmp); //擷取位元影像尺寸<br />SelectObject(hDcMem,hBmp); //將位元影像加到裝置中<br />BitBlt(GetDC(hwnd),0,20,Bmp.bmWidth,Bmp.bmHeight,hDcMem,0,0,SRCCOPY); //顯示位元影像<br />TextOut(hDc,120,50,_T("資源位元影像"),4);<br /> break;<br /> case ID_40002: //外部位元影像,菜單上的"開啟外部位元影像"訊息處理</p><p>hBmp = (HBITMAP)LoadImage(hBmpInstance,szPath,IMAGE_BITMAP,200,120,LR_LOADFROMFILE|LR_CREATEDIBSECTION);<br />GetObject(hBmp,sizeof(BITMAP),&Bmp);<br /> SelectObject(hDcMem,hBmp);<br />BitBlt(GetDC(hwnd),0,100,Bmp.bmWidth,Bmp.bmHeight,hDcMem,0,0,SRCCOPY);<br />TextOut(hDc,230,150,_T("外部位元影像"),4);<br />break;<br /> }<br /> };<br /> break;<br /> default:<br /> return DefWindowProc(hwnd,uMsg,wParam,lParam); //處理未處理的訊息<br /> break;<br /> }</p><p> return 0;</p><p>}</p><p>%lt;/textarea><br /><p><br/><br /> </p><br /><p><font size="3" color="#ff0000">執行效果.......</font></p><br /><p> </p><br /><p><img alt="" src="http://hi.csdn.net/attachment/201108/11/0_1313077078D7jR.gif" _xhe_src="http://hi.csdn.net/attachment/201108/11/0_1313077078D7jR.gif"/></p><br /></tchar.h></windows.h>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.