MFC对话框的打印预览实现

1.创建MFC对话框工程,选择在共享库中调用。

2.添加文件

MainFrm.h, MyPreviewView.h, WrapperView.h, MainFrm.cpp, WrapperView.cpp

分别为:

MainFrm.h

 1 // MainFrm.h : interface of the CMainFrame class
 2 //
 3 /////
 4  
 5 #if !defined(AFX_MAINFRM_H__5C3F89A6_932E_11D3_8420_FC56F1C91E86__INCLUDED_)
 6 #define AFX_MAINFRM_H__5C3F89A6_932E_11D3_8420_FC56F1C91E86__INCLUDED_
 7  
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11 #include "wrapperview.h"
12  
13 class CMainFrame : public CFrameWnd
14 {  
15 public:    
16     CMainFrame(DRAWFUN pDraw,CWnd*pOldW,CWnd* pCallW,BOOL bDirect,LPCTSTR stTitle=NULL);   
17     CWnd*   pOldWnd;
18     CWnd*   pCallWnd;
19     DRAWFUN Draw;
20     BOOL    bDirectPrint;
21 protected:
22     DECLARE_DYNAMIC(CMainFrame)
23 public:
24 // Overrides
25     // ClassWizard generated virtual function overrides
26     //{{AFX_VIRTUAL(CMainFrame)
27     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
28     virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
29     //}}AFX_VIRTUAL
30 // Implementation
31 public:
32     virtual ~CMainFrame();
33 #ifdef _DEBUG
34     virtual void AssertValid() const;
35     virtual void Dump(CDumpContext& dc) const;
36 #endif
37  
38 protected:  // control bar embedded members
39     CStatusBar  m_wndStatusBar;
40     CToolBar    m_wndToolBar;
41     CWrapperView  *m_pView;
42  
43 // Generated message map functions
44 protected:
45     //{{AFX_MSG(CMainFrame)
46     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);   
47     //}}AFX_MSG
48     DECLARE_MESSAGE_MAP()
49 public:
50     afx_msg void OnClose();
51 };
52 /////
53 //{{AFX_INSERT_LOCATION}}
54 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
55 #endif // !defined(AFX_MAINFRM_H__5C3F89A6_932E_11D3_8420_FC56F1C91E86__INCLUDED_)

MyPreviewView.h

//MyPreviewView.h

#if !defined(AFX_MYPREVIEWVIEW_H__9FCA8680_907C_11D3_8412_9D0C7145F5C4__INCLUDED_)
#define AFX_MYPREVIEWVIEW_H__9FCA8680_907C_11D3_8412_9D0C7145F5C4__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyPreviewView.h : header file
//
#include <afxpriv.h>

/////
// CMyPreviewView view

class CMyPreviewView : public CPreviewView
{
protected:
    CMyPreviewView();           // protected constructor used by dynamic creation
    virtual ~CMyPreviewView();
    DECLARE_DYNCREATE(CMyPreviewView)

public:
    friend class CWrapperView;

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyPreviewView)
    protected:
    virtual void OnDraw(CDC* pDC);      // overridden to draw this view
    virtual void OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView);
    //}}AFX_VIRTUAL

// Implementation
protected:

#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

    virtual void OnActivateView(BOOL bActivate,CView* pActivateView, CView* pDeactiveView);

    // Generated message map functions
    //{{AFX_MSG(CMyPreviewView)
    afx_msg void OnPreviewClose();
    afx_msg void OnPreviewPrint();
        // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG

    friend BOOL CALLBACK _AfxMyPreviewCloseProc(CFrameWnd* pFrameWnd);

    DECLARE_MESSAGE_MAP()
};

/////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYPREVIEWVIEW_H__9FCA8680_907C_11D3_8412_9D0C7145F5C4__INCLUDED_)

WrapperView.h

 1 //WrapperView.h
 2 
 3 #if !defined(AFX_WRAPPERVIEW_H__AC579D20_8E3D_11D3_8410_E1CD9A2C01DC__INCLUDED_)
 4 #define AFX_WRAPPERVIEW_H__AC579D20_8E3D_11D3_8410_E1CD9A2C01DC__INCLUDED_
 5 
 6 #if _MSC_VER > 1000
 7 #pragma once
 8 #endif // _MSC_VER > 1000
 9 // WrapperView.h : header file
