Win32GDI 学习

来源:互联网 发布:b站网络视听许可证 编辑:程序博客网 时间:2024/05/16 15:21

在Win32下面获取屏幕的高度和宽度:
  int  x=GetSystemMetrics(SM_CXSCREEN);//屏幕的宽度
  int  y=GetSystemMetrics(SM_CYSCREEN);//屏幕的高度

在Win32下绘制位图:

HBITMAP hbm=LoadBitmap(hInstance,MAKEINTRESOURCE(iResource));  //iResource为资源ID,hInstance可为NULL

BITMAP bm;

GetObject(hBm,sizeof(BITMAP),&bm);//获取位图信息

SelectObject(hdcsrc,hbm);

BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,SRCCOPY); 


将CBitmap 保存为bmp文件

bool SaveBitmapToFile(CBitmap* bitmap, LPSTR lpFileName)  {              HBITMAP hBitmap;    // 为刚才的屏幕位图句柄  HDC hDC; //设备描述表    int iBits; //当前显示分辨率下每个像素所占字节数    WORD wBitCount; //位图中每个像素所占字节数    DWORD dwPaletteSize = 0, //定义调色板大小  dwBmBitsSize,  //位图中像素字节大小     dwDIBSize,   //位图文件大小  dwWritten;  //写入文件字节数  BITMAP Bitmap; //位图属性结构    BITMAPFILEHEADER bmfHdr; //位图文件头结构    BITMAPINFOHEADER bi; //位图信息头结构      LPBITMAPINFOHEADER lpbi; //指向位图信息头结构    HANDLE fh,   //定义文件  hDib,    //分配内存句柄  hPal,   //调色板句柄  hOldPal = NULL;  //计算位图文件每个像素所占字节数    hBitmap = (HBITMAP)*bitmap;    hDC = CreateDC("DISPLAY",NULL,NULL,NULL);    iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);    DeleteDC(hDC);  if (iBits <= 1)    wBitCount = 1;    else if (iBits <= 4)    wBitCount = 4;    else if (iBits <= 8)    wBitCount = 8;    else if (iBits <= 24)    wBitCount = 24;    else if (iBits <= 32)  wBitCount = 32;  //计算调色板大小    if (wBitCount <= 8)    dwPaletteSize = (1 << wBitCount) * sizeof (RGBQUAD);  //设置位图信息头结构    GetObject(hBitmap, sizeof (BITMAP), (LPSTR)&Bitmap);  bi.biSize = sizeof (BITMAPINFOHEADER);    bi.biWidth = Bitmap.bmWidth;    bi.biHeight = Bitmap.bmHeight;    bi.biPlanes = 1;      bi.biBitCount = wBitCount;    bi.biCompression = BI_RGB;    bi.biSizeImage = 0;    bi.biXPelsPerMeter = 0;    bi.biYPelsPerMeter = 0;    bi.biClrUsed = 0;    bi.biClrImportant = 0;    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31) / 32) * 4 * Bitmap.bmHeight;    //为位图内容分配内存    hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof (BITMAPINFOHEADER));    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);    *lpbi = bi;  // 处理调色板         hPal = GetStockObject(DEFAULT_PALETTE);    if (hPal)    {    hDC = ::GetDC(NULL);      hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);    RealizePalette(hDC);  }    //   获取该调色板下新的像素值    GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,    (LPSTR)lpbi + sizeof (BITMAPINFOHEADER) + dwPaletteSize,  (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);    //恢复调色板       if (hOldPal)      {    SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);    RealizePalette(hDC);    ::ReleaseDC(NULL, hDC);  }    //创建位图文件              fh = CreateFile(lpFileName, GENERIC_WRITE,  0, NULL, CREATE_ALWAYS,  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);    if (fh == INVALID_HANDLE_VALUE)  return FALSE;    //   设置位图文件头    bmfHdr.bfType = 0x4D42;     //   "BM"    dwDIBSize = sizeof (BITMAPFILEHEADER)       + sizeof (BITMAPINFOHEADER)    + dwPaletteSize + dwBmBitsSize;      bmfHdr.bfSize = dwDIBSize;    bmfHdr.bfReserved1 = 0;    bmfHdr.bfReserved2 = 0;    bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER)     + (DWORD)sizeof (BITMAPINFOHEADER)    + dwPaletteSize;      //   写入位图文件头    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);    //   写入位图文件其余内容    WriteFile(fh, (LPSTR)lpbi, dwDIBSize,  &dwWritten, NULL);  //清除            GlobalUnlock(hDib);    GlobalFree(hDib);    CloseHandle(fh);    return TRUE;      }    


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击