MFC打印图片

需求描述:有一段程序生成了一个图片,但是没有打印图片的功能,现在要把这个功能加上去。

最终的代码实现如下:

//add by slient begin
void CBarcodeDlg::OnPrintPicture()
{
/*DWORD dwflags=PD_ALLPAGES|PD_NOPAGENUMS|PD_USEDEVMODECOPIES|PD_SELECTION|PD_HIDEPRINTTOFILE;
    CPrintDialog dlg(FALSE, dwflags, NULL);
if(dlg.DoModal() == IDOK)
{
CDC dc;
dc.Attach(dlg.GetPrinterDC());
}*/


//打印对话框
    /*DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS 
        | PD_NOSELECTION | PD_HIDEPRINTTOFILE;
    CPrintDialog dlg(FALSE);
 
    if (dlg.DoModal() == IDOK)
    {
        //获得打印机DC
        HDC hDC = dlg.GetPrinterDC();
        if (hDC == NULL)
        {
            return;
        }
 
        //通过HDC获得CDC指针
        CDC* pDC = CDC::FromHandle(hDC);
 
        pDC->m_bPrinting = TRUE;
 
        //文档信息
        DOCINFO di; 
        ::ZeroMemory (&di, sizeof (DOCINFO));
        di.cbSize = sizeof (DOCINFO);
        di.lpszDocName = _T("Demo");
 
        //开始打印
        BOOL bPrinting = pDC->StartDoc(&di); 
 
        //for (UINT nPage = 0; nPage < 10 && bPrinting; nPage++)
        //{
            UINT nPage = 0;
 
            pDC->StartPage();
 
            //输出文本
            CString strText = _T("");
            strText.Format(_T("第%d页"), nPage + 1);
            pDC->TextOut(100, 0, strText);
            pDC->TextOut(100, 200, _T("111"));
            pDC->TextOut(400, 200, _T("222"));
            pDC->TextOut(700, 200, _T("333"));
            pDC->TextOut(1000, 200, _T("444"));
 
            bPrinting = (pDC->EndPage() > 0);
    // }
 
        if (bPrinting)
        {
             pDC->EndDoc(); 
        }
        else
        {
            pDC->AbortDoc();
        }
 
        //结束打印
        pDC->EndDoc();
 
        //删除DC
        pDC->DeleteDC();
    }*/


 
CDC* imagedc = CDC::FromHandle(imgOut.GetDC()); //这里的ImgOut是CImage类型的。
CRect m_rect(0,0,imgOut.GetHeight(),imgOut.GetWidth());
//获取图像的大小
//转换成bitmap begin
HBITMAP hBitmap=imgOut.Detach();
CBitmap bmp;    
bmp.DeleteObject();    
bmp.Attach(hBitmap); //  转换为CBitmap对象 
//转换成bitmap end
//bmp.GetClientRect(m_rect);


int formx,formy;
formx = imagedc->GetDeviceCaps(LOGPIXELSX);
formy = imagedc->GetDeviceCaps(LOGPIXELSY);


CPrintDialog m_printdlg (FALSE);
if (m_printdlg.DoModal()==IDOK)
{
CDC dc;


dc.Attach(m_printdlg.GetPrinterDC());


//获取打印机与屏幕的分辨率比率
int printerx,printery;
printerx = dc.GetDeviceCaps(LOGPIXELSX);
printery = dc.GetDeviceCaps(LOGPIXELSY);


double ratex,ratey;
ratex = (double)printerx/formx;
ratey = (double)printery/formy;


//打印图像
DOCINFO di; 
        ::ZeroMemory (&di, sizeof (DOCINFO));
        di.cbSize = sizeof (DOCINFO);
        di.lpszDocName = _T("Demo");
dc.StartDoc(&di);
dc.StretchBlt(30,40,(int)(m_rect.Width()*ratex),(int)(m_rect.Height()*ratey),imagedc,0,0,m_rect.Width(),m_rect.Height(),SRCCOPY);
dc.EndDoc();
}


}
//add by slient end




在这其中遇到的问题,然后在网上查找到的相关有用的资料:

一:VC中CDC与HDC的区别以及二者之间的转换

