mfc實現圖文列印__mfc

來源:互聯網
上載者:User

 

mfc實現圖文列印

2011-07-06 15:27 4人閱讀 評論(0) 收藏 編輯 刪除

聲明:此功能非原創,筆者只是在原創的基礎上改進了一些,以達到開發項目的目的。

以下的內容,可能有些人見過,但既然我貼在這兒,就肯定有一些東西,你沒見過,本文主要實現圖文列印。

在MFC下實現列印步驟:

/****

本文提供的CPrintFrame和CPrintView類是連個可重用的類,開發人員只需要把這兩個類對應的四個檔案拷貝到工程檔案所在目錄中(PrintFrame.h,PringtView.h,PrintFrame.cpp,PrintView.cpp),並將這四個檔案加入工程,並在需要執行列印功能的代碼處加入

#include “PrintFrame.h”

#include “PrintView.h”

1.     建立一個CPrintFrame的對象,設該對象的指標為pFrame,並將對話方塊的指標傳給該對象的m_pCallerDlg,即pFrame->m_pCallerDlg = this;

2.     調用對象的Create函數建立架構視窗;例如pFrame->Create(NULL,"頻譜列印",WS_OVERLAPPEDWINDOW,CRect(0,0,0,0));

3.     如果要執行列印,則調用pFrame->m_pView->OnMyPrint();

4.     如果要執行預覽列印,則調用:

pFrame->m_pView->OnMyPrintPreview();                   

例如:

void CDlgPrintDlg::OnPrint() //執行列印功能

{

CPrintFrame *pFrame = new CPrintFrame;

pFrame->m_pCallerDlg = this;

pFrame->Create(NULL,"Curve

Print",WS_OVERLAPPEDWINDOW,CRect(0,0,0,0));

pFrame->m_pView->OnMyPrint();

}

 

void CDlgPrintDlg::OnPrintPreview() //執行預覽列印功能

{

CPrintFrame *pFrame = new CPrintFrame;

pFrame->m_pCallerDlg = this;

pFrame->Create(NULL,"Curve Print

Preview",WS_OVERLAPPEDWINDOW,CRect(0,0,0,0));

pFrame->m_pView->OnMyPrintPreview();                 

}

5.     在對話方塊中響應 WM_BEGIN_PRINTING, WM_END_PRINTING,WM_MY_PRINT訊息,分別完成列印的初始化,釋放和具體的列印操作;

如在樣本程式中添加了三個訊息響應函數來執行該功能。

ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting)

ON_MESSAGE(WM_END_PRINTING,OnEndPrinting)

ON_MESSAGE(WM_MY_PRINT,OnMyPrint)

  其中OnMyPrint是跟具體要列印什麼內容有關的開發人員要重點完成的代碼,可以列印表格,圖片,資料,只要GDI繪圖可以進行的操作在這裡都可以完成。由於預覽列印的一部分工作在CView類裡完成,因此在使用者程式中只需要相應WM_MY_PRINT訊息就可以執行預覽列印的功能,而不需要另外編寫預覽列印代碼。

  然後按照上述5個步驟進行即可以實現一個功能完整的列印程式,利用上述類實現對話方塊列印不但節省開發人員許多時間,而且功能很強大,能達到很專業的水平,但是該方法有一個缺點,筆者發現如果開發人員使用靜態串連的MFC庫時則會出錯,只適用於Use MFC in a Shelled DLL情況,而且必須使程式為Debug版本的。

下面說一下我是如何向OnMyPrint(WPARAM wParam,LPARAM lParam)添加代碼

第一個參數,傳遞的是控制代碼,第二個參數。。。沒用到。。

先看下預覽列印的效果吧:


下面再解釋下實現的代碼:

intnWidth=pDC->GetDeviceCaps(HORZRES);

intnHeight=pDC->GetDeviceCaps(VERTRES);

intghdf=pDC->GetDeviceCaps(LOGPIXELSY);

LRESULT CExamineeyeDlg::OnMyPrint(WPARAMwParam,LPARAM lParam)
{
      
       CDC* pDC                   =(CDC*)wParam;
       CFont font;//字型類型
       CFont *oldfont;
       CPoint point;
       CString ss="在對話方塊中使用預覽列印";
       intnWidth=pDC->GetDeviceCaps(HORZRES);//得到紙張的寬度
       intnHeight=pDC->GetDeviceCaps(VERTRES);//得到紙張的寬度
       intghdf=pDC->GetDeviceCaps(LOGPIXELSY);//得到紙張的像素dpi
       CRectDrawRect(0,0,nWidth,nHeight),rect,tempRect,tempRect1;          
       DrawRect.InflateRect(-100,-nHeight/8,-100,-50);//InflateRect函數增大或減小指定矩形的寬和高
       //參數的順序為左上右下
       pDC->Rectangle(&DrawRect);     //畫矩形
       tempRect1=tempRect;
       font.CreateFont(-MulDiv(25,-pDC->GetDeviceCaps(LOGPIXELSY),72),
              0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
              OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
                                   VARIABLE_PITCH|FF_SWISS,_T("幼圓"));//25為字型大小
       oldfont=pDC->SelectObject(&font);//設定字型
       tempRect=DrawRect;
       tempRect.InflateRect(0,nHeight/12,0,0);
       pDC->DrawText(str1[9],&tempRect,DT_CENTER|DT_TOP|DT_SINGLELINE);//將文字繪出來


       //pDC->SelectObject(oldfont);
       font.DeleteObject();//需要刪除font,以重新分配記憶體
       font.CreateFont(-MulDiv(18,-pDC->GetDeviceCaps(LOGPIXELSY),72),
              0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
              OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
              VARIABLE_PITCH|FF_SWISS,_T("黑體"));
       pDC->SelectObject(&font);
       tempRect.InflateRect(0,-nHeight/20,0,0);
      
       pDC->DrawText(str1[8],&tempRect,DT_CENTER|DT_TOP|DT_SINGLELINE);


       font.DeleteObject();
       font.CreateFont(-MulDiv(12,-pDC->GetDeviceCaps(LOGPIXELSY),72),
              0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
              OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
              VARIABLE_PITCH|FF_SWISS,_T("宋體"));
       pDC->SelectObject(&font);
       tempRect.InflateRect(-100,-nHeight/24,-300,0);
       pDC->MoveTo(DrawRect.left,DrawRect.top+(DrawRect.bottom-DrawRect.top)/28);//這一條和下面一條來實現畫線
       pDC->LineTo(DrawRect.right,DrawRect.top+(DrawRect.bottom-DrawRect.top)/28);//
       pDC->DrawText(str1[0],&tempRect,DT_LEFT|DT_TOP|DT_SINGLELINE);//其中DT_LEFT表示靠左對齊
       pDC->DrawText(str1[1],&tempRect,DT_CENTER|DT_TOP|DT_SINGLELINE);
       pDC->DrawText(str1[2],&tempRect,DT_RIGHT|DT_TOP|DT_SINGLELINE);
       tempRect.InflateRect(0,-nHeight/30,0,0);
       pDC->MoveTo(DrawRect.left,DrawRect.top+(DrawRect.bottom-DrawRect.top)/28*2);
       pDC->LineTo(DrawRect.right,DrawRect.top+(DrawRect.bottom-DrawRect.top)/28*2);
       pDC->DrawText(str1[3],&tempRect,DT_LEFT|DT_TOP|DT_SINGLELINE);
       pDC->DrawText(str1[4],&tempRect,DT_CENTER|DT_TOP|DT_SINGLELINE);
       pDC->DrawText(str1[5],&tempRect,DT_RIGHT|DT_TOP|DT_SINGLELINE);
       tempRect.InflateRect(0,-nHeight/30,0,0);
       pDC->MoveTo(DrawRect.left,DrawRect.top+(DrawRect.bottom-DrawRect.top)/28*3);
       pDC->LineTo(DrawRect.right,DrawRect.top+(DrawRect.bottom-DrawRect.top)/28*3);
       pDC->DrawText(str1[6],&tempRect,DT_LEFT|DT_TOP|DT_SINGLELINE);
      
       pDC->SelectObject (oldfont);
       //以上為顯示文字

 


       //以下為顯示圖片
       HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, pForm->GetCapPath()+"pic1.bmp", IMAGE_BITMAP,
              0, 0, LR_CREATEDIBSECTION |LR_DEFAULTSIZE | LR_LOADFROMFILE);

//原作者在顯示圖片時,用的函數為LoadBitmap(),這個函數的功能有限,而且必須將圖片載入到mfc中的位元影像中,對於想要動態顯示圖片的話,很不方便,所我採用了 LoadImage()函數

       BITMAPbitmap;
       ::GetObject(hBitmap,sizeof(BITMAP),&bitmap);
       doubledScale=(double)m_cxWidth/bitmap.bmWidth;
       int nScaledWidth=m_cxWidth/2;
       intnScaledHeight=(int)(bitmap.bmHeight*dScale)/2;
      
       HDC dcMem;
       dcMem=::CreateCompatibleDC(pDC->m_hDC);
       HBITMAPhOldBmp=(HBITMAP)::SelectObject(dcMem,hBitmap);
      
       int nVertCenterPos =pDC->GetDeviceCaps (VERTRES) / 2;
::StretchBlt(pDC->m_hDC,DrawRect.left+100,nHeight/3,nScaledWidth,nScaledHeight,dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
::StretchBlt(pDC->m_hDC,nWidth/2+100,nHeight/3,nScaledWidth,nScaledHeight,dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
      
       //StretchBlt的第二個和第三個參數可以調整圖片的位置,第四個和第五個參數可以調整圖片的大小
      
       ::SelectObject(dcMem,hOldBmp);
       ::DeleteDC(dcMem);
       ::DeleteObject(hBitmap);

       return TRUE;
}

做完這些,就可以完成列印了,不過存在一個問題還沒有測試,就是在本機上設計好的格式,在其它機器上是否會打亂,我還不知道,有待於驗證。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.