天天看点

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. }

继续阅读