10 //
11 
12 #include "MyPreviewView.h"
13 #include "MainFrm.h"
14 
15 /////
16 // CWrapperView view
17 
18 class CWrapperView : public CScrollView
19 {
20 protected:
21     DECLARE_DYNCREATE(CWrapperView)
22     
23     CFrameWnd*    m_pFrameWnd;
24 public:
25     CWrapperView();
26     virtual ~CWrapperView();
27 
28     virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
29     void OnFilePrintPreview(CFrameWnd *pFrame);
30     BOOL DoPrintPreview(UINT nIDResource, CView* pPrintView,CRuntimeClass* pPreviewViewClass, CPrintPreviewState* pState);
31     void OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo,POINT, CMyPreviewView* pView);
32 // Overrides
33     // ClassWizard generated virtual function overrides
34     //{{AFX_VIRTUAL(CWrapperView)
35     protected:
36     virtual void OnPrint(CDC* pDC,CPrintInfo* pInfo);      // overridden to draw this view
37     virtual void OnDraw(CDC* pDC);      // overridden to draw this view
38     virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
39     //}}AFX_VIRTUAL
40 
41 // Implementation
42 protected:
43     
44 #ifdef _DEBUG
45     virtual void AssertValid() const;
46     virtual void Dump(CDumpContext& dc) const;
47 #endif
48 
49     // Generated message map functions
50 protected:
51     //{{AFX_MSG(CWrapperView)
52         // NOTE - the ClassWizard will add and remove member functions here.
53     afx_msg void OnFilePrint();
54     //}}AFX_MSG
55     DECLARE_MESSAGE_MAP()
56 };
57 
58 /////
59 
60 //{{AFX_INSERT_LOCATION}}
61 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
62 
63 #endif // !defined(AFX_WRAPPERVIEW_H__AC579D20_8E3D_11D3_8410_E1CD9A2C01DC__INCLUDED_)

