




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、l考試初步擬安排在12月16日 l即第16周周五1、2節(jié) 1 2 3 4 編輯: autocomplete、intellisense 編譯: 預(yù)編譯頭文件(stdafx.h),可以加快編譯速度 鏈接: 增量式鏈接、projectsettingslinklink incrementally 調(diào)試:edit 16 l繪制設(shè)備上下文 beginpaint() endpaint() 17 l菜單 l對話框 18 l第一步:winmain改造為cwinapp l第二步:窗口函數(shù)改造為消息映射 19 linitapplication linitinstance l消息映射結(jié)構(gòu)體 20 l是微軟提供的win
2、dows編程接口 l使應(yīng)用程序的結(jié)構(gòu)標準化 l使應(yīng)用程序小而且快(dll) lvisual c+降低編碼復(fù)雜程度 lmfc庫具有豐富的特性 21 l目的:如何編制一個具有一定功能的mfc類庫 應(yīng)用程序(引入簡單的視圖/文檔概念) l什么是視圖 用戶角度:與其他windows窗口一樣的窗口 程序員:從mfc的cview類派生的類的一個對象 l單文檔界面和多文檔界面 單文檔:一次只能打開一個文檔(notepad) 多文檔:一次能打開多個文檔(word) 22 l應(yīng)用程序的主要元素 winmain函數(shù) cmyapp類-theapp cmyapp:initinstance(); cmyapp:run(
3、) ;/cmyapp:onidle() cmyframe類 cmyframe:onlbuttondown、cmyframe:onpaint()、 cmyframe:ondraw() 關(guān)閉主畫面窗口后關(guān)閉應(yīng)用程序。 23 lmfc庫對windows消息映射不采用虛擬 函數(shù),而通過宏把特定的消息映射到派 生類成員函數(shù)。主要是為避免大量的 vtable開支。 l菜單命令消息和按扭消息的處理與 windows消息一樣。 l一個mfc消息處理程序需要一個函數(shù)原 型、一個函數(shù)體和一個在消息映射中的 項。 24 lafx_msg void onlbuttondown(uint nflags,cpoint p
4、oint) lcmyframe:onlbuttondown(uint nflags,cpoint point) l lbegin_message_map(cmyframe,cframewnd) on_wm_lbuttondown() lend_message_map() 25 l文檔-代表數(shù)據(jù)模型,基類是cdocument l視圖-代表用戶接口,基類是cview 26 l什么是視圖 用戶角度:與其他windows窗口一樣的窗口 程序員:從mfc的cview類派生類的一個對象 l單文檔界面和多文檔界面 單文檔:一次只能打開一個文檔(notepad) 多文檔:一次能打開多個文檔(word) l在窗
5、口中繪圖 通過響應(yīng)ondraw()函數(shù)來完成繪圖 設(shè)備上下文 圖形設(shè)備對象 27 l資源編輯器 ex03a.rc包含 afxres.h(只讀符號) afxres.rc(通用組件) resource.h(自定義符號) ldebug與release目標 l啟用診斷宏(c:winntafx.ini traceenabled=1) tools/mfc tracer/enable tracing l予編譯頭文件(stdafx.cpp stdafx.h) 28 通過修改ondraw()函數(shù)來完成繪圖 l是cview類的虛擬成員函數(shù),每次視圖重畫時調(diào) 用(wm_paintonpaintondraw) l如果
6、程序的數(shù)據(jù)被改變,則可以調(diào)用視圖的 invalidate()成員函數(shù),并最終調(diào)用ondraw() invalidatewm_paintondraw() l對視圖窗口的重畫不要過于頻繁 畫圖過程中涉及的mfc類 l設(shè)備上下文 l其他圖形設(shè)備對象 29 lwindows系統(tǒng)不允許直接操作顯示硬件, 而是通過一個抽象層設(shè)備上下文來進 行通訊 lmfc編程中,設(shè)備上下文是cdc及其派 生類的對象 l添入代碼: 30 l資源編輯器 ex03a.rc包含 加速器、對話框、圖標、菜單、字符串、工 具條、版本信息 afxres.h(只讀符號),通用的mfc庫資源 afxres.rc(通用組件),通用的mfc庫
7、資源 resource.h(自定義符號) 31 l分兩個版本:發(fā)行版和調(diào)試版 l區(qū)別:源碼調(diào)試、診斷宏、鏈接庫、編 譯優(yōu)化等方面不同 l啟用診斷宏(c:winntafx.ini traceenabled=1) tools/mfc tracer/enable tracing l予編譯頭文件(stdafx.cpp stdafx.h) /yc(stdafx.cpp)、/yu(復(fù)用)、/fp(pch文件路徑)編譯開關(guān) 32 lmfc類庫中有很多on-函數(shù)由框架調(diào)用,完成對事件的響應(yīng)。 l他們不是虛擬函數(shù),必須通過消息映射結(jié)構(gòu),使應(yīng)用框架和我們的代碼 關(guān)聯(lián) l消息映射 當(dāng)用戶在視圖中按下鼠標,windo
8、ws發(fā)送 wm_lbuttondown消息給視圖窗口,視圖窗口 必須有一個onlbuttondown(uint nflags,cpoint point)成員函數(shù)來響應(yīng)該消息,頭文件中加入消息處 理函數(shù)原型afx_msg void onlbuttondown(uint nflags,cpoint point),通過消息映射宏將框架和函數(shù) 關(guān)聯(lián),將消息和消息的響應(yīng)函數(shù)連接的過程稱為消 息映射。 33 定義函數(shù):void cmyview:onlbuttondown(uint nflags,cpoint point) 函數(shù)原型:afx_msg void onlbuttondown(uint nflag
9、s,cpoint point) 消息映射宏 lbegin_message_map() on_wm_lbuttondown lend_message_map() 頭文件中添加: ldeclare_message_map() 34 l通過一些狀態(tài)的變化反映事件,在引入文檔類 之前,存放在視圖的數(shù)據(jù)成員中 crect m_rectellipse;uint m_ncolor l數(shù)據(jù)成員初始化:放在視圖的構(gòu)造函數(shù)中 cex04aview:cex04aview():m_rectellipse(0,0,200,20 0),m_ncolor(gray_brush) 35 l鼠標點擊不會引起重畫,需要調(diào)用: c
10、wnd:invalidaterect(lprect rect); l視圖的客戶區(qū): lcrect,csize,cpoint及其相互運算 l如何判斷點在矩形內(nèi)部 crect rect; if(rect.ptinrect(point). l如何判斷點在區(qū)域內(nèi)部 crgn rgn; rgn.createellipticrgnindirect(m_rectellipse); if(rgn.ptinregion(point). l實例 36 l為使顯示與顯示分辨率無關(guān),應(yīng)使用不同于以 像素為單位的坐標系統(tǒng) l設(shè)備坐標-以像素表示的坐標值。 l邏輯坐標-當(dāng)前映射方式下的坐標值。 l映射方式-邏輯坐標和設(shè)備
11、坐標之間的比例關(guān) 系。 lwindows映射方式 映射方式映射方式邏輯單位邏輯單位 mm_loenglish 0.01 inch mm_hienglish 0.001 inch mm_lometric 0.1 mm mm_himetric 0.01 mm mm_twips 1/1440 inch mm_text1pixel 37 l邏輯坐標和設(shè)備坐標1:1 l坐標x向右增加,坐標y向下增加 l通過調(diào)用cdc的setwindoworg, setviewportorg改變原點 cmyview:ondraw(cdccmyview:ondraw(cdc* * pdc) pdc) pdc-setmapm
12、ode(mm_text);pdc-setmapmode(mm_text); pdc-setwindoworg(cpoint(100,100);pdc-setwindoworg(cpoint(100,100); /將邏輯坐標(將邏輯坐標(100100,100100)設(shè)置為窗口原點)設(shè)置為窗口原點 38 向右x增加,向下y減少 39 可以改變縮放因子和原點 mm_isotropic和mm_anisotropic mm_isotropic縱橫比始終是1;1 mm_anisotropic可以分別改變x和y縮放因子 40 l一些重要的規(guī)則: cdc的成員函數(shù)使用邏輯坐標 cwnd的成員函數(shù)使用設(shè)備坐標
13、在設(shè)備坐標系中進行擊鍵測試如(crect:ptinrect) 用邏輯坐標存儲長期的值。 cdc的函數(shù)lptodp和dptolp負責(zé)兩個系統(tǒng)之間的 轉(zhuǎn)換。 在cview:onpreparedc()中完成映射方式設(shè)定。 編程示例 41 l當(dāng)窗口比屏幕大時,可能需要滾動視口。 l通過從cscrollview中派生視圖類可以實現(xiàn)。 l在oninitialupdate()中定義邏輯大小和映射方式。 l見舉例 42 l所有與繪制有關(guān)的操作都要用到gdi元素 l設(shè)備上下文是最重要的gdi元素,代表某個具 體的物理設(shè)備 43 l基類是cdc,每個設(shè)備上下文對象有一個 windows設(shè)備上下文,由32位hdc句
14、柄標識 lcdc類的虛擬性是應(yīng)用框架的一個重要特性。 l顯示上下文類:cclientdc、cwindowdc等 44 構(gòu)造設(shè)備上下文對象后,應(yīng)及時銷毀,windows限 制可獲取設(shè)備上下文的數(shù)量。 構(gòu)造的兩種方法 45 l使用cdc對象繪圖時,屏幕上的內(nèi)容依賴于設(shè) 備上下文的當(dāng)前狀態(tài): 繪圖需要的相關(guān)對象:筆、刷子、字體 映射方式 其他方面(文本對齊方式、填充方式等) 46 l重寫了onpaint函數(shù)后,需要用到cpaintdc類 lonpaint用正確設(shè)置的cpaintdc調(diào)用ondraw(); 47 lcbitmap lcbrush lcfont lcpalatte lcpen lcrgn
15、 48 l一步構(gòu)造 cpen newpen(ps_dashdotdot, 2, (colorref) 0); l先定義對象,再創(chuàng)建 cfont font; font.createfont(30, 10, 0, 0, 400, false, false, 0, ansi_charset, out_default_precis, clip_default_precis, default_quality, default_pitch | ff_modern, courier new); / truetype l如何斷開其與設(shè)備上下文的關(guān)系 先選出設(shè)備上下文,然后析構(gòu) 庫存gdi對象自動析構(gòu) 49 l
16、字體是gdi對象 l字體的選擇 與設(shè)備無關(guān)的true type字體和與設(shè)備有關(guān)的字體 (windows系統(tǒng)顯示字體和laserjet lineprinter字體) mfc提供選擇準確的打印機字體和大小,然后盡力 使顯示最好。 l打印字體 以磅來度量 l顯示字體 顯示字體和打印字體一般不能嚴格匹配,除非使用 mm_text方式。 50 51 l字體高度=tmheight-tminternalheight(點數(shù)) l行高=tmheight+tmexternalleading l對應(yīng)textmetric和gettextmetrics( 52 l同一種字體,不同大小 53 l大小伸縮字體 54 l格式
17、刷 55 l模態(tài)和非模態(tài)對話框 模態(tài):在對話框關(guān)閉之前,不能轉(zhuǎn)到其他窗 口工作 非模態(tài):可以轉(zhuǎn)到其他窗口,但對話框在最 頂端 56 l對話框是基于資源的,資源指定其包含 的元素和布局。 l對話框包含的窗口元素:控件 l一個從cdialog類派生的mfc類完成和對 話框界面的聯(lián)系 57 l編程步驟 使用對話框編輯器創(chuàng)建對話框資源 classwizard生成派生對話框類 classwizard添加數(shù)據(jù)成員 classwizard消息映射 特殊控件初始化 在視圖中編寫代碼,激活對話框?qū)ο?l舉例1 58 cdialog:domodal() oninitdialog cdialog:oninitdia
18、log cwnd:updatedata(false) dodatexchange cdialog:onok updatedata(true) 59 l控制onok的退出 loncancel 處理 l掛接滾動條控件 l改進的ex06a 60 lcwnd指針和控件id lgetdlgitem返回cwnd指針 lgetdlgctrlid返回id l設(shè)置對話框背景和控件的顏色 (wm_ctlcolor-onctlcolor) l在對話框窗口內(nèi)部畫圖 l運行時增加控件 61 l在windows95中引入,nt也提供 l包含在comctl32.dll動態(tài)連接庫中 l窗口過程函數(shù)及窗口類注冊代碼包含在該庫中
19、 ldll加載時注冊窗口類 l對公用控件,classwizard不能提供數(shù)據(jù)成員支 持,但提供通知消息的映射 l應(yīng)在oninitdialog和onok中分別初始化和讀取 控件數(shù)據(jù) 62 l進度指示器控件,對應(yīng)c+類是cprogressctrl, 可以調(diào)用其成員函數(shù)setrange和setpos進行初 始化或更新操作 lslider(跟蹤欄控件),對應(yīng)的c+類是 csliderctrl,不需要映射wm_hscroll和 wm_vscroll即可滾動。 63 lspin(微調(diào)控件),對應(yīng)的c+類是 cspinbuttonctrl,經(jīng)常和一個編輯控件一起使 用,稱“伙伴”,編輯控件的tab順序僅在
20、spin之前。setrange()和setaccel()及autobuddy 和set buddy integer屬性 64 l列表控件,對應(yīng)的c+類是clistctrl,需要一 個圖片文件夾,cimagelist類的對象 l樹型控件,對應(yīng)的c+類是 ctreectrl,用 htreeitem而不是整型索引,插入時使用 tv_insertstruct結(jié)構(gòu) 65 l早期的windows控件利用wm_command發(fā) 送通知消息 l對于windows公用控件來說,標準的32位 wparam和lparam參數(shù)是不夠的 66 l微軟提供wm_notify消息解決這一問題,其 結(jié)構(gòu)如下: l舉例2 67
21、 l本章介紹非模態(tài)對話框和windows公用對話框 l非模態(tài)對話框:在對話框活動的同時允 許在其他地方工作。 l公用對話框包括:文件、頁面設(shè)置、顏 色選擇等,包含在comdlg32.dll中 68 lmfc中類cdialog為基類。 l創(chuàng)建: (1)調(diào)用cdialog的缺省構(gòu)造函數(shù)構(gòu)造對象 (2)調(diào)用cdialog:create(idd)創(chuàng)建 l可以通過向視圖發(fā)送用戶定義的消息處 理按鈕消息。 (1)sendmessage() (2)postmessage() 69 70 lccolordialog lcfiledialog lcfindreplacedialog lcpagesetupdia
22、log lcfontdialog lcprintdialog 71 l直接使用公用對話框類 72 l派生新類 l對話框嵌套 創(chuàng)建帶有一個特殊成組框的對話框(成組框 id=0 x045f) 73 l1991年推出vb,同時引入vbx lvbx被證明是成功的,但它是16位段結(jié)構(gòu)的, 不能移植到32位系統(tǒng) lactivex是基于com技術(shù)的vbx的強有力的替 代 lactivex的開發(fā)可以用mfc和atl lactivex可以在vb和vc中使用 74 l普通控件 都是子窗口(經(jīng)常在對話框中使用) 通過mfc類對象操控 客戶程序負責(zé)創(chuàng)建控件的子窗口 控件向父窗口發(fā)送標準windows消息 (bn_cl
23、icked) 父窗口通過調(diào)用對應(yīng)控件的c+類的成員函數(shù)操作 控件 75 lactivex控件 屬性和方法 屬性具有符號名字(可以匹配到整型索引)和類型 方法與函數(shù)非常相似 不是向控件容器發(fā)送wm_通知消息,而是“觸發(fā)” 事件入clicked事件 可以沒有窗口,窗口的創(chuàng)建是通過控件自己 (createin place activation) 常用動態(tài)連接庫存放,但其擴展名是ocx 76 l安裝 拷貝相關(guān)文件到系統(tǒng)目錄下(*.ocx,*.hlp,*.lic等) 運行regsvr32 注冊 l將想要的控件加到項目中 77 lcalender控件 l訪問屬性 l控件的c+包裝類 lappwizard中
24、對activex的支持 afxenablecontrolcontainer() stdafx.h中的#include l利用classwizard添加針對activex控件的數(shù)據(jù) 成員和事件處理函數(shù) 78 l可以向?qū)υ捒蝾愄砑觾煞N數(shù)據(jù)成員 針對activex控件某個屬性的,可以在控件顯示出來之前控制 其屬性的值 針對activex控件的對象數(shù)據(jù)成員,可以方便地操作屬性等 l映射控件事件 l將控件鎖定在內(nèi)存種 afxolelockcontrol(m_cal.getclsid() afxoleunlockcontrol( l一個示例 79 l發(fā)布ie4的同時,帶有新的comctl32.dll,稱i
25、e4公用控件 lie4公用控件介紹 日期和時間選取器 月歷 ip協(xié)議地址控件 擴展組合框 l示例 80 l位圖就是一個位矩陣,影射到顯示器的象素點上。 lgdi位圖和dib位圖 lgdi位圖由mfc的類cbitmap代表 lgdi位圖在同一臺機器的不同程序間可以傳輸, 但不同機器間不可以 ldib帶有自己的顏色信息 l彩色位圖和單色位圖 81 l位圖也是gdi對象之一 l首先創(chuàng)建位圖 l創(chuàng)建內(nèi)存設(shè)備上下文createcompatibledc l將位圖選入內(nèi)存設(shè)備上下文selectobject l從內(nèi)存設(shè)備上下文將位圖畫到實際的設(shè)備上下 文bitblt或stretchblt() 82 l從資源中
26、裝載位圖 83 l如果映射模式不是mm_text,則位圖可能會變形 l使用pdc-setstretchbltmode(coloroncolor); 調(diào)用可以使顯示效果好一些 l也可以通過位圖拉伸解決問題 l示例 84 l如果你的程序顯示單一dib位圖 創(chuàng)建邏輯調(diào)色板(包含dib位圖的顏色信息) 將邏輯調(diào)色板“實現(xiàn)”到硬件系統(tǒng)調(diào)色板中 l如果你的程序是前臺程序,實現(xiàn)過程將把dib位圖的所有 顏色拷貝到系統(tǒng)調(diào)色板(236種顏色,20種由系統(tǒng)保留) l如果另一個程序是前臺程序,且要顯示236級的綠色場景, 則在你的邏輯調(diào)色板和系統(tǒng)調(diào)色板之間建立映射,假如有 一個品紅色,則將被映射位標準紅色,如果忘了
27、實現(xiàn)調(diào)色 板,則將被映射為綠色 85 l任何程序?qū)崿F(xiàn)其調(diào)色板的時候,你的程序的主 窗口將收到wm_palettechanged消息 l你程序中的任何一個窗口得到焦點時, wm_querynewpalette消息發(fā)送 l在主框架窗口中應(yīng)響應(yīng)這兩種消息 l用pdc-selectpalette()將邏輯調(diào)色板選入 l用realizepalette 實現(xiàn) 86 l一個dib由一個兩維的象素矩陣組成 l每個象素由1、4、8、16、32個位組成 l對于16bpp、24bpp、32bpp的dib,每個象素是 一個rgb顏色 l1bpp、4bpp、8bpp的dib,有一個顏色表,每 個象素是一個指向顏色表的索
28、引 l當(dāng)需要顯示的顏色多于顯示卡能顯示的顏色時: 如果dib包含重要顏色表 createhalftonepalette 87 colortable 2 entry 1bpp 16 以下 4bpp 256 以下 8bpp dib bit image 按列和行順序排列的位映象 對齊到 4 字節(jié)邊界的行 88 lbitmapfileheader結(jié)構(gòu) 包含到映象位矩陣的偏移量 lbitmapinfoheader dib位映象按列、行組織 從最底行開始 每行填充到4字節(jié)對齊 89 lsetdibitstodevice:按一個位圖位顯示成一個顯 示象素或一個打印點顯示 lstretchdibits:類似于
29、stretchblt() lgetdibits從一個gdi位圖構(gòu)建dib lcreatedibitmap:從dib構(gòu)建gdi位圖 lcreatedibsection:創(chuàng)建一個稱為dib段的特殊 dib,返回一個gdi位圖句柄 90 91 l本章的主要內(nèi)容是菜單和命令路由架構(gòu) l同時介紹: 框架、文檔和視圖的關(guān)系 命令用戶接口更新函數(shù) 鍵盤加速器 l以richtext控件和屬性表來介紹 92 l主框架窗口管理菜單條、標題條、工具條、狀 態(tài)條及視圖窗口 93 l一般由水平菜單列表及附屬的彈出式菜單組成 l一般為框架窗口定義默認的菜單資源,創(chuàng)建時 自動裝載 l也可以定義獨立的菜單,用戶程序負責(zé)裝載
30、94 l選擇菜單命令的快捷方式(定義菜單時字母前導(dǎo) lwindows應(yīng)用的啟動過程 windows將程序載入內(nèi)存 構(gòu)造全局對象theapp windows調(diào)用全局函數(shù)winmain()afxwinmain winmain尋找唯一的一個cwinapp的派生類的對象 winmain調(diào)用theapp的initinstance()函數(shù) 重寫的initinstance()啟動載入文檔并顯示主框架窗口和視圖窗 口的進程 winmain調(diào)用theapp的run()函數(shù),進入消息循環(huán) 124 l建立了應(yīng)用類、文檔類、視圖類、框架窗口類 之間的關(guān)系 lmfc類中的declare_dyncreate和實現(xiàn)部 分的
31、implement_dyncreate保證可以動 態(tài)創(chuàng)建對象 l對象的動態(tài)構(gòu)造,解決了用戶編碼復(fù)雜度問題; l使用runtime_class宏通知框架 125 126 ladddoctemplate()的第一個參數(shù)是 idr_mainframe,是字符串表的一個資源編 號 l其結(jié)構(gòu)如下: idr_mainframe ex17an /應(yīng)用窗口標題 n / 默認文檔名的基本部分 /如果沒有,則用”untitled” ex17an /文檔類型名 ex17a files (*.17a)n / 文檔類型描述和過濾器 .17an /文檔擴展名 ex17a.documentn /注冊文件類型 id ex17
32、a document /注冊文件類型描述 127 l在調(diào)用完initinstance()之后,調(diào)用cwinapp:onfilenew()通過 cwinapp:processshellcommand完成如下操作: l構(gòu)造文檔對象,但不載入數(shù)據(jù)(串行化) l構(gòu)造主框架對象,并創(chuàng)建主框架窗口(idr_mainframe菜單, 工具條,狀態(tài)條),但不顯示 l構(gòu)造視圖對象,并創(chuàng)建視圖窗口,但不顯示 l建立文檔、主框架、視圖對象之間的關(guān)系 l調(diào)用虛擬cdocument:onnewdocument,該函數(shù)調(diào)用 deletecontents (實際中經(jīng)常需要重寫) l調(diào)用視圖的cview:oninitialu
33、pdate 函數(shù) l對框架對象調(diào)用虛擬的cframewnd:activateframe ,顯示主框 架窗口、菜單,工具條,狀態(tài)條 128 lonnewdocument()函數(shù),完成一些初始化操作 l將文件打開操作和串行化代碼關(guān)聯(lián) 提示用戶選擇文件 對已存在的文檔對象,調(diào)用cdocument:onopendocument , 該函數(shù)調(diào)用cdocument:deletecontents,創(chuàng)建歸檔對象,調(diào) 用serialize載入數(shù)據(jù) 調(diào)用cview:oninitialupdate() l文檔類的deletecontents()虛擬函數(shù):如果你要從磁盤 載入文檔數(shù)據(jù)(onfilenew和onfile
34、open),先調(diào)用 這個函數(shù),一般要重寫; l將存盤和另存操作和serialize()關(guān)聯(lián),兩個操作都要 調(diào)用onsavedocument(),onsavedocument()要調(diào)用 serialize() l文檔“臟”標志,文檔類的數(shù)據(jù)成員m_bmodified表 示,通過setmodifiedflag()和ismodified() l示例 129 l多文檔應(yīng)用程序與單文檔應(yīng)用程序的啟動流程基本一致 l多文檔模板類cmultidoctemplate lmdi框架窗口和子窗口:一個mdi應(yīng)用擁有一個主框架窗口和多 個子框架窗口 l主框架窗口直接創(chuàng)建,而子框架窗口則在打開時創(chuàng)建 130 l主框架
35、和文檔模板資源 lmdi應(yīng)用有兩個獨立的字符串和菜單資源分別由 idr_mainframe和idr_exnntype,前者代表只有空的主框架 窗口時的資源 131 l構(gòu)造文檔對象,但不載入數(shù)據(jù) l構(gòu)造子窗口對象,創(chuàng)建子窗口,但不顯示 l構(gòu)造視圖對象,創(chuàng)建視圖窗口,但不顯示 l建立文檔、子框架、視圖對象之間的關(guān)聯(lián) l調(diào)用onnewdocument l調(diào)用oninitialupdate l對子框架窗口調(diào)用activateframe 132 l構(gòu)造子窗口對象,創(chuàng)建子窗口,但不顯示 l構(gòu)造視圖對象,創(chuàng)建視圖窗口,但不顯示 l建立文檔、子框架、視圖對象之間的關(guān)聯(lián) l調(diào)用oninitialupdate l
36、對子框架窗口調(diào)用activateframe 133 lwindows通過提供各種打印機的驅(qū)動程序和統(tǒng)一的編程接口簡化 了打印編程,對編程用戶透明 l標準打印機對話框 l交互打印紙張選擇 l打印時顯示顯示打印狀態(tài)(張數(shù)/打印張數(shù)) 134 lmfc框架為打印及打印予覽完成了大部分功能,為此必須了解打 印過程中函數(shù)調(diào)用序列及哪些函數(shù)要重寫; l打印需要的設(shè)備上下文由框架生成,并作為參數(shù) 顯示: onpaint-ondraw,顯示設(shè)備上下文 打印:onprint-ondraw,打印機設(shè)備上下文 lonprint():每打印一頁,調(diào)用一次,可以添加打印特有的代碼,或 也可以選擇不調(diào)用ondraw,實現(xiàn)
37、顯示與打印完全獨立; lonpreparedc:,可以設(shè)置不同的映射模式,在onprint之前調(diào)用; lonprepareprinting:是第一個調(diào)用的函數(shù),可以設(shè)置頁碼等; lonbeginprinting:onendprinting 135 l幾個函數(shù)之間的關(guān)系: onprepareprinting:設(shè)置頁碼 onbeginprinting:創(chuàng)建gdi對象 onpreparedc:設(shè)置映射模式 onprint():具體完成打印 onendprinting:刪除gdi對象 136 137 l非搶占式多任務(wù)和搶占式多任務(wù) l通過定時器實現(xiàn)的多任務(wù) l多線程編程 l使用事件使線程同步 138
38、l迄今為止所有實例為單線程,只有一個執(zhí)行路 徑; l消息處理過程如下: msg message; while (:getmessage( :dispatchmessage( l沒有消息時程序掛起;消息到來,喚醒, 獲得消息、處理消息 139 lwin32為搶占式多任務(wù) l可以在計算量很大的函數(shù)中采用放棄控制權(quán)的 方法避免死鎖; l一個使用定時器的實例 140 l多線程編程主要工作: 定義全局或靜態(tài)函數(shù),其形式為: luint funcname(lpvoid pparam) 啟動線程: lcwinthread* pthread = afxbeginthread(funcname, pparam,
39、 thread_priority_normal); 線程間交互: l全局變量(:interlockedincrement() l消息 141 l線程同步的幾種技術(shù): 事件、關(guān)鍵段、互斥、信號量 l使用事件使線程同步 使用cevent類,包含afxmt.h; 定義相應(yīng)的cevent對象,對象狀態(tài)為有信號 和無信號; 使用waitforsingleobject和 waitformultiobject在線程中獲取信號狀態(tài), 達到控制線程的目的; 142 lwin32動態(tài)連接庫 l靜態(tài)連接mfc的常規(guī)動態(tài)連接庫 l共享連接mfc的常規(guī)動態(tài)連接庫 l共享連接mfc的擴展動態(tài)連接庫 143 l在不使用mf
40、c功能的情況下 l通過appwizard生成win32 dll框架 l加入要輸出的函數(shù)、變量、類 l_declspec(dllexport)指定作為輸出函數(shù) l_declspec(dllimport)在引用程序中指定輸 入 144 lvc+下引用 需要庫文件*.lib 需要頭文件 lvb下引用 函數(shù)的調(diào)用格式是:_stdcall(或winapi) 需要模塊定義文件*.def,將函數(shù)名和順序號 成對映射 145 l包含exe文件的目錄 l進程的當(dāng)前目錄 lwindows系統(tǒng)目錄 lwindows目錄 l列在path環(huán)境變量中的目錄 146 l可以適用于任意win32編程環(huán)境(包括 vb) ldll的大小比共享連接mfc時大 l*.def文件 l示例 147 l可以適用于任意win32編程環(huán)境(包括 vb) l要求目標機器上有合適的mfc動態(tài)連接 庫 l*.def文件 l示例 148 l能導(dǎo)出c+類,將宏afx_ext_class加入到類聲明 中,如: class afx_ext_class_cstu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年細胞治療產(chǎn)品臨床試驗法規(guī)解讀與審批流程報告
- 海上風(fēng)能資源評估報告2025年深遠海風(fēng)電發(fā)展規(guī)劃海上風(fēng)電場經(jīng)濟效益分析
- 茶與咖啡的跨界融合:2025年市場發(fā)展趨勢與品牌競爭力研究報告
- 城市自來水廠升級改造2025年環(huán)境友好型技術(shù)應(yīng)用報告
- 2025年智能倉儲貨架制造項目智能控制系統(tǒng)研發(fā)報告
- 物聯(lián)網(wǎng)設(shè)備安全漏洞防護策略深度剖析:2025年技術(shù)標準解讀報告001
- 2025年醫(yī)院信息化建設(shè)電子病歷系統(tǒng)優(yōu)化策略研究報告
- 2025年醫(yī)院電子病歷系統(tǒng)優(yōu)化在醫(yī)院信息化建設(shè)中的數(shù)據(jù)安全防護機制研究報告
- 2025年城市地下綜合管廊建設(shè)專項債券資金申請財務(wù)分析報告
- 2025年醫(yī)藥行業(yè)CRO研發(fā)外包模式下的研發(fā)項目管理培訓(xùn)與咨詢報告
- 2025高考化學(xué)復(fù)習(xí)新題速遞之有機合成(解答大題)(2025年4月)
- 《體重管理》課件
- 宗教與中國化課件
- 內(nèi)江市市中區(qū)2025屆小升初必考題數(shù)學(xué)檢測卷含解析
- CNAS-CI01:2012 檢查機構(gòu)能力認可準則
- 《國有企業(yè)改革與發(fā)展》課件
- 本地生活服務(wù)培訓(xùn)
- 心理咨詢師考試實務(wù)能力考核試題及答案
- 高中音樂課程綱要
- 輸血相關(guān)法律法規(guī)及流程
- “五育”融合背景下小學(xué)數(shù)學(xué)教學(xué)策略探究
評論
0/150
提交評論