函數功能:該函數建立一個帶有特定寬度、高度和顔色格式的位圖。
函數原型:HBITMAP CreateBitmap(int nWidth,int nHeight, UINT cPlanes, UINT cBitsPeral,CONST VOID *lpvBits);
參數:
nWiath:指定位圖寬度、機關為像素。
NHeight:指定位圖高度、機關為像素。
CPlanes:指定該裝置使用的顔色位面數目。
CBitsPerPel:指定用來區分單個像素點顔色的位數(比特數目)。
LpvBits:指向顔色資料數組指針。這些顔色資料用來設定矩形區域内像素的顔色。矩形區域中的每一掃描線必須是雙位元組的整數倍(不足部分以0填充)。如果該參數為NULL,那麼就表示沒有定義新位圖。
傳回值:如果函數成功,那麼傳回值是位圖的句柄;如果失敗,那麼傳回值為NULL。若想擷取更多錯誤資訊,請調用GetLastError函數。
備注:在建立完位圖之後,可以通過使用SeletObject函數把它選入到裝置環境中。盡管函數CreateBitmap可以用來建立彩色位圖,但由于性能方面的原因,應用程式使用CreateBitmap函數來建立機關色位圖,建立彩色位圖應該使用函數CreateCompatibleBitmap。當由CreateBitmap建立而傳回的彩色位圖被選入到裝置環境時,系統必須確定選入進去的裝置環境格式與位圖比對。由于函數CreateComapatbleBitmap擷取裝置環境,是以它傳回的位圖與指定的裝置環境有相同的格式。由于這個原因,對SelectObject的後續調用都要比從CreateBitmap函數建立傳回的彩色位圖調用快。
如果位圖是單色的,那麼對于目标裝置環境而言,0表示前景顔色,而1表示背景顔色。
如果應用程式将nWidth或nHeight參數設為0,那麼函數CreateBitmap傳回的是隻有一個含像素的單色位圖的句柄。當不再需要位圖時,可調用DeleteObject函數删除它。
Windows CE:參數cPlanes必須是1。
下面是一個例子:
- #include <windows.h>
- #pragma comment(lib,"Msimg32.lib")
- HINSTANCE g_hIns;
- HWND g_hWnd;
- LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
- int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
- {
- g_hIns=hInstance;
- static TCHAR szAppName[]=TEXT("HelloWin");
- HWND hWnd;
- MSG msg;
- WNDCLASS wndClass;
- wndClass.style=CS_HREDRAW|CS_VREDRAW;
- wndClass.lpfnWndProc=WndProc;
- wndClass.cbClsExtra=0;
- wndClass.cbWndExtra=0;
- wndClass.hInstance=hInstance;
- wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
- wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
- wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
- wndClass.lpszMenuName=NULL;
- wndClass.lpszClassName=szAppName;
- if(!RegisterClass(&wndClass))
- {
- MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);
- return 0;
- }
- hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
- int iReturn;
- //也可以放在此
- ShowWindow(hWnd,iCmdShow);
- UpdateWindow(hWnd);
- while(GetMessage(&msg,hWnd,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
- LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
- {
- static HDC hdc;
- static HDC hBitmapDC;
- static HBITMAP hBitmap;
- PAINTSTRUCT ps;
- switch (message)
- {
- case WM_PAINT :
- hdc=BeginPaint(hWnd,&ps);
- hBitmap =CreateBitmap(100,100,1,24,NULL);
- hBitmapDC = CreateCompatibleDC(hdc);
- SelectObject(hBitmapDC,hBitmap);
- //原來的hdc未寫入位圖資訊,要從非資源檔案讀入位圖,就要用SetPixel寫入hdc裝置
- for(int i=1;i<=100;i++)
- for(int j=1;j<=100;j++)
- SetPixel(hdc,i,j,RGB(100,100,255));
- BitBlt(hdc,0,0,100,100,hBitmapDC,0,0,SRCCOPY);
- EndPaint (hWnd, &ps) ;
- break;
- case WM_DESTROY :
- PostQuitMessage (0) ;
- break ;
- default:
- return DefWindowProc (hWnd, message, wParam, lParam) ;
- }
- return 1;
- }
再看一個例子,顯示文字:
- #include <windows.h>
- #pragma comment(lib,"Msimg32.lib")
- HINSTANCE g_hIns;
- HWND g_hWnd;
- LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
- int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
- {
- g_hIns=hInstance;
- static TCHAR szAppName[]=TEXT("HelloWin");
- HWND hWnd;
- MSG msg;
- WNDCLASS wndClass;
- wndClass.style=CS_HREDRAW|CS_VREDRAW;
- wndClass.lpfnWndProc=WndProc;
- wndClass.cbClsExtra=0;
- wndClass.cbWndExtra=0;
- wndClass.hInstance=hInstance;
- wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
- wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
- wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
- wndClass.lpszMenuName=NULL;
- wndClass.lpszClassName=szAppName;
- if(!RegisterClass(&wndClass))
- {
- MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);
- return 0;
- }
- hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
- int iReturn;
- //也可以放在此
- ShowWindow(hWnd,iCmdShow);
- UpdateWindow(hWnd);
- while(GetMessage(&msg,hWnd,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
- LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
- {
- static HDC hdc;
- static HDC hBitmapDC,hBitmapDC1;
- static HBITMAP hBitmap,hBitmap1;
- static BITMAP bm;
- static BYTE *p;
- int index = 0;
- PAINTSTRUCT ps;
- switch (message)
- {
- case WM_PAINT :
- hdc=BeginPaint(hWnd,&ps);
- hBitmapDC1 = CreateCompatibleDC(hdc);
- hBitmap1 = CreateCompatibleBitmap(hdc,100,100);
- SelectObject(hBitmapDC1,hBitmap1);
- TextOut(hBitmapDC1,0,0,TEXT("asdf"),4);
- GetObject(hBitmap1,sizeof(BITMAP),&bm);
- p = new BYTE[bm.bmHeight * bm.bmWidth * bm.bmBitsPixel];
- if (p == NULL)
- {
- return E_FAIL;
- }
- COLORREF col;
- for(int i = 0;i<bm.bmHeight*bm.bmWidth;i++)
- {
- col = GetPixel(hBitmapDC1,(i+1)%bm.bmWidth,(i+1)/bm.bmWidth);
- p[index++] = (BYTE)GetRValue(col);
- p[index++] = (BYTE)GetGValue(col);
- p[index++] = (BYTE)GetBValue(col);
- p[index++] = 255;
- }
- hBitmap =CreateBitmap(100,100,1,32,p);
- hBitmapDC = CreateCompatibleDC(hdc);
- SelectObject(hBitmapDC,hBitmap);
- //原來的hdc未寫入位圖資訊,要從非資源檔案讀入位圖,就要用SetPixel寫入hdc裝置
- //for(int i=1;i<=100;i++)
- // for(int j=1;j<=100;j++)
- // SetPixel(hdc,i,j,RGB(100,100,255));
- BitBlt(hdc,0,0,100,100,hBitmapDC,0,0,SRCCOPY);
- EndPaint (hWnd, &ps) ;
- break;
- case WM_DESTROY :
- PostQuitMessage (0) ;
- break ;
- default:
- return DefWindowProc (hWnd, message, wParam, lParam) ;
- }
- return 1;
- }