MainFrm.cpp

  1 // MainFrm.cpp : implementation of the CMainFrame class
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "MainFrm.h"
  6 
  7 #ifdef _DEBUG
  8 #define new DEBUG_NEW
  9 #undef THIS_FILE
 10 static char THIS_FILE[] = __FILE__;
 11 #endif
 12 
 13 
 14 /////
 15 // CMainFrame
 16 
 17 IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
 18 
 19 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
 20     //{{AFX_MSG_MAP(CMainFrame)
 21     ON_WM_CREATE()    
 22     ON_WM_CLOSE()
 23     //}}AFX_MSG_MAP
 24 END_MESSAGE_MAP()
 25 
 26 static UINT indicators[] =
 27 {
 28     ID_SEPARATOR,           // status line indicator
 29     ID_INDICATOR_CAPS,
 30     ID_INDICATOR_NUM,
 31     ID_INDICATOR_SCRL,
 32 };
 33 
 34 /////
 35 // CMainFrame construction/destruction
 36 
 37 CMainFrame::CMainFrame(DRAWFUN pDraw,CWnd*pOldW,CWnd* pCallW,BOOL bDirect,LPCTSTR stTitle)
 38 {
 39     // TODO: add member initialization code here    
 40     Draw    =pDraw;
 41     pOldWnd    =pOldW;
 42     pCallWnd=pCallW;
 43     bDirectPrint=bDirect;
 44     CString ss;
 45     if(stTitle!=NULL)
 46         ss=stTitle;
 47     else
 48     {        
 49         pOldW->GetWindowText(ss);
 50         if(!ss.IsEmpty())
 51             ss=ss+_T(" (预览)");
 52         else
 53             ss=ss+_T("打印预览");
 54     }
 55 
 56     if(!Create(NULL,ss,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,CRect(200,200,500,500)))
 57         TRACE0("Failed to create view window\n");
 58 }
 59 
 60 
 61 CMainFrame::~CMainFrame()
 62 {
 63     pOldWnd->ShowWindow(SW_SHOW);
 64 
 65     pCallWnd=NULL;
 66     pOldWnd    =NULL;
 67     bDirectPrint=FALSE;
 68 }
 69 
 70 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 71 {
 72     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
 73         return -1;    
 74 
 75     CCreateContext context;
 76     context.m_pNewViewClass = RUNTIME_CLASS(CWrapperView);
 77     context.m_pCurrentFrame = this;
 78     context.m_pCurrentDoc = NULL;
 79     context.m_pLastView = NULL;
 80     m_pView = STATIC_DOWNCAST(CWrapperView, CreateView(&context)); //CreateView(&context);
 81     if(NULL!=m_pView){
 82         if(!bDirectPrint)
 83             m_pView->ShowWindow(SW_SHOW);
 84         SetActiveView(m_pView);
 85     }    
 86     SetIcon(pOldWnd->GetIcon(FALSE),FALSE);
 87     SetIcon(pOldWnd->GetIcon(TRUE),TRUE);
 88     ShowWindow(SW_MAXIMIZE);    
 89 
 90     CWinApp *pApp=AfxGetApp();        
 91     pApp->m_pMainWnd=this;
 92     if(bDirectPrint)
 93     {
 94         m_pView->SendMessage(WM_COMMAND, ID_FILE_PRINT);        
 95     }
 96     else
 97     {
 98         m_pView->OnFilePrintPreview(this);    
 99         pOldWnd->ShowWindow(SW_HIDE);
100     }
101 
102     return 0;
103 }
104 
105 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
106 {
107     if( !CFrameWnd::PreCreateWindow(cs) )
108         return FALSE;
109     // TODO: Modify the Window class or styles here by modifying
110     //  the CREATESTRUCT cs
111 
112     cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
113     cs.lpszClass = AfxRegisterWndClass(0);
114     return TRUE;
115 }
116 
117 /////
118 // CMainFrame diagnostics
119 
120 #ifdef _DEBUG
121 void CMainFrame::AssertValid() const
122 {
123     CFrameWnd::AssertValid();
124 }
125 
126 void CMainFrame::Dump(CDumpContext& dc) const
127 {
128     CFrameWnd::Dump(dc);
129 }
130 
131 #endif //_DEBUG
132 
133 /////
134 // CMainFrame message handlers
135 
136 BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
137 {
138     // let the view have first crack at the command
139     if (m_pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
140         return TRUE;
141 
142     // otherwise, do default handling
143     return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
144 }
145 
146 
147 
148 //
149 // 源代码中使用的框架销毁函数有bug,这里暂时不使用正常销毁-AWEN
150 void CMainFrame::OnClose()
151 {
152     // TODO: 在此添加消息处理程序代码和/或调用默认值
153 
154     //CFrameWnd::OnClose();
155     CFrameWnd::DestroyWindow();
156 }

WrapperView.cpp

  1 // WrapperView.cpp : implementation file
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "WrapperView.h"
  6 #include "MyPreviewView.h"
  7 #include "MainFrm.h"
  8 
  9 #ifdef _DEBUG
 10 #define new DEBUG_NEW
 11 #undef THIS_FILE
 12 static char THIS_FILE[] = __FILE__;
 13 #endif
 14 
 15 BOOL CALLBACK _AfxMyPreviewCloseProc(CFrameWnd* pFrameWnd);
 16 
 17 /////
 18 // CWrapperView
 19 
 20 IMPLEMENT_DYNCREATE(CWrapperView, CScrollView)
 21 
 22 CWrapperView::CWrapperView()
 23 {
 24     m_pFrameWnd = NULL;
 25     m_nMapMode = MM_TEXT; //default
 26 }
 27 
 28 CWrapperView::~CWrapperView()
 29 {
 30 }
 31 
 32 
 33 BEGIN_MESSAGE_MAP(CWrapperView, CScrollView)
 34     //{{AFX_MSG_MAP(CWrapperView)
 35         // NOTE - the ClassWizard will add and remove mapping macros here.    
 36     ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
 37     //}}AFX_MSG_MAP
 38 END_MESSAGE_MAP()
 39 
 40 void CWrapperView::OnDraw(CDC *pDC)
 41 {
 42     
 43 }
 44 
 45 void CWrapperView::OnPrint(CDC* pDC,CPrintInfo* pInfo)
 46 {
 47     if(pDC)
 48     {
 49         CMainFrame* pf=(CMainFrame*)::AfxGetMainWnd();        
 50         (*pf->Draw)(pDC,pInfo,(void*)pf->pCallWnd);        
 51     }
 52 }
 53 
 54 
 55 /////
 56 // CWrapperView diagnostics
 57 
 58 #ifdef _DEBUG
 59 void CWrapperView::AssertValid() const
 60 {
 61     CView::AssertValid();
 62 }
 63 
 64 void CWrapperView::Dump(CDumpContext& dc) const
 65 {
 66     CView::Dump(dc);
 67 }
 68 #endif //_DEBUG
 69 
 70 /////
 71 // CWrapperView message handlers
 72 
 73 BOOL CALLBACK _AfxMyPreviewCloseProc(CFrameWnd* pFrameWnd)
 74 {
 75     ASSERT_VALID(pFrameWnd);
 76 
 77     CMyPreviewView* pView = (CMyPreviewView*) pFrameWnd->GetDlgItem(AFX_IDW_PANE_FIRST);
 78     ASSERT_KINDOF(CPreviewView, pView);
 79 
 80     pView->OnPreviewClose();
 81     return FALSE;
 82 }
 83 
 84 BOOL CWrapperView::OnPreparePrinting(CPrintInfo* pInfo) 
 85 {
 86     // default preparation
 87     return DoPreparePrinting(pInfo);
 88 }
 89 
 90 void CWrapperView::OnFilePrint()
 91 {
 92     CMainFrame* pf=(CMainFrame*)::AfxGetMainWnd();
 93     if(pf->bDirectPrint)
 94         pf->ShowWindow(SW_HIDE);
 95     CView::OnFilePrint();    
 96     if(pf->bDirectPrint)
 97     {
 98         CWinApp *pApp=AfxGetApp();        
 99         pApp->m_pMainWnd=pf->pOldWnd;
100         pf->DestroyWindow();    
101     }
102 }
103 
104 
105 void CWrapperView::OnFilePrintPreview(CFrameWnd *pFrame)
106 {    
107     m_pFrameWnd = pFrame;
108 
109     CPrintPreviewState* pState = new CPrintPreviewState;
110     pState->lpfnCloseProc = _AfxMyPreviewCloseProc;
111 
112     if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,RUNTIME_CLASS(CMyPreviewView), pState))
113     {        
114 
115         TRACE0("Error: DoPrintPreview failed.\n");
116         AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
117         delete pState;
118     }
119 }
120 
121 BOOL CWrapperView::DoPrintPreview(UINT nIDResource, CView* pPrintView,CRuntimeClass* pPreviewViewClass, CPrintPreviewState* pState)
122 {
123     ASSERT_VALID_IDR(nIDResource);
124     ASSERT_VALID(pPrintView);
125     ASSERT(pPreviewViewClass != NULL);
126     ASSERT(pPreviewViewClass->IsDerivedFrom(RUNTIME_CLASS(CPreviewView)));
127     ASSERT(pState != NULL);
128 
129     ASSERT(m_pFrameWnd != NULL);
130     CFrameWnd* pParent = m_pFrameWnd; //STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd()); //
131     ASSERT_VALID(pParent);
132 
133     CCreateContext context;
134     context.m_pCurrentFrame = pParent;
135     context.m_pCurrentDoc = GetDocument();
136     context.m_pLastView = this;
137 
138     // Create the preview view object
139     CMyPreviewView* pView = (CMyPreviewView*)pPreviewViewClass->CreateObject();
140     if (pView == NULL)
141     {
142         TRACE0("Error: Failed to create preview view.\n");
143         return FALSE;
144     }
145     ASSERT_KINDOF(CPreviewView, pView);
146     pView->m_pPreviewState = pState;        // save pointer
147 
148     pParent->OnSetPreviewMode(TRUE, pState);    // Take over Frame Window
149 
150      //Create the toolbar from the dialog resource
151     pView->m_pToolBar = new CDialogBar;
152     if (!pView->m_pToolBar->Create(pParent, MAKEINTRESOURCE(nIDResource),
153         CBRS_TOP, AFX_IDW_PREVIEW_BAR))
154     {
155         TRACE0("Error: Preview could not create toolbar dialog.\n");
156         pParent->OnSetPreviewMode(FALSE, pState);   // restore Frame Window
157         delete pView->m_pToolBar;       // not autodestruct yet
158         pView->m_pToolBar = NULL;
159         pView->m_pPreviewState = NULL;  // do not delete state structure
160         delete pView;
161         return FALSE;
162     }
163     pView->m_pToolBar->m_bAutoDelete = TRUE;    // automatic cleanup
164 
165     if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
166         CRect(0,0,0,0), pParent, AFX_IDW_PANE_FIRST, &context))
167     {
168         TRACE0("Error: couldn't create preview view for frame.\n");
169         pParent->OnSetPreviewMode(FALSE, pState);   // restore Frame Window
170         pView->m_pPreviewState = NULL;  // do not delete state structure
171         delete pView;
172         return FALSE;
173     }
174 
175     pState->pViewActiveOld = pParent->GetActiveView();
176     CWrapperView* pActiveView = (CWrapperView*)pParent->GetActiveFrame()->GetActiveView();
177     if (pActiveView != NULL)
178         pActiveView->OnActivateView(FALSE, pActiveView, pActiveView);
179 
180     if (!pView->SetPrintView(pPrintView))
181     {
182         pView->OnPreviewClose();
183         return TRUE;            // signal that OnEndPrintPreview was called
184     }
185 
186     pParent->SetActiveView(pView);  // set active view - even for MDI
187 
188     // update toolbar and redraw everything
189     pView->m_pToolBar->SendMessage(WM_IDLEUPDATECMDUI, (WPARAM)TRUE);
190     pParent->RecalcLayout();            // position and size everything
191     pParent->UpdateWindow();
192 
193     return TRUE;
194 }
195 
196 // OnEndPrintPreview is here for swap tuning reasons
197 //  (see viewprev.cpp for complete preview mode implementation)
198 void CWrapperView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo,POINT, CMyPreviewView* pView)
199 {
200     ASSERT_VALID(pDC);
201     ASSERT_VALID(pView);
202     ASSERT(m_pFrameWnd != NULL);
203 
204     if (pView->m_pPrintView != NULL)
205         OnEndPrinting(pDC, pInfo);
206 
207     CFrameWnd* pParent = m_pFrameWnd;
208     ASSERT_VALID(pParent);
209 
210     // restore the old main window
211     pParent->OnSetPreviewMode(FALSE, pView->m_pPreviewState);
212 
213     // Force active view back to old one
214     pParent->SetActiveView(pView->m_pPreviewState->pViewActiveOld);
215     if (pParent != GetParentFrame())
216         OnActivateView(TRUE, this, this);   // re-activate view in real frame
217     pView->DestroyWindow();     // destroy preview view
218             // C++ object will be deleted in PostNcDestroy
219 
220     // restore main frame layout and idle message
221     pParent->RecalcLayout();
222     pParent->SendMessage(WM_SETMESSAGESTRING, (WPARAM)AFX_IDS_IDLEMESSAGE, 0L);
223     pParent->UpdateWindow();
224 }
225 
226 void CWrapperView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
227 {
228     CView::OnEndPrinting(pDC, pInfo);
229 }
230 
231 /
232 
233 IMPLEMENT_DYNCREATE(CMyPreviewView, CPreviewView)
234 
235 CMyPreviewView::CMyPreviewView()
236 {
237 }
238 
239 CMyPreviewView::~CMyPreviewView()
240 {
241 }
242 
243 BEGIN_MESSAGE_MAP(CMyPreviewView, CPreviewView)
244     //{{AFX_MSG_MAP(CMyPreviewView)
245     ON_COMMAND(AFX_ID_PREVIEW_CLOSE, OnPreviewClose)
246     ON_COMMAND(AFX_ID_PREVIEW_PRINT, OnPreviewPrint)
247         // NOTE - the ClassWizard will add and remove mapping macros here.
248     //}}AFX_MSG_MAP
249 END_MESSAGE_MAP()
250 
251 /////
252 // CMyPreviewView drawing
253 
254 void CMyPreviewView::OnDraw(CDC* pDC)
255 {    
256     CPreviewView::OnDraw(pDC);    
257 }
258 
259 /////
260 // CMyPreviewView diagnostics
261 
262 #ifdef _DEBUG
263 void CMyPreviewView::AssertValid() const
264 {
265     
266 }
267 
268 void CMyPreviewView::Dump(CDumpContext& dc) const
269 {
270 }
271 #endif //_DEBUG
272 
273 /////
274 // CMyPreviewView message handlers
275 
276 void CMyPreviewView::OnActivateView(BOOL bActivate, CView* pView1, CView *pView2)
277 {
278     CPreviewView::OnActivateView(bActivate, pView1, pView2);
279 }
280 
281 void CMyPreviewView::OnPreviewClose()
282 {
283     CMainFrame* pf=(CMainFrame*)::AfxGetMainWnd();
284     CWinApp *pApp=AfxGetApp();        
285     pApp->m_pMainWnd=pf->pOldWnd;
286     pf->DestroyWindow();
287 }
288 
289 void CMyPreviewView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView) 
290 {    
291     
292     CPreviewView::OnEndPrintPreview(pDC, pInfo, point, pView);
293 }
294 
295 void CMyPreviewView::OnPreviewPrint()
296 {
297     m_pPrintView->SendMessage(WM_COMMAND, ID_FILE_PRINT);
298     OnPreviewClose();               // force close of Preview
299 }

