拷贝打印机dc不行,拷贝屏幕dc则可以
......
StartDoc(hDC,&doc);
StartPage(hDC);
TextOut(hDC, 0, 0, "Hello", 5);
DC2BMP(hDC, "test.bmp");
EndPage(hDC);
EndDoc(hDC);
......
if DC2BMP Function is called with ScreenDC, BMP file is OK.
if DC2BMP Function is called with PrinterDC, BMP file is not OK. BMP file is
whole white...
What's the problem?
DC2BMP(hDC, "test.bmp")如下:
StartDoc(hDC,&doc);
StartPage(hDC);
TextOut(hDC, 0, 0, "Hello", 5);
DC2BMP(hDC, "test.bmp");
EndPage(hDC);
EndDoc(hDC);
......
if DC2BMP Function is called with ScreenDC, BMP file is OK.
if DC2BMP Function is called with PrinterDC, BMP file is not OK. BMP file is
whole white...
What's the problem?
DC2BMP(hDC, "test.bmp")如下:
HANDLE CBitMapTestDlg::DDBToDIB(CBitmap& bitmap, DWORD dwCompression,
CPalette* pPal) {
BITMAP bm;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen;
HANDLE hDIB;
HANDLE handle;
HDC hDC;
HPALETTE hPal;
ASSERT(bitmap.GetSafeHandle());
// The function has no arg for bitfields
if(dwCompression == BI_BITFIELDS)
return NULL;
// If a palette has not been supplied use defaul palette
if((hPal = (HPALETTE) pPal->GetSafeHandle()) == NULL)
hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
// Get bitmap information
bitmap.GetObject(sizeof(bm),(LPSTR)&bm);
// Initialize the bitmapinfoheader
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression = dwCompression;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
// Compute the size of the infoheader and the color table
int nColors = (1 << bi.biBitCount);
if(nColors > 256)
nColors = 0;
dwLen = bi.biSize + nColors * sizeof(RGBQUAD);
// We need a device context to get the DIB from
hDC = ::GetDC(NULL);
hPal = SelectPalette(hDC,hPal,FALSE);
RealizePalette(hDC);
// Allocate enough memory to hold bitmapinfoheader and color table
if(!(hDIB = GlobalAlloc(GMEM_FIXED,dwLen))) {
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
lpbi = (LPBITMAPINFOHEADER)hDIB;
*lpbi = bi;
// Call GetDIBits with a NULL lpBits param, so the device driver
// will calculate the biSizeImage field
GetDIBits(hDC, (HBITMAP)bitmap.GetSafeHandle(), 0L, (DWORD)bi.biHeight,
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS);
bi = *lpbi;
// If the driver did not fill in the biSizeImage field, then compute it
// Each scan line of the image is aligned on a DWORD (32bit) boundary
if(bi.biSizeImage == 0) {
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) *
bi.biHeight;
// If a compression scheme is used the result may infact be larger
// Increase the size to account for this.
if(dwCompression != BI_RGB)
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}
// Realloc the buffer so that it can hold all the bits
dwLen += bi.biSizeImage;
if(handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE))
hDIB = handle;
else {
GlobalFree(hDIB);
// Reselect the original palette
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
// Get the bitmap bits
lpbi = (LPBITMAPINFOHEADER)hDIB;
// FINALLY get the DIB
BOOL bGotBits = GetDIBits(hDC, (HBITMAP)bitmap.GetSafeHandle(), 0L,
(DWORD)bi.biHeight, (LPBYTE)lpbi + (bi.biSize + nColors * sizeof(RGBQUAD)),
(LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS); // Use RGB for color table
if(!bGotBits) {
GlobalFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return hDIB;
}
// WriteDIB - Writes a DIB to file
// Returns - TRUE on success
// szFile - Name of file to write to
// hDIB - Handle of the DIB
BOOL CBitMapTestDlg::WriteDIB(LPTSTR szFile, HANDLE hDIB) {
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
if(!hDIB)
return FALSE;
CFile file;
if(!file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
return FALSE;
lpbi = (LPBITMAPINFOHEADER)hDIB;
int nColors = 1 << lpbi->biBitCount;
// Fill in the fields of the file header
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize = DWORD(GlobalSize(hDIB) + sizeof(hdr));
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof( hdr ) + lpbi->biSize + nColors *
sizeof(RGBQUAD));
// Write the file header
file.Write(&hdr, sizeof(hdr));
// Write the DIB header and the bits
file.Write(lpbi, (UINT)GlobalSize(hDIB));
return TRUE;
}
void CBitMapTestDlg::DC2BMP(HDC hdc, char* filename) {
CDC srcDC, memDC;
CBitmap bitmap, *pbitmap=NULL;
srcDC.Attach(hdc);
memDC.CreateCompatibleDC(&srcDC);
bitmap.CreateCompatibleBitmap(&srcDC, srcDC.GetDeviceCaps(HORZRES),
srcDC.GetDeviceCaps(VERTRES));
pbitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, srcDC.GetDeviceCaps(HORZRES),
srcDC.GetDeviceCaps(VERTRES), &srcDC, 0, 0, SRCCOPY);
HANDLE hDIB = DDBToDIB(bitmap, BI_RGB, NULL);
WriteDIB(filename, hDIB);
srcDC.Detach();
}
...全文
相关推荐
dc.rar_gdi复制窗口
把桌面DC拷贝到窗口绘画区域,利用线程,用到API函数StretchBlt
录制屏幕 基于MFC
用vc++,单击按钮而触发的屏幕录制功能。代码可以编译运行。
易语言DC快照转BMP源码
易语言DC快照转BMP源码例程程序结合易语言第三方常量支持库,调用API函数实现将DC快照转换为BMP图片格式。点评:本源码是BMP类型API的应用例程。 @易语言资源网。
Cmemdc.rar_CMem_CMemDC_CMemDC download_内存dc
可以方便使用的内存DC封装,CMemDC
内存DC路径层以及移动
用了一个简单的对话框程序 自绘需要实现的功能 运用了内存DC路径层 点击图形并移动 这个比较适合学习


