100请教bmp打印问题

weiym 2004-08-05 08:32:38
据说下面的函数可以实现DIB的打印,是我从csdn上找来的:

/*

//打印或者在屏幕左上角上画位图文件

//pDC 打印机或者屏幕dc指针

iLogPixelX

iLogPixelY

屏幕DC的GetDeviceCaps(LOGPIXELSX)值,其中

iLogPixelX=DC.GetDeviceCaps(LOGPIXELSX);

iLogPixelY=DC.GetDeviceCaps(LOGPIXELSY);

const char *strFileName BMP图片文件名称

*/

void DrawBMP(CDC* pDC,int iLogPixelX,int iLogPixelY,const char *strFileName)

{

CDC MemDC; // 内存设备环境指针,在视的整个存在过程都将存在

CBitmap Bitmap,*pOldBmp;

CRect Source, Dest; // 记录源位图尺寸和最终显示尺寸

BITMAP bm;

if(MemDC.GetSafeHdc() == NULL)

{

HBITMAP hbitmap=(HBITMAP)LoadImage(0,strFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

Bitmap.Attach(hbitmap);

MemDC.CreateCompatibleDC(pDC);

Bitmap.GetObject(sizeof(bm),&bm);

pOldBmp=MemDC.SelectObject(&Bitmap);

Source.top=0;

Source.left=0;

Source.right= bm.bmWidth;

Source.bottom = bm.bmHeight;

Dest = Source;

}

pDC->DPtoLP(&Dest);

if(pDC->IsPrinting())

{

Dest.left=(int)(Dest.left*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);

Dest.right=(int)(Dest.right*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);

Dest.top=(int)(Dest.top*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);

Dest.bottom=(int)(Dest.bottom*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);

}

pDC->StretchBlt(Dest.left, Dest.top, Dest.right, Dest.bottom,

&MemDC, Source.left, Source.top, Source.right,Source.bottom, SRCCOPY);

MemDC.SelectObject(pOldBmp);

Bitmap.DeleteObject();

MemDC.DeleteDC();

return;

}

可有一些地方不明白:
1.如何获得打印机的pDC;
2.他是根据图象的文件名来实现打印的,用int iLogPixelX,int iLogPixelY参数是关于屏幕的,有什么用;
3.如何用该函数直接根据bmp文件名实现完整的打印?

小弟急啊,找了半天才找到这样一个实现bmp打印的函数,各位朋友帮帮忙,其他有实现根据bmp文件名直接实现打印的方法也可以,谢谢了,分不够可以再加。
...全文
244 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2004-08-05
  • 打赏
  • 举报
回复
只要判断pDC是否是打印状态就可以了。OnDraw同时可以做打印和普通显示,只是DC不同而已。
void C**View::OnDraw(CDC* pDC)
{
if(pDC->IsPrinting())
{
int iLogPixelX=pDC->GetDeviceCaps(LOGPIXELSX);

int iLogPixelY=pDC->GetDeviceCaps(LOGPIXELSY);

char *strFileName = "C:\\myBmp.bmp";
DrawBMP(pDC,iLogPixelX,iLogPixelY,strFileName);
}
else
{
//这里做显示图片
}
}
weiym 2004-08-05
  • 打赏
  • 举报
回复
为什么要调用框架啊,应该可以直接用OnPrintBmp这样的函数直接可以完成打印的所有工作吧,我的OnDraw是用来显示dicom图片的。
快乐鹦鹉 2004-08-05
  • 打赏
  • 举报
回复
在OnDraw中啊
void C**View::OnDraw(CDC* pDC)
{
int iLogPixelX=pDC->GetDeviceCaps(LOGPIXELSX);

int iLogPixelY=pDC->GetDeviceCaps(LOGPIXELSY);

char *strFileName = "C:\\myBmp.bmp";
DrawBMP(pDC,iLogPixelX,iLogPixelY,strFileName);
}
lixiaosan 2004-08-05
  • 打赏
  • 举报
回复
http://www.codeproject.com/bitmap/imgviewer.asp
weiym 2004-08-05
  • 打赏
  • 举报
回复
我的意思是在一个函数中直接调用该函数就实现打印了,该怎么样实现?
因为我的图片原图象是医学上的dicom图片,所以我将它在后台保存为bmp后再打印的,整个过程中是看不到bmp图片的,只知道我保存的文件路径。
大家帮帮忙,我学vc也有一段时间了,可打印这方面还没有接触过,急啊。

月光莫利亚 2004-08-05
  • 打赏
  • 举报
回复
无论向何种设备绘制图形(包括显示器,打印机),程序会自己获取相应的CDC的,你只要用就可以。
快乐鹦鹉 2004-08-05
  • 打赏
  • 举报
回复
1。在OnDraw是由OnPrint调用的。如果选择打印,其实OnDraw中的CDC就是CPrintDC了。
2。这两个是屏幕的象素宽和高吧。用来和打印机纸张的宽和高来计算图像的转换比例
3。在OnDraw中直接调用就可以了。
函数的使用方法在函数的说明中应该比较清楚啊
酒红绿叶 2004-08-05
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc.asp?id=1078
这是对应得文章
酒红绿叶 2004-08-05
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=705
VC中的图象打印问题

16,472

社区成员

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

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

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