对屏幕进行抓屏后保存,图像发生了变形,本在屏幕最右边的内容在图像上却是在左边,不知道有没有人碰到过这样的问题。
谢谢啊!
谢谢啊!
解决方案 »
- VS2010中的MFC中,如何实现一行中并列停靠多个工具栏
- 再发一贴,socket、管道问题
- IInternetProtocol接口Continue函数的讨论
- (呼吁高手)我的listctrl在处理NM_CUSTOMDRAW消息莫名其妙的出错了.
- 一个简单的VS2005的编译问题!
- 怎么让一CStatic控件(即Picture Control控件)里显示为白色???
- 当DLL被显式加载时,我想在case DLL_PROCESS_ATTACH:将DLL本身存为a.dll,怎么做呢?(不要拷贝原文件,有无办法)
- 没分的烦恼
- 紧急求助各位高手!!!!在线等待
- 有没有用vc做数据库程序的,那里有类似grid这种功能强大的空件
- UpdateLayeredWindow调用失败, 返回0; GetLastError返回0
- 更好地学习MFC
{
BITMAP Bitmap;
HDC hDC;
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh, hDib, hPal,hOldPal=NULL;
FILE * pout;
if (nColor<= 8)
dwPaletteSize = (1<<nColor) *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 = nColor;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth * nColor+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, Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL,hDC);
}
pout = fopen("1_0.bmp", "w");
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;
//write file header
fwrite(&bmfHdr,sizeof(BITMAPFILEHEADER),1, pout);
//write bmp data
fwrite(lpbi, dwDIBSize, 1, pout);
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
DeleteObject(hbitmap);
return TRUE;
}
代码在这能不能帮我看看出什么问题了
CDC hMemDC; CBitmap *hOldBitmap;
CWnd * wnd = GetDesktopWindow();
CDC * dc = wnd->GetDC();
CRect rect;
wnd->GetWindowRect(rect);
int x,y;
x=GetSystemMetrics(SM_CXSCREEN);
y=GetSystemMetrics(SM_CYSCREEN); hBitmap.DeleteObject(); hMemDC.CreateCompatibleDC(dc); hBitmap.CreateCompatibleBitmap(dc,m_nDialogWide,m_nDialogHigh);
hOldBitmap = hMemDC.SelectObject(&hBitmap); hMemDC.StretchBlt(0, 0,m_nDialogWide ,m_nDialogHigh, dc,0,0,m_nDialogWide,m_nDialogHigh,SRCCOPY);
错了.
dwDIBSize是包含了fileheader size,而实际上你写的是cut了fileheader的(fileheader已经在前一句写入)