3.在stdafx.h中添加函数指针定义

typedef void(*DRAWFUN)(CDC* pDC,CPrintInfo* pInfo,void* pVoid);

4.在对话框类中添加上述类的头文件。

5.在对话框中添加按钮消息响应函数

1 void C我的打印预览Dlg::OnBnClickedOk()
2 {
3     m_PreFrame = new CMainFrame(DRWAPRINTER,this,this,FALSE);
4     if (!m_PreFrame) return;
5     m_PreFrame->ShowWindow(SW_SHOW);
6     m_PreFrame->UpdateWindow();
7 }

6.添加打印函数DRWAPRINTER定义,同时将其声明。

1 void DRWAPRINTER(CDC* pDC,CPrintInfo* pInfo,void* pVoid)
2 {    
3     //((CImageboxUI*)pVoid)->OnPrint(pDC,pInfo);    
4 }

 7.将要绘制的内容写进DRWAPRINTER函数即可。

1 void C我的打印预览Dlg::OnPrint(CDC * pDC, CPrintInfo* pInfo)
2 {
3     CBrush ColorBrush(RGB(100, 100, 0));//设置颜色
4     pDC->SelectObject(&ColorBrush);//将色彩赋与刷子
5     pDC->Ellipse(0,0,1000,1000);
6 }