CDC是MFC的DC的一个类 
HDC是DC的句柄,API中的一个类似指针的数据类型. 
MFC类的前缀都是C开头的 
H开头的大多数是句柄 
这是为了助记,是编程读\写代码的好的习惯. 
CDC中所有MFC的DC的基类.常用的CClientDC dc(this);就是CDC的子类(或称派生类). 
CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄. 
记住下面的一句话,会有助于你的理解. 
MFC的类,是在用window API语句开发出来的有一定功能的小程序.(也可称为类).使用它的默认方法,就是,记住它的名字与参数(可以用笔记,代替脑记). 
如果将window api比做汇编语言 
那么MFC就相当于Basic语言.
cdc是设备描述表的基类,clientDC指代客户区的设备描述表,PaintDC只用于OnPaint()函数中

HDC是WINDOWS的一种数据类型,是设备描述句柄。    
    而CDC是MFC里的一个类,它封装了几乎所有的关于    
    HDC的操作。    
    也可以这样说,HDC定义的变量指向一块内存,这块    
    内存用来描述一个设备的相关的内容,所以也可以    
    认为HDC定义的是一个指针;而CDC类定义一个对象,    
    这个对象拥有HDC定义的一个设备描述表,同时也包    
    含与HDC相关的操作的函数。    
    这与HPEN和CPen,POINT与CPoint之间的差别是一样    
    的。

CDC 到HDC 的转化:
2007-05-09 12:04
方法一: 此方法在设备结束时不会销毁原来的资源(即:hDC,hBitmap)
CDC *pDC = CDC::FromHandle(hDC);
CBitmap *pBitmap = CBitmap::FromHandle(hBitmap);

方法二: 此方法在设备结束时会销毁原来的资源(即:hDC,hBitmap)
CDC dc;
dc.Attach(hDC);
CBitmap bit;
bit.Attach(hBitmap);


二:CImage类相关

http://blog.csdn.net/shuilan0066/article/details/7086371

http://wenku.baidu.com/link?url=vq6x3qKV5EvXar3x-LNy8w0OgN6WqJOMiMzjCZkgiO2wP6zWkY8Sb8k5STiysBHkv7ak01pqWjE9QsuiCvkZw0FCZw9IOjGDIzt_DqNdf_m

CImage类是基于GDI+的,为什么要引入CImage类? CBitmap类只能处理BMP格式的图片,非常受限,而CImage可以处理JPGE、GIF、BMP、PNG等多种格式的图片。它还可以和CBit马屁进行转换(因为所字载入的位图句柄都是HBITMAP)。

CBitmap只能加载BMP图片文件。

if(!PathFileExists(imgFilePath))

   return NULL;

CIamge nlmage;

nlmage.Load(imgFilePath);


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC对话框打印打印预览是一种方便的功能,可用于在MFC框架下实现打印文件或预览打印效果。在MFC中,可以通过以下步骤来实现这个功能: 首先,需要在对话框类中添加打印打印预览的消息映射函数。可以在对话框类的消息映射区内添加ON_COMMAND_EX_RANGE宏,并指定对应的消息ID,例如ID_FILE_PRINT和ID_FILE_PRINT_PREVIEW。 然后,在对应的消息处理函数中,需要进行一些打印打印预览的设置。可以使用MFC提供的打印对话框类CPrintDialog和打印预览类CPreviewView来进行相关设置。 在打印消息处理函数中,可以使用MFC提供的CDC(Device Context)类来完成实际的打印操作。首先,需要获取打印设备的DC对象,然后使用CDC对象的相关方法,如StartDoc、StartPage、TextOut等来完成具体的打印操作。最后,通过EndPage和EndDoc来结束打印过程。 在打印预览消息处理函数中,可以通过CPreviewView类来创建打印预览视图,并使用相关方法,如OnPrint、OnDraw等来实现预览打印的效果。同时,还可以在预览视图中提供一些操作控件,如放大、缩小、翻页等,方便用户查看打印效果。 需要注意的是,在进行打印打印预览操作时,可能需要对页面布局、字体、边距等进行设置,以确保最终打印结果符合预期。 通过以上步骤,可以实现MFC对话框的打印打印预览功能,方便用户将对话框中的内容输出到打印机或预览打印效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值