请教。拿到了打印机的DC.如何把它打印的内容存储成图片?

greenjava 2011-07-08 12:54:21
代码如下:
::StartPage(printDC);

framePrivate->spoolPages(printDC, page, page, graphicsContext);

::EndPage(printDC);


其中printDC的类型是HDC


打印DC与普通显示DC有什么区别吗?有什么要注意的吗?
...全文
199 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dylwx 2012-03-13
  • 打赏
  • 举报
回复
写文件发生错误,可用CFile的方法。
dfasri 2011-07-11
  • 打赏
  • 举报
回复
你的代码, 尝试过用随便一个窗体的DC能够保存成功吗?
greenjava 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dfasri 的回复:]
按平时的DC一样操作即可...
[/Quote]
我怎么存成文件也是失败呢?
附上我的存储函数

BOOL Hdc2BmpFile(HDC hdc,LPSTR szFilePath,DWORD dwHeight,DWORD dwWidth,int x,int y)
{
if( hdc == NULL || szFilePath == NULL)
return FALSE;


// Get dimensions
DWORD dwBPP, dwNumColors;

dwBPP = GetDeviceCaps(hdc, BITSPIXEL);
if(dwBPP=8) {
dwNumColors = 256;
} else {
dwNumColors = 0;
}

// Create compatible DC
HDC hdc2;
hdc2 = CreateCompatibleDC(hdc);

if(hdc2==NULL)
return FALSE;

// Create bitmap
HBITMAP bitmap;
BITMAPINFO bmpinfo;
LPVOID pBits;

bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth = dwWidth;
bmpinfo.bmiHeader.biHeight = dwHeight;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount = (WORD) dwBPP;
bmpinfo.bmiHeader.biCompression = BI_RGB;
bmpinfo.bmiHeader.biSizeImage = 0;
bmpinfo.bmiHeader.biXPelsPerMeter = 0;
bmpinfo.bmiHeader.biYPelsPerMeter = 0;
bmpinfo.bmiHeader.biClrUsed = dwNumColors;
bmpinfo.bmiHeader.biClrImportant = dwNumColors;

bitmap = CreateDIBSection(hdc, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);

if(bitmap==NULL)
return FALSE;

HGDIOBJ gdiobj;
gdiobj = SelectObject(hdc2, (HGDIOBJ)bitmap);

if((gdiobj==NULL) || (gdiobj==(void *)GDI_ERROR))
{
DeleteDC(hdc2);
return FALSE;
}

if (!BitBlt(hdc2, 0,0, dwWidth, dwHeight, hdc, x,y, SRCCOPY))
return FALSE;


RGBQUAD colors[256];
if(dwNumColors!=0)
{
dwNumColors = GetDIBColorTable(hdc2, 0, dwNumColors, colors);
}


// Fill in bitmap structures
BITMAPFILEHEADER bitmapfileheader;
BITMAPINFOHEADER bitmapinfoheader;

bitmapfileheader.bfType = 0x4D42;
bitmapfileheader.bfSize = ((dwWidth * dwHeight * dwBPP)/8) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));
bitmapfileheader.bfReserved1 = 0;
bitmapfileheader.bfReserved2 = 0;
bitmapfileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));

bitmapinfoheader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfoheader.biWidth = dwWidth;
bitmapinfoheader.biHeight = dwHeight;
bitmapinfoheader.biPlanes = 1;
bitmapinfoheader.biBitCount = (WORD)dwBPP;
bitmapinfoheader.biCompression = BI_RGB;
bitmapinfoheader.biSizeImage = 0;
bitmapinfoheader.biXPelsPerMeter = 0;
bitmapinfoheader.biYPelsPerMeter = 0;
bitmapinfoheader.biClrUsed = dwNumColors;
bitmapinfoheader.biClrImportant = 0;

// Write bitmap to disk
HANDLE hfile;
DWORD dwBytes;

hfile = CreateFileA(szFilePath,GENERIC_WRITE,0,NULL,CREATE_NEW|TRUNCATE_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hfile==INVALID_HANDLE_VALUE)
{
DeleteObject(bitmap);
DeleteDC(hdc2);
return FALSE;
}

WriteFile(hfile,&bitmapfileheader,sizeof(BITMAPFILEHEADER), &dwBytes, NULL);
WriteFile(hfile,&bitmapinfoheader,sizeof(BITMAPINFOHEADER), &dwBytes, NULL);
if(dwNumColors!=0)
WriteFile(hfile,colors,sizeof(RGBQUAD)*dwNumColors,&dwBytes,NULL);

WriteFile(hfile,pBits,(dwWidth*dwHeight*dwBPP)/8,&dwBytes,NULL);

CloseHandle(hfile);

// Clean up

DeleteObject(bitmap);
DeleteDC(hdc2);

return TRUE;
}
dfasri 2011-07-08
  • 打赏
  • 举报
回复
按平时的DC一样操作即可...

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