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

http://blog.csdn.net/lsmdiao0812/article/details/3327532

在MFC中,可以使用CreateBitmap函数创建一个位图对象,其函数定义如下: ``` CBitmap::CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits); ``` 其中,各个参数的含义如下: - nWidth:位图的宽度,以像素为单位。 - nHeight:位图的高度,以像素为单位。 - nPlanes:指定位图的平面数,通常为1。 - nBitcount:指定每个像素的位数(也称位深度),通常为24(表示RGB,每个颜色通道占用8位)或32(表示RGBA,每个颜色通道占用8位)。 - lpBits:指向包含位图数据的缓冲区的指针。如果为NULL,则创建一个空白位图。 需要注意的是,lpBits参数是可选的,如果不需要初始化位图,则可以将其设置NULL。如果需要初始化位图,则需要提供一个指向缓冲区的指针,缓冲区中存储的是按照位图格式排列的像素数据。 例如,如果需要创建一个宽度为100,高度为200,位深度为32的位图,并将其初始化为黑色,则可以按照以下方式调用CreateBitmap函数: ``` CBitmap bmp; DWORD* pBits = new DWORD[100 * 200]; memset(pBits, 0, 100 * 200 * sizeof(DWORD)); bmp.CreateBitmap(100, 200, 1, 32, pBits); delete[] pBits; ``` 其中,pBits指向了一个大小为100 * 200 * 4字节(32位)的缓冲区,并用memset函数将其初始化为0。最后,将位图宽度、高度、位深度和缓冲区指针作为参数传递给CreateBitmap函数,即可创建一个指定大小和颜色的位图对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值