按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
#0123 nEndPage = printInfo。GetMinPage();
#0124 if (nEndPage 》 printInfo。GetMaxPage())
#0125 nEndPage = printInfo。GetMaxPage();
674
…………………………………………………………Page 737……………………………………………………………
第 12 章 列印與預樱А�
#0126
#0127 if (nStartPage 《 printInfo。GetMinPage())
#0128 nStartPage = printInfo。GetMinPage();
#0129 if (nStartPage 》 printInfo。GetMaxPage())
#0130 nStartPage = printInfo。GetMaxPage();
#0131
#0132 int nStep = (nEndPage 》= nStartPage) ? 1 : …1;
#0133 nEndPage = (nEndPage == 0xffff) ? 0xffff : nEndPage + nStep;
#0134
#0135 VERIFY(strTemp。LoadString(AFX_IDS_PRINTPAGENUM));
#0136
#0137 // begin page printing loop
#0138 BOOL bError = FALSE;
#0139 for (printInfo。m_nCurPage = nStartPage;
#0140 printInfo。m_nCurPage != nEndPage; printInfo。m_nCurPage += nStep)
#0141 {
#0142 OnPrepareDC (&dcPrint; &printInfo);
#0143
#0144 // check for end of print
#0145 if (!printInfo。m_bContinuePrinting)
#0146 break;
#0147
#0148 // write current page
#0149 TCHAR szBuf'80';
#0150 wsprintf(szBuf; strTemp; printInfo。m_nCurPage);
#0151 dlgPrintStatus。SetDlgItemText(AFX_IDC_PRINT_PAGENUM; szBuf);
#0152
#0153 // set up drawing rect to entire page (in logical coordinates)
#0154 printInfo。m_rectDraw。SetRect(0; 0;
#0155 dcPrint。GetDeviceCaps(HORZRES);
#0156 dcPrint。GetDeviceCaps(VERTRES));
#0157 dcPrint。DPtoLP(&printInfo。m_rectDraw);
#0158
#0159 // attempt to start the current page
#0160 if (dcPrint。StartPage() 《 0)
#0161 {
#0162 bError = TRUE;
#0163 break;
#0164 }
#0165
#0166 // must call OnPrepareDC on newer versions of Windows because
#0167 // StartPage now resets the device attributes。
#0168 if (afxData。bMarked4)
#0169 OnPrepareDC(&dcPrint; &printInfo);
#0170
#0171 ASSERT(printInfo。m_bContinuePrinting);
675
…………………………………………………………Page 738……………………………………………………………
第篇 深入 MFC 程式設計
#0172
#0173 // page successfully started; so now render the page
#0174 OnPrint (&dcPrint; &printInfo);
#0175 if (dcPrint。EndPage() 《 0 || !_AfxAbortProc(dcPrint。m_hDC; 0))
#0176 {
#0177 bError = TRUE;
#0178 break;
#0179 }
#0180 }
#0181
#0182 // cleanup document printing process
#0183 if (!bError)
#0184 dcPrint。EndDoc();
#0185 else
#0186 dcPrint。AbortDoc();
#0187
#0188 AfxGetMainWnd()…》EnableWindow(); // enable main window
#0189
#0190 OnEndPrinting (&dcPrint; &printInfo); // clean up after printing
#0191 dlgPrintStatus。DestroyWindow();
#0192
#0193 dcPrint。Detach(); // will be cleaned up by CPrintInfo destructor
#0194 }
#0195 }
图12…4 CView::OnFilePrint 源代码,这是打印命令的第一战场。标出号码
的是重要动作, 稍后将有补充说明。
以下是CView::OnFilePrint 函数之中重要动作的说明。你可以将这份说明与上一节「列
印动作的背景原理」做一比对,就能够明白MFC 在什么地方为我们做了什么事情,也
才因此能够体会,究竟我们该在什么地方改写虚拟函数,放入我们自己的补强程序代码。
676
…………………………………………………………Page 739……………………………………………………………
第 12 章 列印與預樱А�
OnFilePrint 首先在堆栈中产生一个CPrintInfo 对象,并构造之,使其部份成员变量拥
有初值。CPrintInfo 是一个用来记录打印机资料的结构,其构造式配置了一个Win32 通
用打印对话框(mon print dialog)并将它指定给m_pPD :
// in AFXEXT。H
struct CPrintInfo // Printing information structure
{
CPrintDialog* m_pPD; // pointer to print dialog
BOOL m_bPreview; // TRUE if in preview mode
BOOL m_bDirect; // TRUE if bypassing Print Dialog
。。。
};
上述的成员变量m_bPreview 如果是TRUE,表示处于预览模式,FALSE 表示处于打印
模式;成员变量m_bDirect 如果是TRUE,表示省略【打印】对话框,FALSE 表示需显
示【打印】对话框。
上面出现过的CPrintDialog,用来更贴近描述打印对话框:
class CPrintDialog : public CmonDialog
{
public:
PRINTDLG& m_pd;
BOOL GetDefaults();
LPDEVMODE GetDevMode() const; // return DEVMODE
CString GetDriverName() const; // return driver name
CString GetDeviceName() const; // return device name
CString GetPortName() const; // return