友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第222章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 会
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!