按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
if (!IsDialogMessage(hAbortDlgWnd; &msg)) {
TranslateMessage(&msg);
666
…………………………………………………………Page 729……………………………………………………………
第 12 章 列印與預樱А�
DispatchMessage(&msg);
}
return (!bAbort);
}
你可以从VC++ 4。0 所附的这个范例程序获得有关打印的极佳实例:
MSDEVSAMPLESSDKWIN32PRINTER
也可以在Charles Petzold 所着的Programming Windows 3。1 第15 章,或是其新版
Programming Windows 95 第15 章,获得更深入的资料。
Windows 程序
取得打印机DC (hPr) ,于是加载打印机驱动程序(DRV)
Escape(hPr; STARTDOC。。。) ,于是DRV 初始化并加载Print Manager
各式各样的GDI 绘图函数(储存为metafile ,~MF 档)
Escape(hPr; NEWFRAME。。。)
DRV 解读metafile ,转换为control sequences 或Postscript ,传给GDI 。
GDI 把DRV 的输出储存在~SPL 暂存盘中,并删除~MF 档。
GDI 送消息给Printer Manager ,要求打印机输出。应用程序继续进行自己的动作
Printer Manager 读~SPL 档,利用Openm、Writem 等API 函数把资料
)
(打印机命令码送往打印机,完毕后删除~SPL 档。
图12…3 Windows 程序的打印机输出动作详解
667
…………………………………………………………Page 730……………………………………………………………
第篇 深入 MFC 程式設計
以下就是SDK 程序中有关打印程序的一个实际片段。
#01 hSaveCursor = SetCursor(hHourGlass); // 把鼠标光标设为砂漏状
#02 hPr = CreateDC(〃HP LaserJet 4P/4MP〃; 〃HPPCL5E〃; 〃LPT1:〃; (LPSTR) NULL);
#03
#04 // 设定AbortProc callback 函数
#05 lpAbortProc = MakeProcInstance(AbortProc; hInst);
#06 Escape(hPr; SETABORTPROC; NULL; (LPSTR) (long) lpAbortProc; (LPSTR) NULL);
#07 bAbort = FALSE;
#08
#09 Escape(hPr; STARTDOC; 4; 〃PrntFile text〃; (LPSTR) NULL);
#10
#11 // 设定Printing 对话框及其窗口函数
#12 lpPrintingDlg = MakeProcInstance(PrintingDlg; hInst);
#13 hPrintingDlgWnd = CreateDialog(hInst; 〃PrintingDlg〃; hWnd; lpPrintingDlg);
#14 ShowWindow (hPrintingDlgWnd; SW_NORMAL);
#15 EnableWindow(hWnd; FALSE); // 令其父窗口 (也就是程序的主窗口) 除能
#16 SetCursor(hSaveCursor); // 鼠标光标形状还原
#17
#18 GetTextMetrics(hPr; &TextMetric);
#19 LineSpace = TextMetric。tmHeight + TextMetric。tmExternalLeading;
#20 nPageSize = GetDeviceCaps (hPr; VERTRES);
#21 LinesPerPage = nPageSize / LineSpace 1;
#22 dwLines = SendMessage(hEditWnd; EM_GETLINECOUNT; 0; 0L);
#23 CurrentLine = 1;
#24
#25 for (dwIndex = IOStatus = 0; dwIndex 《 dwLines; dwIndex++) {
#26 pLine'0' = 128;
#27 pLine'1' = 0;
#28 LineLength = SendMessage(hEditWnd; EM_GETLINE;
#29 (WORD)dwIndex; (LONG)((LPSTR)pLine));
#30 TextOut(hPr; 0; CurrentLine*LineSpace; (LPSTR)pLine; LineLength);
#31 if (++CurrentLine 》 LinesPerPage ) {
#32 CurrentLine = 1;
#33 IOStatus = Escape(hPr; NEWFRAME; 0; 0L; 0L);
#34 if (IOStatus= 0 && !bAbort) {
#40 Escape(hPr; NEWFRAME; 0; 0L; 0L);
#41 Escape(hPr; ENDDOC; 0; 0L; 0L);
#42 }
668
…………………………………………………………Page 731……………………………………………………………
第 12 章 列印與預樱А�
#43
#44 EnableWindow(hWnd; TRUE);
#45
#46 DestroyWindow(hPrintingDlgWnd);
#47 FreeProcInstance(lpPrintingDlg);
#48 FreeProcInstance(lpAbortProc);
#49 DeleteDC(hPr);
上述各个Escape 调用,是在Windows 3。0 下的传统作法,在Windows 3。1 以及Win32 之
中有对应的API 函数如下:
Windows 3。0 作法 Windows 3。1 作法
Escape(hPr; SETABORTPROC; 。。。) SetAbortProc(HDC hdc; ABORTPROC lpAbortProc)
Escape(hPr; STARTDOC; 。。。) StartDoc(HDC hdc; CONST DOCINFO* lpdi)
Escape(hPr; NEWFRAME; 。。。) EndPage(HDC hdc)
Escape(hPr; ENDDOC; 。。。) EndDoc(HDC hdc)
MFC 预设的打印机制
好啦,关于打印,其实有许多一成不变的动作!为什么开发工具不帮我们做掉呢?好比
说,从WIN。INI 中取得目前打印机的资料然后利用CreateDC 取得打印机DC ,又好比
说设计标准的【打印中】对话框,以及标准的打印中断函数AbortProc 。
事实上MFC 的确已经帮我们做掉了一大部份的工作。MFC 已内含打印机制,那么将
Framework 整个纳入EXE 文件中的你当然也就不费吹灰之力得到了打印功能。只要
OnDraw 函数设计好了,不但可以在屏幕上显示资料,也可以在打印机上显示资料。有
什么是我们要负担的?没有了!Framework 传给OnDraw 一个DC ,视情况的不同这个
DC 可能是显示屏DC ,也可能是打印机DC ,而你知道,Windows 程序中的图形输出
对象完全取决于DC :
669
…………………………………………………………Page 732……………………………………………………………
第篇 深入 MFC 程式設計
当你改变窗口大小,产生WM_PAINT ,OnDraw 会