据说下面的函数可以实现DIB的打印,是我从csdn上找来的:/*//打印或者在屏幕左上角上画位图文件//pDC 打印机或者屏幕dc指针iLogPixelXiLogPixelY屏幕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文件名直接实现打印的方法也可以,谢谢了,分不够可以再加。

解决方案 »

  1.   

    http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=705
    VC中的图象打印问题
      

  2.   

    http://www.vckbase.com/document/viewdoc.asp?id=1078
    这是对应得文章
      

  3.   

    1。在OnDraw是由OnPrint调用的。如果选择打印,其实OnDraw中的CDC就是CPrintDC了。
    2。这两个是屏幕的象素宽和高吧。用来和打印机纸张的宽和高来计算图像的转换比例
    3。在OnDraw中直接调用就可以了。
    函数的使用方法在函数的说明中应该比较清楚啊
      

  4.   

    无论向何种设备绘制图形(包括显示器,打印机),程序会自己获取相应的CDC的,你只要用就可以。
      

  5.   

    我的意思是在一个函数中直接调用该函数就实现打印了,该怎么样实现?
    因为我的图片原图象是医学上的dicom图片,所以我将它在后台保存为bmp后再打印的,整个过程中是看不到bmp图片的,只知道我保存的文件路径。
    大家帮帮忙,我学vc也有一段时间了,可打印这方面还没有接触过,急啊。
      

  6.   

    http://www.codeproject.com/bitmap/imgviewer.asp
      

  7.   

    在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);
    }
      

  8.   

    为什么要调用框架啊,应该可以直接用OnPrintBmp这样的函数直接可以完成打印的所有工作吧,我的OnDraw是用来显示dicom图片的。
      

  9.   

    只要判断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
    {
     //这里做显示图片
    }
    }