8.至此即可完成MFC对话框中打印预览的实现。

9.自己写了一个打印字符串的函数:

 1 //打印字符串
 2 void C我的打印预览Dlg::PrintString(CString str, CString mfont, int x, int y, int sz, CDC & dc)
 3 {
 4     CFont font;
 5 
 6     VERIFY(font.CreatePointFont(sz, 
 7 
 8         mfont, 
 9 
10         &dc));//为DC创建字体
11 
12     CFont* def_font = dc.SelectObject(&font);//保存现在的字体
13 
14     dc.SetTextAlign(TA_TOP|TA_LEFT);
15 
16     CString s = str; //要打印的字符串(注意有长度的限制)
17 
18 
19     s += "\n"; //必须增加一个换行符号(因为后面while循环的要求)
20 
21     CString ss;
22 
23     int index;
24 
25     CSize size;
26 
27     size = dc.GetTextExtent("00", 2);//计算使用当前字体输出时文本所占大小、宽 度
28 
29     while((index = s.Find("\n")) != -1)
30 
31     {
32 
33         ss = s.Left(index);
34 
35         if(ss.Find("\r") != -1)//输入的字符串有回车符
36 
37             ss = s.Left(index-1);
38 
39         s = s.Mid(index+1);//取剩余的字符串 // AfxMessageBox("A"+ss+"A");
40 
41         dc.TextOut(x, y, ss);//打印到缓冲区
42 
43         y -= size.cy;
44 
45     }
46 
47 
48     dc.SelectObject(def_font); //恢复原来的字体
49 
50     font.DeleteObject(); 
51 }

这样就可以随心所欲地设置打印内容了。

感谢AWEN提供的巨大帮助!

 

另外,设置打印间距的函数为:

SetTextCharacterExtra(pDC->m_hDC, 5);

转载于:https://www.cnblogs.com/johnpher/archive/2012/10/18/2728936.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值