一.相關函數
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>