



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗5輸入/輸出治理5.1 Windows鼠標處理背景知識一臺計算機擁有大量的輸入設備,而鼠標和鍵盤是其中最常用的輸入設備.實際上,根本的鼠標和鍵盤處理就像使用VisualC+的ClassWizard在MFC程序中添加一兩個消息響應函數一樣簡單.鼠標和鍵盤各自生成自己類型的消息.例如,鼠標生成類似WM_MOUSEMOVE、WM_LBUTTON和WM_RBUTTONCLK的Windows消息.1 .客戶區的鼠標消息客戶區就是應用程序可在其中繪圖的窗口局部.當鼠標指針滑過應用程序所擁有的窗口客戶區時,Windows將就把客戶區鼠標消息傳送給應用程序.使用諸如WM_MOUSEMOVE這類鼠標事件消息
2、,鼠標就可以與應用程序通信.例如,在用戶移動鼠標經過應用程序窗口的客戶區時,應用程序接收WM_MOUSEMOVE消息流,不僅通知用戶正在移動鼠標,而且通知Windows生成WM_MOUSEMOVE消息時鼠標的位置.在鼠標移出應用程序窗口的客戶區時,應用程序停止接收客戶區鼠標消息.Windows改為把鼠標消息傳送給鼠標碰巧經過的窗口(包含桌面).當鼠標返回窗口的客戶區時,Windows重新將鼠標消息傳送給應用程序.表5-1描述了應用程序可以接收的18種客戶區鼠標消息.表5-1客戶區鼠標消息消息描述WM_CAPTURECHANGED窗口失去鼠標捕獲WM_LBUTTONDBLCLK雙擊鼠標左鍵WM_
3、LBUTTONDOWN單擊鼠標左鍵WM_LBUTTONUP釋放鼠標左鍵WM_MBUTTONDBLCLK雙擊鼠標中鍵WM_MBUTTONDOWN單擊鼠標中鍵WM_MBUTTONUP釋放鼠標中鍵WM_MOUSEACTIVATE在用戶點擊鼠標按鈕時,鼠標光標位于非活動窗口中WM_MOUSEHOVER鼠標光標掠過窗口的客戶區,停留時間通過調用TrackMouseEvent()進行設置WM_MOUSELEAVE鼠標離開TrackMouseEvent()調用指定的窗口客戶區WM_MOUSEMOVE鼠標移到客戶區之上WM_MOUSEWHEEL滾動鼠標滾輪WM_RBUTTONDBLCLK雙擊鼠標右鍵WM_RB
4、UTTONDOWN單擊鼠標右鍵WM_RBUTTONUP釋放鼠標右鍵WM_XBUTTONDBLCLK雙擊鼠標X鍵WM_XBUTTONDOWN單擊鼠標X鍵WM_XBUTTONUP釋放鼠標X鍵2 .非客戶區鼠標消息Windows也會把非客戶區鼠標消息傳送給應用程序.當鼠標經過應用程序窗口客戶區之外的區域時,就會產生這類鼠標消息.例如,當鼠標經過窗口的標題欄或者限制按鈕時,應用程序就會接收非客戶區鼠標消息.由于非客戶區的鼠標消息最好由Windows自己來處理,所以大局部應用程序忽略這些消息.例如,用戶雙擊窗口標題欄,Windows恢復上一次設置的窗口尺寸.通常不希望干預Windows對非客戶區鼠標消息
5、的缺省處理,由于這樣做會導致應用程序的窗口停止對用戶期待的響應.實驗目的通過學習如何在Windows應用程序中添加對鼠標的支持:1討論Windows的鼠標編程技巧;2了解Windows2000輸入/輸出處理技術.工具/準備工作在開始本實驗之前,請回憶教科書的相關內容.您需要做以下準備:1一臺運行Windows2000Professional操作系統的計算機.2計算機中需安裝VisualC+6.0專業版或企業版.實驗內容與步驟在本實驗中,我們通過一個應用程序例如來討論鼠標編程技巧,了解如何響應鼠標消息和如何在應用程序中捕獲鼠標.該程序的完整實例保存在本書所附光盤的“程序代碼文件夾中“5-1子文件
6、夾步驟1:登錄進入Windows2000Professionalo步驟2:在"開始菜單中單擊"程序"-"MicrosoftVisualStudio6.0"-aMicrosoftVisualC+6.0命令,進入VisualC+窗口.步驟3:在File菜單單擊OpenWorkspace.命令,在"OpenWorkspace"對話框中找到“5-1"文件夾并翻開實驗文件Mouse.dsw.提示:工程工作區Workspace是一個包含用戶的所有相關工程和配置的實體.工程定義為一個配置和一組文件,用以生成最終的程序或二進制文件
7、.一個工程工作區可以包含多個工程,這些工程既可以是同一類型的工程,也可以是由不同類型的工程如VisualC+和VisualJ+工程.工作區文件以.dsw為后綴名以前為.mdp,工程文件以.dsp以前為.mak為后綴名.步驟4:單擊Build菜單中的BuildMouse.exe命令,系統對程序進行編譯并建立可執行文件.操作能否正常進行如果不行,那么可能的原因是什么可以正常運行步驟5:在工具欄單擊“ExecuteProgram按鈕,執行Mouse.exe程序,響應鼠標消息.Mouse例如程序演示了如何截取和響應鼠標消息.運行這個程序,就會顯示一個主窗口.最初窗口是空白的,但是直接在窗口中移動鼠標,
8、WM_MOUSEMOVE消息就會出現在窗口上,同時顯示鼠標的坐標.在鼠標經過窗口時單擊鼠標左鍵,窗口中不僅出現WM_LBUTTONDOWN和WM_LBUTTONUP消息,而且顯示事件發生的坐標.單擊鼠標右鍵,再次出現上述情況.請記錄:WM_MOUSEMOVEWM_LBUTTONDOWNWM_LBUTTONUPX:178Y:114X:230Y:115X:230Y:115WM_RBUTTONDOWNWMRBUTTONUPX:201Y:204X:201Y:204觀察演示情況,請說明,顯示的各消息反映了什么鼠標事件?WMMOUSEMOVE顯示鼠標移動到的位置的坐標WMLBUTTONDOWN顯示點擊鼠標
9、左鍵位直的下坐標WMLBUTTONUP顯示點擊鼠標左鍵位直的上坐標WMRBUTTONDOWN顯示點擊鼠標右鍵位直的下坐標WMRBUTTONUP顯示點擊鼠標右鍵位直的上坐標步驟6:捕獲鼠標消息.Mouse應用程序也舉例說明了鼠標捕獲的技巧.有些時候需要應用程序接收鼠標消息,甚至鼠標不在應用程序客戶區時,也有這個要求.例如在一個畫圖程序中,用戶在窗口中畫線時一直接住鼠標左鍵.如果一個用戶碰巧把鼠標指針移到畫圖應用程序的窗口之外,應用程序必須繼續接收鼠標消息.否那么用戶在窗口之外釋放鼠標按鈕,應用程序將無法知道用戶是否仍舊在畫圖.為了解鼠標捕獲的工作情況,可把指針移動到Mouse應用程序的客戶區,然
10、后一直按住鼠標右鍵,在屏幕上任意移動鼠標.即使鼠標移動到窗口外,窗口繼續接收鼠標消息.在不按住鼠標右鍵移動鼠標時,鼠標指針離開了應用程序的客戶區的情況下,應用程序停止接收鼠標消息.注意到,在按住鼠標右鍵移動到客戶區外面左側時,WM_MOUSEMOVE的坐標值現在為負的.這是由于什么答:由于客戶區窗口左側和上邊為坐標軸,邊際值為0,鼠標超出客戶區時還要繼續捕捉鼠標信息,此時坐標只能用負數表示.5.2Windows打印背景知識1 .在MFC應用程序中打印文本進一步地,如果使用MFCAppWizard來組裝應用程序,可以十分容易地獲得根本的打印和打印預覽功能.為了獲得這種功能,要確彳在AppWiza
11、rd的"Step4of6對話框中選擇"Printingandprintpreview(打印和打印預覽)選項,使AppWizard應用程序可獲得打印機的名稱和獲取打印機DC的所有細節.讀者只需要改良所生成的源代碼就能夠為應用程序產生適當的打印輸出.使用MFC的缺省打印功能時,應用程序的文檔都在OnDraw()函數中屏幕顯示和發送到打印機.所不同的是,在屏幕顯示的情況下,發送到OnDraw()的DC對象是客戶窗口;在打印的T青況下,DC用于當前打印機.DC切換的靈活運用使某一函數既能向屏幕輸出,也能向打印機輸出,使產生WYSIWYG(WhatYouSeeIsWhatYouGet
12、,所見即所得)更加容易.除了以正確的尺寸縮放打印機輸出外,還可能要處理頁碼、頁眉和頁腳、字體以及Windows應用程序為打印具有專業外觀的文檔而必須完成的其他任務.MFC不僅通過創立打印機描述環境,而且通過在CView類中提供在各階段都能夠使視圖窗口訪問打印過程的各種成員函數,從而進行大量的打印文檔的作當編寫帶有打印功能的MFC程序時,通常需要為指定的應用程序改良缺省的MFC打印功能.CView類(可從中派生自己的應用程序視圖窗口)定義了五個用于打印的MFC成員函數:OnPreparePrinting()、OnBeginPrinting()、OnPrepareDC()、OnPrint()和On
13、EndPrinting(),能夠用來對打印過程的不同階段實施限制.(1) OnPreparePrinting()函數必須在視圖窗口類中重載這個函數并調用DoPreparePrinting()函數.DoPreparePrinting()函數顯示Print對話框,并創立打印機DC.在OnPreparePrinting()函數中可以改變Print對話框中顯示的一些值.當使用MFCAppWizard來創立自己的應用程序,并為此應用程序選擇Printingandprintpreview選項時,AppWizard自動重載了OnPreparePrinting()函數,如下所示:BOOLCPrintAppVi
14、ew:OnPreparePrinting(CPrintInfo*pInfo)(/缺省的準備過程returnDoPreparePrinting(plnfo);)OnPreparePrinting()重載了DoPreparePrinting()函數,后者用來顯示Print對話框.通過初始化作為惟一參數傳遞給該函數的CPrintInfo對象成員,可以限制在此對話框中顯示的選項.例如,如果文檔有三頁,就可以按如下方式對CPrintInfo對象的SetMinPage()和SetMaxPageo成員函數加以調用:BOOLCPrintAppView:OnPreparePrinting(CPrintInfo*
15、pInfo)(/缺省的準備過程pInfo->SetMinPage(l);pInfo->SetMaxPage(3);returnDoPreparePrinting(pInfo);)SetMinPage()和SetMaxPage()函數不僅告訴MFC要打印多少頁,也給出了Print對話中g的From和To框中顯示的值.如果不調用SetMinPage()和SetMaxPage(),那么From框缺省為1,To框為空.使用OnPreparePrinting()還沒有解決該應用程序訪問打印機DC的權限的問題,這就限制了確定當前文檔和打印機的信息量.為此,可以修改OnBeginPrinting
16、()函數.(2) OnBeginPrinting()函數MFC在調用OnPreparePrinting()之后,調用OnBeginPrinting()函數.此函數不做任何事情,但如果在應用程序的視圖窗口類中重載了OnBeginPrinting()函數,就可以創立打印任務所需要的GDI資源,包括畫筆、畫刷以及字體等.而且,由于OnBeginPrinting()是視圖窗口類能夠訪問打印機DC和CPrintInfo結構的第一個地方,當這些值依賴于打印機DC的設置時,可以在此處設置頁數以及其他值.當使用MFCAppWizard創立應用程序并為應用程序選擇Printingandprintpreview選
17、項時,AppWizard自動重載了OnBeginPrinting()函數.通過調用諸如GetTextMetrics()的打印機DC成員函數,就可以確定用于打印機的正確的字符高度,還可以計算出每頁的行數以及需要顯示整個文檔的頁數.下面就是OnBeginPrinting()函數用來計算字符尺寸和頁數的例如:voidCPrintAppView:OnBeginPrinting(CDC*pDC,CPrintInfo*pInfo)(/請在此處添加打印之前額外的初始化代碼TEXTMETRICtextMetric;pDC->GetTextMetrics(&textMetric);m_printe
18、rCharHeight=textMetric.tmHeight+textMetric.tmExternalLeading;m_vertRes=pDC->GetDeviceCaps(VERTRES);m_linesPerPage=m_vertRes/m_printerCharHeight;intnumPages=m_numLines/m_linesPerPage+1;pInfo->SetMinPage(l);pInfo->SetMaxPage(nurnPages);)(3) OnPrepareDC()函數MFC調用OnBeginPrinting()之后,在打印頁面時就為文檔中的
19、每一頁調用OnPrepareDC().OnPrepareDC()程序能夠精確地限制MFC把文檔的哪一局部輸出到打印機中.所以,當應用程序必須打印多頁文檔時,可重載此函數.還可以使用OnPrepareDC()來為文檔的每一頁設置打印機設備描述環境的映射模式和其他屬性.(4) OnPrint()函數調用OnPrepareDC()之后,MFC為每一頁調用OnPrint().這樣,不僅可以在OnPrepareDC()中設置視區原點(它限制著文檔的哪局部輸出到要打印的頁上),而且還可以在OnPrint()中進行設置.通常,在把文檔的數據以不同方式輸出到打印機而不是屏幕上時,可重載OnPrint().當使
20、用AppWizard創立應用程序時,AppWizard不會自動地在視圖窗口類中重載OnPrint()函數.必須使用ClassWizard重載OnPrint().OnPrint()準確測定文檔的哪些行需要在當前頁中繪制,并且只繪制這些行.MFC在CPrintInfo對象的成員m_nCurPage中把當前頁傳遞給OnPrint().OnPrint()函數所做的工作主要是: 正算要打印的第一行的行號. 計算要打印的最后一行的行號. 把第一和最后行的行號作為for循環的限制值. 在循環的每次迭代過程中打印一行文本.(5) OnEndPrinting()與OnBeginPrinting()函數相對應的,
21、是OnEndPrinting()函數.在打印任務完成之后,MFC調用OnEndPrinting(),使應用程序獲得釋放OnBeginPrinting()中分配的資源的時機.AppWizard在應用程序中重載OnEndPrintinp()函數.voidCCircleAppView:OnEndPrinting(CDC*/*pDC*/,cPrintInfo*/*pInfo*/)(/請在此處添加打印之后的去除代碼)傳遞給上述函數的CDC和CPrintInfo對象被注釋掉了.如果要訪問函數體中的這些對象,需要刪除這些注釋.實驗目的通過本實驗操作1) 了解傳統方式下Windows打印文檔的根本過程.2)學習在MFC應用程序中打印文本.3)加深了解和學習Windows打印操作的核心編程技術.工具/準備工作在開始本實驗之前,請回憶教科書的相關
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025江蘇連云港市贛榆區招聘鄉村振興專干31人筆試備考題庫及1套完整答案詳解
- 2024年度河北省護師類之婦產護理主管護師題庫練習試卷A卷附答案
- 2025江蘇連云港市灌云縣招聘鄉村振興專干40人筆試備考題庫完整答案詳解
- 2025年東營市公務員考試行測試卷歷年真題及一套參考答案詳解
- 河南省洛陽市2024-2025學年高二下學期6月期末質檢物理試卷(含答案)
- 2024 - 2025學年湘藝版三年級下冊音樂期末考試卷附答案(三套)
- 吉林省普通高中友好學校聯合體2024-2025學年高二上學期第三十九屆期中聯考物理試題(解析版)
- 湖北省問津聯盟2024-2025學年高二下學期3月聯考物理試題(解析版)
- 遼寧省名校聯盟2024-2025學年高二下學期6月聯合考試語文試卷(含答案)
- 2019-2025年統計師之初級統計工作實務模擬考試試卷A卷含答案
- 裱花晉級考核標準
- 辦公室管理-形考任務二(第一~第二章)-國開-參考資料
- 2025年農村土地糾紛調解協議書
- 項目管理與工期控制
- 行業周期波動中的政策導向-洞察分析
- 河南省駐馬店市2023-2024學年高二下學期7月期末考試 英語 含解析
- 2025年中國中煤能源集團限公司招聘10人高頻重點提升(共500題)附帶答案詳解
- 事故隱患內部報告獎勵制度
- 發展性障礙學生就業轉銜的家長支持研究
- 《家用電器銷售管理系統的設計與實現》2000字(論文)
- 醫院培訓課件:《住院患者VTE風險評估及預防》
評論
0/150
提交評論