void CMyPrintPreviewDlg::OnButton1()
{
CMyFrame* pf=new CMyFrame(this);// TODO: Add your control notification handler code here
}
2、增加新类:
用ClassWizard新建CMyFrame类(基类CFrameWnd),功能上相当于文档/视图的应用程序的框架窗口类
用ClassWizard新建CMyView类(基类CScrollView),功能上相当于文档/视图的应用程序的视图类。
增加CMyPreviewView类(基类CPreviewView,注意在头其定义头文件中加入包含afxpriv.h),用于打印预览界面的视图类。
3、对新生成的各类修改如下:
CMyFrame类:
①增加公有数据成员
CMyPrintPreviewDlg* m_pOldWnd:用于保存主对话框对象;
CMyView* m_pView:用于保存视图类对象;
②重载构造函数,保存对主对话框对象指针,创建窗口
CMyFrame::CMyFrame(CMyPrintPreviewDlg* pOld)
{
m_pOldWnd= pOld;
if(!Create(NULL,“打印预览”, WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE,CRect(200,200,500,500)))
TRACE0(“Failed to create view window\n”);
}
③修改析构函数,让主对话框显示
CMyFrame::~CMyFrame()
{m_pOldWnd->ShowWindow(SW_SHOW);
}
④用ClassWizard增加WM_Create消息处理函数,关联CMyView视图对象;调用其OnFilePrintPreview函数进行打印预览(若要直接打印,可直接向其发送消息);隐藏主对话框。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CMyView);
context.m_pCurrentFrame = this;
context.m_pCurrentDoc = NULL;
context.m_pLastView = NULL;
m_pView = STATIC_DOWNCAST(CMyView, CreateView(&context));
if(m_pView != NULL)
{
m_pView->ShowWindow(SW_SHOW);
SetActiveView(m_pView);
}
SetIcon(m_pOldWnd->GetIcon(FALSE),FALSE);
SetIcon(m_pOldWnd->GetIcon(TRUE),TRUE);
ShowWindow(SW_MAXIMIZE);
CWinApp *pApp=AfxGetApp();
pApp->m_pMainWnd=this;
m_pView->OnFilePrintPreview();
//m_pView->SendMessage(WM_COMMAND, ID_FILE_PRINT);//直接打印
m_pOldWnd->ShowWindow(SW_HIDE);
return 0;
}
修改CMyView类
①修改构造函数:将坐标射模式置为缺省模式。
CMyView::CMyView()
{
m_nMapMode = MM_TEXT;
}
②增加消息映射实现打印。
ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)
③重载虚函数OnPreparePrinting,调用DoPreparePrinting生成用于打印或打印预览的设备描述表。
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
return DoPreparePrinting(pInfo);
}
④增加公有函数OnFilePrintPreview,调用DoPrintPreview实现打印预览,该函数需要传入四个参数:打印预览工具条资源ID,执行打印及打印预览的视图对象指针,打印预览界面视图类的 CRuntimeClass指针,打印预览状态类CPrintPreviewState对象指针。
void CMyView::OnFilePrintPreview( )
{
CPrintPreviewState* pState = new CPrintPreviewState;
pState->lpfnCloseProc =_AfxMyPreviewCloseProc;//设置打印预览窗口关闭时的调用函数;
if(!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,RUNTIME_CLASS(CMyPreviewView), pState))
{
TRACE0(“Error: DoPrintPreview failed.\n”);
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
delete pState;
}
}
⑤在Myview.cpp文件中增加全局函数,_AfxMyPreviewCloseProc,当单击打印预览窗口关闭按钮时被调用。
BOOL CALLB