如何通过HBITMAP句柄进行打印图像

huziwu 2012-02-09 11:35:54
前提,打印环境都处理好了,现在遇到的问题是:
1.如果是BMP文件,可以通过LoadImage来实现,但最后那个参数一定要带LR_CREATEDIBSECTION,否则打印不出来图像。但显示在屏幕DC上则没有问题,因此对于BMP文件操作,问题解决了。此点可以不理

2.如果是JPG文件,我调用别人做的一个接口LoadJpg,返回一个HBITMAP的句柄,用于显示没问题,但是打印就出不来,空白的。
现在就是想知道能否通过对这个HBITMAP进行处理,使其可以进行打印呢?

注:还有一种办法就是将JPG转换成BMP,再通过LoadImage来实现打印,但我不想用这种方法。
...全文
268 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
youngwolf 2012-02-09
  • 打赏
  • 举报
回复
DDB转化成DIB,网上搜,有api可用。
clxye314 2012-02-09
  • 打赏
  • 举报
回复
这是我去年年底写的代码,主要用于打印MapX地图用的。
你可以直接使用这个函数来打印任意DC的内容。


BOOL CGdiPlusHelper::Print( HDC &hDC, CRect &rect, LPCTSTR lpszTitle /*= NULL*/ )
{
CPrintDialog dlg( FALSE, PD_PAGENUMS|PD_HIDEPRINTTOFILE|PD_SELECTION, NULL);

if( IDOK == dlg.DoModal() )
{
CDC *pPrinteDC = CDC::FromHandle( dlg.GetPrinterDC() );

int nPaperWidth = pPrinteDC->GetDeviceCaps( HORZRES );
int nPaperHeigh = pPrinteDC->GetDeviceCaps( VERTRES );

double dXFactor = double(rect.Width()) / double(nPaperWidth);
double dYFactor = double(rect.Height())/ double(nPaperHeigh);
double dMaxFact = max( dXFactor, dYFactor );

int nWidthSrc = rect.Width();
int nHeighSrc = rect.Height();
int nWidthDst = int(rect.Width() / dMaxFact);
int nHeighDst = int(rect.Height()/ dMaxFact);

HDC hDCMem = CreateCompatibleDC( hDC );
HBITMAP hBitmap = CreateCompatibleBitmap( hDC, nWidthDst, nHeighDst );
SelectObject( hDCMem, hBitmap );
SetStretchBltMode( hDCMem, COLORONCOLOR );
StretchBlt( hDCMem, 0, 0, nWidthDst, nHeighDst, hDC, rect.left, rect.top, nWidthSrc, nHeighSrc, SRCCOPY );

pPrinteDC->StartDoc( lpszTitle );
BitBlt( pPrinteDC->m_hDC, (nPaperWidth-nWidthDst)/2, (nPaperHeigh-nHeighDst)/2, nWidthDst, nHeighDst, hDCMem, 0, 0, SRCCOPY );
pPrinteDC->EndDoc();

DeleteObject( hDCMem );
DeleteObject( hBitmap );

return TRUE;
}

return FALSE;
}

// 你需要打印的DC句柄
HDC hDC

// 你需要打印的区域大小
CRect &rect

// 如果采用虚拟打印机,会生成一个打印文件。此参数为默认打印文件名。
LPCTSTR lpszTitle


记得给分啊!
zgl7903 2012-02-09
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.powerpacks.printing.compatibility.vb6.printer.paintpicture.aspx#Y0
youngwolf 2012-02-09
  • 打赏
  • 举报
回复
你打印的时候,不是有一个DC吗?
一个DC和一个HBITMAP就能得到DIB数据。
huziwu 2012-02-09
  • 打赏
  • 举报
回复
只能通过HBITMAP进行转换,因为我只有HBITMAP,其它的都没有。可能这个HBITMAP都不能用GetBitmapBits来获得数据,猜测的没试过。

不过问题解决了,我找到了LoadJpg的源码,源码里HBITMAP是由CreateBitmap创建的,我改为用CreateDIBSection来创建HBITMAP,问题就解决了。

问题解决,分照给,希望哪位大大路过,看能不能将原问题给解答了。先挂着,明天下午结帖。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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