**
// PrintFrame.cpp : 实现文件
**
//
#include “stdafx.h”
#include “MFCPrintViewApp.h”
#include “PrintFrame.h”
// CPrintFrame
IMPLEMENT_DYNCREATE(CPrintFrame, CFrameWnd)
CPrintFrame::CPrintFrame()
{
}
CPrintFrame::~CPrintFrame()
{
m_pOldWnd->ShowWindow(SW_SHOW);
}
CPrintFrame::CPrintFrame(CPrintPreviewDlg* pOld)
{
m_pOldWnd = pOld;
// 生成窗口主框架
if (!Create(NULL, TEXT("打印预览 --- 贺昌锋"), WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, CRect(01, 01, 10, 10)))
TRACE0("Failed to create view window! ");
}
BEGIN_MESSAGE_MAP(CPrintFrame, CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
// CPrintFrame 消息处理程序
#define DMORIENT_PORTRAIT 1 //纵向
#define DMORIENT_LANDSCAPE 2 //横向
// 打印设置
void SetLandscapeMode(int PrintMode)
{
PRINTDLG pd;
pd.lStructSize = (DWORD)sizeof(PRINTDLG);
BOOL bRet = AfxGetApp()->GetPrinterDeviceDefaults(&pd);
if (bRet)
{
// protect memory handle with ::GlobalLock and ::GlobalUnlock
DEVMODE FAR *pDevMode = (DEVMODE FAR *)::GlobalLock(pd.hDevMode);
pDevMode->dmPaperSize = DMPAPER_A4; //将打印纸设置为A4
// set orientation to landscape
if (PrintMode == 1) //纵向打印
pDevMode->dmOrientation = DMORIENT_PORTRAIT;
else if (PrintMode == 2) //横向打印
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
::GlobalUnlock(pd.hDevMode);
}
}
int CPrintFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CPrintView);
context.m_pCurrentFrame = this;
context.m_pCurrentDoc = NULL;
context.m_pLastView = NULL;
// 创建空视图
m_pView = STATIC_DOWNCAST(CPrintView, CreateView(&context));
if (m_pView != NULL)
{
m_pView->ShowWindow(SW_SHOW);
SetActiveView(m_pView);
SetLandscapeMode(DMORIENT_LANDSCAPE);
// 打印预览
m_pView->OnFilePrintPreview();
//// 直接打印
// m_pView->SendMessage(WM_COMMAND, ID_FILE_PRINT);
}
CWinApp *pApp = AfxGetApp();
pApp->m_pMainWnd = this;
ShowWindow(SW_MAXIMIZE);
SetIcon(m_pOldWnd->GetIcon(FALSE), FALSE);
SetIcon(m_pOldWnd->GetIcon(TRUE), TRUE);
m_pOldWnd->ShowWindow(SW_HIDE);
return 0;
}
**
////PrintFrame.h
**
#pragma once
#include “PrintPreviewDlg.h”
#include “PrintView.h”
// CPrintFrame 框架 CPrintPreviewDlg PrintPreviewDlgCPrintView
class CPrintFrame : public CFrameWnd
{
DECLARE_DYNCREATE(CPrintFrame)
protected:
CPrintFrame(); // 动态创建所使用的受保护的构造函数
virtual ~CPrintFrame();
public:
CPrintFrame(CPrintPreviewDlg* pOld);
protected:
DECLARE_MESSAGE_MAP()
public:
CPrintPreviewDlg* m_pOldWnd; // 用于保存主对话框对象;
CPrintView* m_pView ; // 用于保存视图类对象;
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};
**
// PrintPreviewView.cpp : 实现文件
**
//
#include “stdafx.h”
#include “MFCPrintViewApp.h”
#include “PrintPreviewView.h”
#include “PrintFrame.h”
// CPrintPreviewView
IMPLEMENT_DYNCREATE(CPrintPreviewView, CPreviewView)
CPrintPreviewView::CPrintPreviewView()
{
}
CPrintPreviewView::~CPrintPreviewView()
{
}
BEGIN_MESSAGE_MAP(CPrintPreviewView, CPreviewView)
ON_COMMAND(AFX_ID_PREVIEW_CLOSE, OnPreviewClose)
ON_COMMAND(AFX_ID_PREVIEW_PRINT, OnPreviewPrint)
END_MESSAGE_MAP()
// CPrintPreviewView 诊断
#ifdef _DEBUG
void CPrintPreviewView::AssertValid() const
{
CPreviewView::AssertValid();
}
#ifndef _WIN32_WCE
void CPrintPreviewView::Dump(CDumpContext& dc) const
{
CPreviewView::Dump(dc);
}
#endif
#endif //_DEBUG
// CPrintPreviewView 消息处理程序
void CPrintPreviewView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CPreviewView::OnPrint(pDC, pInfo);
}
void CPrintPreviewView::OnDraw(CDC *pDC)
{
CPreviewView::OnDraw(pDC);
// 控制条的命令状态更新
m_pToolBar->PostMessage(WM_IDLEUPDATECMDUI, (WPARAM)TRUE);
}
void CPrintPreviewView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView)
{
CPreviewView::OnEndPrintPreview(pDC, pInfo, point, pView);
}
void CPrintPreviewView::OnPreviewClose()
{
CPreviewView::OnPreviewClose();
CPrintFrame* pf = (CPrintFrame*)::AfxGetMainWnd();
CWinApp *pApp = AfxGetApp();
pApp->m_pMainWnd = pf->m_pOldWnd;
pf->DestroyWindow();
}
void CPrintPreviewView::OnPreviewPrint()
{
CPreviewView::OnPreviewPrint( );
//m_pPrintView->SendMessage(WM_COMMAND, ID_FILE_PRINT);
}
////PrintPreviewView.h
#pragma once
// CPrintPreviewView 视图
class CPrintPreviewView : public CPreviewView
{
DECLARE_DYNCREATE(CPrintPreviewView)
protected:
CPrintPreviewView(); // 动态创建所使用的受保护的构造函数
virtual ~CPrintPreviewView();
public:
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
DECLARE_MESSAGE_MAP()
public:
void OnPreviewPrint();
void OnPreviewClose();
void OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView);
void OnDraw(CDC *pDC);
void OnPrint(CDC* pDC, CPrintInfo* pInfo);
};
// PrintView.cpp : 实现文件
//
#include “stdafx.h”
#include “MFCPrintViewApp.h”
#include “PrintView.h”
#include “PrintPreviewView.h”
#include “PrintFrame.h”
// CPrintView
IMPLEMENT_DYNCREATE(CPrintView, CView)
CPrintView::~CPrintView()
{
}
CPrintView::CPrintView() :m_rectPrint(0, 0, 10000, -200)
{
//m_rectPrint 打印区域矩形大小
}
BEGIN_MESSAGE_MAP(CPrintView, CView)
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
// CPrintView 绘图
void CPrintView::OnDraw(CDC* pDC)
{
CPrintFrame* pf = (CPrintFrame*)::AfxGetMainWnd();
//// 预览视图 拷贝
pf->m_pOldWnd->Paint(pDC);
}
// CPrintView 诊断
#ifdef _DEBUG
void CPrintView::AssertValid() const
{
CView::AssertValid();
}
#ifndef _WIN32_WCE
void CPrintView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif
#endif //_DEBUG
// 保留,暂未用
//// 打印结束回调函数
//BOOL CALLBACK _AfxPrintPreviewCloseProc(CFrameWnd* pFrameWnd)
//{
// ASSERT_VALID(pFrameWnd);
// CPrintPreviewView* pView = (CPrintPreviewView*)pFrameWnd->GetDlgItem(AFX_IDW_PANE_FIRST);
// ASSERT_KINDOF(CPreviewView, pView);
// pView->OnPreviewClose();
// return FALSE;
//}
// CPrintView 消息处理程序
BOOL CPrintView::OnPreparePrinting(CPrintInfo* pInfo)
{
pInfo->SetMaxPage(1);
return DoPreparePrinting(pInfo);
//// 注意,不可调用下句,否则报错
//return CView::OnPreparePrinting(pInfo);
}
void CPrintView::OnFilePrintPreview()
{
CPrintPreviewState* pState = new CPrintPreviewState();
//设置打印预览窗口关闭时的调用函数
//pState->lpfnCloseProc = _AfxPrintPreviewCloseProc;
//// 调用打印预览类:CPrintPreviewView
if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this, RUNTIME_CLASS(CPrintPreviewView), pState))
{
TRACE0("Error, DoPrintPreview failed. \n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
delete pState;
}
//// 注意,不可调用下句,否则报错
// CView::OnFilePrintPreview();
}
void CPrintView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CSize sizeTotal(m_rectPrint.Width(), -m_rectPrint.Height());
}
void CPrintView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
CView::OnBeginPrinting(pDC, pInfo);
}
void CPrintView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
CView::OnEndPrinting(pDC, pInfo);
}
void CPrintView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CView::OnPrint(pDC, pInfo);
}
// 保留,暂未用
void CPrintView::PrintPageHeader(CDC* pDC, UINT nPageNumber, CPrintInfo* pInfo)
{
int m_cyPrinter = 1;
int m_cxOffset = 1;
int m_cxWidth = 1;
CFont *pOldFont;
CFont fontHeader;
fontHeader.CreatePointFont(100, TEXT("FixedSys"), pDC);
pOldFont = (CFont *)(pDC->SelectObject(&fontHeader));
int nPosY, nPosX;
nPosY = 3 * m_cyPrinter;
nPosX = m_cxOffset;
pDC->TextOut(nPosX, nPosY, CString(_T("北京联基动力科技有限公司")));
CString str;
str.Format(_T("第 %d 页 / 共 %d 页"), nPageNumber, pInfo->GetMaxPage());
CSize size = pDC->GetTextExtent(str); //获取特定的字符串在屏幕上所占的宽度和高度
nPosX = m_cxOffset + m_cxWidth - size.cx;
pDC->TextOut(nPosX, nPosY, str);
pDC->MoveTo(m_cxOffset, 4 * m_cyPrinter);
pDC->LineTo(m_cxOffset + m_cxWidth, 4 * m_cyPrinter);
pDC->SelectObject(pOldFont);
fontHeader.DeleteObject();
}
/////////PrintView.h
#pragma once
// CPrintView 视图
class CPrintView : public CView
{
DECLARE_DYNCREATE(CPrintView)
protected:
CPrintView(); // 动态创建所使用的受保护的构造函数
virtual ~CPrintView();
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
DECLARE_MESSAGE_MAP()
public:
// 打印区域矩形大小
CRect m_rectPrint;
void OnPrint(CDC* pDC, CPrintInfo* pInfo);
void OnInitialUpdate();
void OnFilePrintPreview();
void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
BOOL OnPreparePrinting(CPrintInfo* pInfo);
// 保留,暂未用
void PrintPageHeader(CDC* pDC, UINT nPageNumber, CPrintInfo* pInfo);
};
// PrintPreviewDlg.cpp : 实现文件
//
#include “stdafx.h”
#include “MFCPrintViewApp.h”
#include “PrintPreviewDlg.h”
#include “afxdialogex.h”
#include “PrintFrame.h”
#include “ViewExt.h”
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CPrintPreviewDlg 对话框
- CPrintPreviewDlg::CPrintPreviewDlg(CWnd* pParent / =NULL/)
-
CDialogEx(CPrintPreviewDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CPrintPreviewDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CPrintPreviewDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_PRINT, &CPrintPreviewDlg::OnBnClickedButtonPrint)
ON_BN_CLICKED(IDC_BUTTON_PRINTVIEW, &CPrintPreviewDlg::OnBnClickedButtonPrintview)
END_MESSAGE_MAP()
// CPrintPreviewDlg 消息处理程序
BOOL CPrintPreviewDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
RECT rect;
GetClientRect(&rect);
rect.left= 10;
rect.top = 10;
rect.bottom = 700;
rect.right = 700;
CRuntimeClass* pViewRuntimeClass = RUNTIME_CLASS(CPrintView);
m_pmView = (CPrintView*)pViewRuntimeClass->CreateObject();
m_pmView->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rect, this, 123, NULL);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CPrintPreviewDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
Paint(m_pmView->GetDC());
}
}
void CPrintPreviewDlg::Paint(CDC* pDC ){
pDC->MoveTo(100, 100);
pDC->LineTo(600, 600);
pDC->TextOut(30, 10, TEXT("视图打印预览 Windows 10 专业版 + VS2013 Ultimate"));
pDC->TextOut(30, 300, TEXT("程序编者:贺昌锋,微信:13087561830,2019-04-10 星期三"));
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CPrintPreviewDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}
void CPrintPreviewDlg::OnBnClickedButtonPrint()
{
// TODO: 在此添加控件通知处理程序代码
}
void CPrintPreviewDlg::OnBnClickedButtonPrintview()
{
CPrintFrame* pf = new CPrintFrame(this);
}
// PrintPreviewDlg.h : 头文件
//
#pragma once
#include “PrintView.h”
#include “ViewExt.h”
// CPrintPreviewDlg 对话框
class CPrintPreviewDlg : public CDialogEx
{
// 构造
public:
CPrintPreviewDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_MFCAPPLICATION8_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonPrint();
afx_msg void OnBnClickedButtonPrintview();
void Paint(CDC* pDC );
// 对话框的视图
CPrintView* m_pmView;
};
//// Resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 MFCPrintView.rc 使用
//
#define IDD_MFCAPPLICATION8_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_BUTTON_PRINT 1000
#define IDC_BUTTON_PRINTVIEW 1001
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1002
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
///// MFCPrintView.rc
// Microsoft Visual C++ generated resource script.
//
#include “resource.h”
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include “targetver.h”
#endif
#include “afxres.h”
#include “verrsrc.h”
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
“resource.h\0”
END
2 TEXTINCLUDE
BEGIN
“#ifndef APSTUDIO_INVOKED\r\n”
“#include ““targetver.h””\r\n”
“#endif\r\n”
“#include ““afxres.h””\r\n”
“#include ““verrsrc.h””\r\n”
“\0”
END
3 TEXTINCLUDE
BEGIN
“#define _AFX_NO_SPLITTER_RESOURCES\r\n”
“#define _AFX_NO_OLE_RESOURCES\r\n”
“#define _AFX_NO_TRACKER_RESOURCES\r\n”
“#define _AFX_NO_PROPERTY_RESOURCES\r\n”
“\r\n”
“#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n”
“LANGUAGE 4, 2\r\n”
"#include ““res\MFCApplication8.rc2"” // 非 Microsoft Visual C++ 编辑的资源\r\n”
“#include ““l.CHS\afxres.rc”” // 标准组件\r\n”
“#if !defined(_AFXDLL)\r\n”
“#include ““l.CHS\afxribbon.rc”” // MFC 功能区和控制条资源\r\n”
“#endif\r\n”
“#endif\r\n”
“\0”
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON “res\MFCPrintView.ico”
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_MFCAPPLICATION8_DIALOG DIALOGEX 0, 0, 491, 387
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION “视图打印预览 — 贺昌锋”
FONT 10, “MS Shell Dlg”, 400, 0, 0x1
BEGIN
DEFPUSHBUTTON “确定”,IDOK,434,344,50,14
PUSHBUTTON “取消”,IDCANCEL,434,324,50,14
CTEXT “TODO: 在此放置对话框控件。”,IDC_STATIC,20,14,464,8
PUSHBUTTON “Print”,IDC_BUTTON_PRINT,434,278,50,14
PUSHBUTTON “PrintView”,IDC_BUTTON_PRINTVIEW,434,301,50,14
END
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK “StringFileInfo”
BEGIN
BLOCK “080404b0”
BEGIN
VALUE “CompanyName”, “TODO: <公司名>”
VALUE “FileDescription”, “MFCPrintViewApp”
VALUE “FileVersion”, “1.0.0.1”
VALUE “InternalName”, “MFCPrintViewApp.exe”
VALUE “LegalCopyright”, “TODO: © <公司名>。 保留所有权利。”
VALUE “OriginalFilename”, “MFCPrintViewApp.exe”
VALUE “ProductName”, “TODO: <产品名>”
VALUE “ProductVersion”, “1.0.0.1”
END
END
BLOCK “VarFileInfo”
BEGIN
VALUE “Translation”, 0x804, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_MFCAPPLICATION8_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 484
TOPMARGIN, 7
BOTTOMMARGIN, 380
END
END
#endif // APSTUDIO_INVOKED
#endif // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE 4, 2
#include “res\MFCPrintView.rc2” // 非 Microsoft Visual C++ 编辑的资源
#include “l.CHS\afxres.rc” // 标准组件
#if !defined(_AFXDLL)
#include “l.CHS\afxribbon.rc” // MFC 功能区和控制条资源
#endif
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED