Win32GDI 学习
2011-09-06 15:29
218 查看
在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文件
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; }
相关文章推荐
- Win32 GDI 学习总结
- win32 GDI学习 画线条和画框
- win32 GDI 学习
- win32学习之 --------GDI使用 代码记录
- C#调用Win32 api学习总结
- WIN32学习笔记——键盘消息
- win32 DLL 学习总结
- win32设置窗口的光标 ----- 学习记录
- Win32学习笔记 第二章 Unicode
- Win32学习笔记——对话框资源
- Win32学习笔记——绘图
- Win32学习笔记——windows的库
- GTK+学习工具——使用glade:gtk-win32-devel-2.8.18-rc1.exe
- win32学习10.菜单
- win32sdk学习-window消息机制
- win32程序设计学习笔记Timer篇之一----书接上回
- WIN32学习——Windows消息机制(一)
- Win32调试API学习心得(一)
- 学习win32 API开发5-让窗口中显示文字
- win32 select学习