拷贝打印机dc不行,拷贝屏幕dc则可以

fangxing0 fangxing0 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
......
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();
}


...全文
评论 4
收藏 已收藏
分享
返回顶部
fangxing0
VC/MFC 16,550 成员 421,606 内容