天天看點

CreateBitmap

     函數功能:該函數建立一個帶有特定寬度、高度和顔色格式的位圖。

    函數原型: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。

下面是一個例子:

  1. #include <windows.h>
  2. #pragma   comment(lib,"Msimg32.lib")
  3. HINSTANCE g_hIns;
  4. HWND g_hWnd;
  5. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
  6. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
  7. {
  8.     g_hIns=hInstance;
  9.     static TCHAR szAppName[]=TEXT("HelloWin");
  10.     HWND hWnd;
  11.     MSG msg;
  12.     WNDCLASS wndClass;
  13.     wndClass.style=CS_HREDRAW|CS_VREDRAW;
  14.     wndClass.lpfnWndProc=WndProc;
  15.     wndClass.cbClsExtra=0;
  16.     wndClass.cbWndExtra=0;
  17.     wndClass.hInstance=hInstance;
  18.     wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  19.     wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
  20.     wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  21.     wndClass.lpszMenuName=NULL;
  22.     wndClass.lpszClassName=szAppName;
  23.     if(!RegisterClass(&wndClass))
  24.     {
  25.         MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);
  26.         return 0;
  27.     }
  28.     hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,
  29.         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
  30.     int iReturn;
  31.     //也可以放在此
  32.     ShowWindow(hWnd,iCmdShow);
  33.     UpdateWindow(hWnd);
  34.     while(GetMessage(&msg,hWnd,0,0))
  35.     {
  36.         TranslateMessage(&msg);
  37.         DispatchMessage(&msg);
  38.     }
  39.     return msg.wParam;
  40. }
  41. LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
  42. {
  43.     static HDC hdc;
  44.     static HDC hBitmapDC;
  45.     static HBITMAP hBitmap;
  46.     PAINTSTRUCT ps;
  47.     switch (message)
  48.     {
  49.     case   WM_PAINT :
  50.         hdc=BeginPaint(hWnd,&ps);
  51.         hBitmap =CreateBitmap(100,100,1,24,NULL);
  52.         hBitmapDC = CreateCompatibleDC(hdc);
  53.         SelectObject(hBitmapDC,hBitmap);
  54.         //原來的hdc未寫入位圖資訊,要從非資源檔案讀入位圖,就要用SetPixel寫入hdc裝置
  55.         for(int   i=1;i<=100;i++)     
  56.             for(int   j=1;j<=100;j++)   
  57.                 SetPixel(hdc,i,j,RGB(100,100,255));
  58.         BitBlt(hdc,0,0,100,100,hBitmapDC,0,0,SRCCOPY);
  59.         EndPaint (hWnd, &ps) ;
  60.         break;
  61.     case WM_DESTROY :
  62.         PostQuitMessage (0) ;
  63.         break ;
  64.     default:
  65.         return DefWindowProc (hWnd, message, wParam, lParam) ;
  66.     }
  67.     return 1;
  68. }

再看一個例子,顯示文字:

  1. #include <windows.h>
  2. #pragma   comment(lib,"Msimg32.lib")
  3. HINSTANCE g_hIns;
  4. HWND g_hWnd;
  5. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
  6. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
  7. {
  8.     g_hIns=hInstance;
  9.     static TCHAR szAppName[]=TEXT("HelloWin");
  10.     HWND hWnd;
  11.     MSG msg;
  12.     WNDCLASS wndClass;
  13.     wndClass.style=CS_HREDRAW|CS_VREDRAW;
  14.     wndClass.lpfnWndProc=WndProc;
  15.     wndClass.cbClsExtra=0;
  16.     wndClass.cbWndExtra=0;
  17.     wndClass.hInstance=hInstance;
  18.     wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  19.     wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
  20.     wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  21.     wndClass.lpszMenuName=NULL;
  22.     wndClass.lpszClassName=szAppName;
  23.     if(!RegisterClass(&wndClass))
  24.     {
  25.         MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);
  26.         return 0;
  27.     }
  28.     hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,
  29.         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
  30.     int iReturn;
  31.     //也可以放在此
  32.     ShowWindow(hWnd,iCmdShow);
  33.     UpdateWindow(hWnd);
  34.     while(GetMessage(&msg,hWnd,0,0))
  35.     {
  36.         TranslateMessage(&msg);
  37.         DispatchMessage(&msg);
  38.     }
  39.     return msg.wParam;
  40. }
  41. LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
  42. {
  43.     static HDC hdc;
  44.     static HDC hBitmapDC,hBitmapDC1;
  45.     static HBITMAP hBitmap,hBitmap1;
  46.     static BITMAP bm;
  47.     static BYTE *p;
  48.     int index = 0;
  49.     PAINTSTRUCT ps;
  50.     switch (message)
  51.     {
  52.     case   WM_PAINT :
  53.         hdc=BeginPaint(hWnd,&ps);
  54.         hBitmapDC1 = CreateCompatibleDC(hdc);
  55.         hBitmap1 = CreateCompatibleBitmap(hdc,100,100);
  56.         SelectObject(hBitmapDC1,hBitmap1);
  57.         TextOut(hBitmapDC1,0,0,TEXT("asdf"),4);
  58.         GetObject(hBitmap1,sizeof(BITMAP),&bm);
  59.         p = new BYTE[bm.bmHeight * bm.bmWidth * bm.bmBitsPixel];
  60.         if (p == NULL)
  61.         {
  62.             return E_FAIL;
  63.         }
  64.         COLORREF col;
  65.         for(int i = 0;i<bm.bmHeight*bm.bmWidth;i++)
  66.         {
  67.             col = GetPixel(hBitmapDC1,(i+1)%bm.bmWidth,(i+1)/bm.bmWidth);
  68.             p[index++] = (BYTE)GetRValue(col);
  69.             p[index++] = (BYTE)GetGValue(col);
  70.             p[index++] = (BYTE)GetBValue(col);
  71.             p[index++] = 255;
  72.         }
  73.         hBitmap =CreateBitmap(100,100,1,32,p);
  74.         hBitmapDC = CreateCompatibleDC(hdc);
  75.         SelectObject(hBitmapDC,hBitmap);
  76.         //原來的hdc未寫入位圖資訊,要從非資源檔案讀入位圖,就要用SetPixel寫入hdc裝置
  77.         //for(int   i=1;i<=100;i++)     
  78.         //  for(int   j=1;j<=100;j++)   
  79.         //      SetPixel(hdc,i,j,RGB(100,100,255));
  80.         BitBlt(hdc,0,0,100,100,hBitmapDC,0,0,SRCCOPY);
  81.         EndPaint (hWnd, &ps) ;
  82.         break;
  83.     case WM_DESTROY :
  84.         PostQuitMessage (0) ;
  85.         break ;
  86.     default:
  87.         return DefWindowProc (hWnd, message, wParam, lParam) ;
  88.     }
  89.     return 1;
  90. }

繼續閱讀