欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Visual C .NET編程講座之七
摘要

  本講先來(lái)介紹MFC中的"一檔多視"模式,并為Viewer添加一個(gè)用于顯示Web頁(yè)的視圖CWebView,然后討論兩種比較常用的單文檔視圖的切換方法,最后對這兩種方法進(jìn)行分析和比較。

  MFC"一檔多視"模式

  我們知道,MFC應用程序用一種編程模式使程序中數據與它的顯示形式和用戶(hù)交互分離開(kāi)來(lái),這種模式就是"文檔/視圖結構"。在單文檔應用程序結構中,一個(gè)文檔對應于一個(gè)視圖。但有時(shí)一個(gè)文檔可能需要多個(gè)視圖以改變文檔數據的顯示方式,稱(chēng)為"一檔多視",MFC對于這種"一檔多視"提供下列三個(gè)模式:
  第一種模式是用在多文檔應用程序中,用同一個(gè)視圖類(lèi)創(chuàng )建多個(gè)視圖對象,并在各自的窗口中顯示。例如,當我們選擇"窗口"菜單的"新建窗口"命令,程序就會(huì )打開(kāi)一個(gè)新的窗口顯示出相同的文檔內容。在界面上表現為,一個(gè)框架窗口中有多個(gè)文檔窗口,如圖1(a)所示。

  第二種模式是動(dòng)態(tài)切分窗口方式,即在同一個(gè)文檔窗口中創(chuàng )建多個(gè)視圖,用同一方式來(lái)顯示相同的文檔內容。如圖1(b)所示。

  第三種模式是靜態(tài)切分窗口方式,即在同一個(gè)文檔窗口中創(chuàng )建多個(gè)視圖,但每個(gè)視圖可用不同的方式來(lái)顯示文檔內容。如圖1(c)所示。


(a)


(b)


(c)

  圖1 "一檔多視"的三種模式

  但在本講中所討論的"一檔多視"是指在單文檔應用程序中具體多個(gè)視圖的特性。文檔窗口每次只有一個(gè)視圖顯示,但可以通過(guò)菜單等命令在多個(gè)視圖中進(jìn)行切換。我們的目是將文檔內容在"普通文本"和"HTML瀏覽"視圖之間進(jìn)行切換,如圖2(a)和2(b)所示。


(a)


(b)

圖2 視圖切換的結果
添加"HTML瀏覽"視圖

  為了使我們的這個(gè)文本瀏覽器功能更加強大,我們添加一個(gè)"HTML瀏覽"視圖用來(lái)正確顯示出擴展名為.htm或.html等的Web頁(yè)效果。

  1. 添加視圖類(lèi)CWebView

  我們先來(lái)添加一個(gè)視圖類(lèi)CWebView,具體步驟如下:

  (1) 啟動(dòng)Visual Studio .net,打開(kāi)上一講的單文檔應用程序項目Viewer。

  (2) 打開(kāi)"項目"菜單,單擊"添加類(lèi)",彈出"添加資源"對話(huà)框,展開(kāi)左邊的所有"類(lèi)別",單擊"MFC",在右側模板中選中"MFC類(lèi)",如圖3所示。


圖3 "添加類(lèi)"對話(huà)框

  (3) 單擊"打開(kāi)"按鈕,彈出"MFC類(lèi)向導"對話(huà)框。在對話(huà)框中輸入"類(lèi)名"CWebView,然后將基類(lèi)選擇為CHtmlView,CHtmlView類(lèi)封裝了URL資源的瀏覽和鏈接等功能。其它為默認值,結果如圖4所示。


圖4 使用"MFC類(lèi)向導"

  (4) 單擊"完成"按鈕。

  2. 添加代碼并測試CWebView

   (1) 打開(kāi)CWebView類(lèi)的接口文件WebView.h,在最前面加上CHtmlView類(lèi)的包含文件"
"。

   (2) 為CWebView類(lèi)添加OnInitialUpdate函數的重載,并添加如圖5加框部分的代碼。


圖5 在OnInitialUpdate中添加的代碼

   (3) 打開(kāi)CViewerApp::InitInstance函數,將CSingleDocTemplate中的第4個(gè)參數的視圖類(lèi)由原來(lái)的CViewerView改為CWebView。

   (4) 在CViewerApp類(lèi)的實(shí)現文件前面加上"
"。

   (5) 運行程序。圖6是顯示某個(gè)文件的結果。


圖6 CWebView類(lèi)的顯示效果

   (6) 再把CViewerApp::InitInstance函數中的CSingleDocTemplate參數CWebView改回到CViewerView。
最一般的切換方法

  對于單文檔框架窗口中的多個(gè)視圖的切換,我們先看看大多數Visual C++程序員普遍采用的一種方法。具體過(guò)程如下:

  (1) 打開(kāi)Viewer項目的Menu資源IDR_MAINFRAME,在"視圖"菜單中添加三個(gè)菜單項,一個(gè)是水平線(xiàn)(分隔符),一個(gè)是"普通文本(&G)",ID號設為ID_VIEW_TEXT,最后一個(gè)是"HTML瀏覽(&H)",ID號設為ID_VIEW_HTML。結果如圖7所示。


圖7 在"視圖"中添加的菜單項

  (2) 視圖切換的代碼應該添加在CMainFrame類(lèi)中。我們先在CMainFrame類(lèi)添加一個(gè)切換函數SwitchToView1,代碼如圖8所示。


圖8 SwitchToView1函數代碼

  函數SwitchToView1用了一些底層的MFC調用,我們來(lái)看看其代碼執行過(guò)程。

  如果主程序框架窗口一開(kāi)始就激活CViewerView,即pOldView指向CViewerView,則當在程序中調用SwitchToView1(1)時(shí),即參數nView為1,該函數中的第一行代碼用來(lái)獲得當前活動(dòng)的視圖,第二行代碼是通過(guò)GetDlgItem獲得標識為1的窗口指針,由于視圖也是一個(gè)窗口,所以可以直接進(jìn)行指針類(lèi)型的強制轉換。第一次調用時(shí),標識為1的窗口指針是不存在的,因而這個(gè)視圖指針就是NULL,從而執行if語(yǔ)句中的代碼,該代碼是通過(guò)CCreateContext來(lái)創(chuàng )建一個(gè)新的視圖對象指針。

  CCreateContext是用來(lái)將框架窗口、文檔和視圖關(guān)聯(lián)起來(lái),在主程序創(chuàng )建框架窗口以及文檔相關(guān)聯(lián)的視圖時(shí),會(huì )自動(dòng)使用CCreateContext類(lèi)結構;該結構包含了指向文檔、框架窗口和文檔模板的指針,以及一個(gè)CRuntimeClass指針。該結構還包含一些成員變量指針,如m_pCurrentDoc是用來(lái)指定和新創(chuàng )建的視圖相關(guān)聯(lián)的文檔指針。

  接下來(lái)的代碼比較好理解,pOldView->SetDlgCtrID以及SetWindowLong均是用來(lái)為新舊視圖窗口重新指定一個(gè)標識。需要說(shuō)明的是,在MFC底層機制中,應用程序框架窗口中默認的文檔窗口(視圖)標識是使用預定義的AFX_IDW_PANE_FIRST。最后一行的RecalcLayout用來(lái)重新布置框架窗口中的所有對象,包括文檔窗口和視圖。

  當再一次調用SwitchToView1(1)時(shí),由于上次SwitchToView1調用將CViewerView類(lèi)指針與標識1建立聯(lián)系,因而SwitchToView1中的if語(yǔ)句中的代碼就不會(huì )被執行,從而避免了CViewerView類(lèi)視圖對象再一次被創(chuàng )建。這也是為什么要使用SetDlgCtrID語(yǔ)句的原因。

  (3) 在MainFrm.cpp文件的前面添加一些文件包含語(yǔ)句,如圖9所示的加框部分。


圖9 添加的包含文件語(yǔ)句
 (4) 在MainFrm.h文件的前面添加下列代碼,如圖10所示的加框部分。


圖10 在MainFrm.h中添加的語(yǔ)句

  不少人對上述語(yǔ)句不理解:既然使用了包含文件,為什么還要在class CMainFrame前添加"class CViewerView;"等代碼?如果用包含文件代替它,行不行?

  很多Visual C++書(shū)籍對這些問(wèn)題避而不談,但實(shí)際上這是一個(gè)重要的問(wèn)題。如果不能理解上述代碼,我們很可能為無(wú)法通過(guò)編譯而大傷腦筋。這些問(wèn)題的出現是基于這樣的一些事實(shí):在我們用標準C/C++設計程序時(shí),有一個(gè)原則即兩個(gè)代碼文件不能相互包含,而且多次包含還會(huì )造成重復定義的錯誤。為了解決這個(gè)難題,Visual C++使用#pragma once來(lái)通知編譯器在生成時(shí)只包含(打開(kāi))一次,也就是說(shuō),在第一次#include之后,編譯器重新生成時(shí)不會(huì )再對這些包含文件進(jìn)行包含(打開(kāi))和讀取,因此我們看到在用向導創(chuàng )建的所有類(lèi)的頭文件中有#pragma once語(yǔ)句就不會(huì )覺(jué)得奇怪了。然而正是由于這個(gè)語(yǔ)句而造成了在第二次#include后編譯器無(wú)法正確識別所引用的類(lèi)。因此,我們在相互包含時(shí)還需要加入類(lèi)似class CViewerView這樣的語(yǔ)句來(lái)通知編譯器這個(gè)類(lèi)是一個(gè)實(shí)際的調用。

  (5) 重新生成解決方案后運行程序,看看有沒(méi)有出現編譯錯誤,此時(shí)提示出SwitchToView1函數中,CViewerView和CWebView類(lèi)無(wú)法構造,因為它們的構造函數是protected。

  (6) 分別在ViewerView.h和WebView.h文件中,將構造函數CViewerView()和CWebView()前面的訪(fǎng)問(wèn)方式改成public。再運行程序。

  (7) 為CMainFrame類(lèi)添加一個(gè)int類(lèi)型的成員變量m_nViewID,并將其初值設為1。

  (8) 為CMainFrame類(lèi)添加菜單項ID_VIEW_TEXT的COMMAND和UPDATE_COMMAND_UI的事件映射,并在映射函數添加如圖11所示的代碼。


圖11 ID_VIEW_TEXT的映射函數代碼

  (9) 為CMainFrame類(lèi)添加菜單項ID_VIEW_HTML的COMMAND和UPDATE_COMMAND_UI的事件映射,并在映射函數添加如圖12所示的代碼。


圖12 ID_VIEW_HTML的映射函數代碼

  (10) 運行程序,結果如前面圖2所示。
使用CDocument類(lèi)的AddView和RemoveView來(lái)切換

  在CDocument類(lèi)中,AddView和RemoveView可以說(shuō)是專(zhuān)門(mén)用于單文檔視圖的切換的,具體實(shí)現過(guò)程如下:

  (1) 在CMainFrame類(lèi)添加兩個(gè)變量,一個(gè)是CViewerView類(lèi)指針對象m_pMainView,另一個(gè)是CWebView類(lèi)指針對象m_pWebView。需要說(shuō)明的是,用"添加成員變量向導"添加指針對象m_pMainView時(shí),指定的類(lèi)型名應是CViewerView*,注意后面的星號。m_pWebView添加時(shí)也類(lèi)似。

  (2) 為CWebView類(lèi)添加一個(gè)CString類(lèi)成員變量strFileName。

  (3) 將CWebView::OnInitialUpdate中的語(yǔ)句"
"刪除。

  (4) 在CMainFrame類(lèi)添加成員函數SwitchToView2,用于切換視圖,其代碼如圖13所示。


圖13 SwitchToView2函數代碼

  (5) 將CMainFrame::OnViewText和OnViewHtml中的SwitchToView1函數調用改為SwitchToView2,其余不變。

  (6) 運行程序,結果如前圖2所示。

  兩種切換方法的比較

  SwitchToView1切換方法實(shí)質(zhì)上是創(chuàng )建兩個(gè)具有與文檔相關(guān)聯(lián)的視圖,即視圖創(chuàng )建時(shí)指定CCreateContext結構,具有很直接的"一檔多視"的關(guān)系。而SwitchToView2方法是通過(guò)CDocument類(lèi)的AddView和RemoveView來(lái)改變一個(gè)文檔與多個(gè)視圖的關(guān)聯(lián)。

  由于SwitchToView1中創(chuàng )建的視圖帶有文檔關(guān)聯(lián),因此可以直接在視圖類(lèi)中通過(guò)GetDocument()函數來(lái)獲取相關(guān)聯(lián)的文檔指針,從而可以訪(fǎng)問(wèn)文檔中的數據。而SwitchToView2中創(chuàng )建的視圖本身不帶文檔關(guān)聯(lián),因此無(wú)法直接訪(fǎng)問(wèn)文檔中的數據。

  由于SwitchToView2中需要在函數外指定視圖類(lèi)指針變量,因此在各個(gè)視圖中可以通過(guò)AfxGeMainWnd()獲取CMainFrame類(lèi)指針,從而可以直接該問(wèn)到CMainFrame類(lèi)中定義的public視圖類(lèi)指針變量,這樣便可在視圖類(lèi)之間直接訪(fǎng)問(wèn)。而SwitchToView1中的視圖類(lèi)指針變量是在函數內定義的,因此無(wú)法在各個(gè)視圖類(lèi)中進(jìn)行視圖之間的訪(fǎng)問(wèn),并且在本例中CViewerView類(lèi)對象被創(chuàng )建了兩次。SwitchToView2中,CViewerView類(lèi)對象只創(chuàng )建一次。

  除了上述兩種方法外,還有一種方法,那就是使用靜態(tài)切分機制來(lái)進(jìn)行。由于它涉及過(guò)多的底層方法,對初學(xué)者而言,相對較難,因此這里不再給出。

  結束語(yǔ)

  在本講中,我們重點(diǎn)討論了視圖類(lèi)的添加、單文檔的視圖切換方法和技巧。對于初學(xué)者來(lái)說(shuō),學(xué)習并掌握這些技巧能對MFC的文檔/視圖機制有一個(gè)較為深入的了解。當然,MFC文檔/視圖機制本身是非常復雜的,在以后的學(xué)習中應慢慢地體會(huì )和理解。在最后一講中,我們將重點(diǎn)應用程序的安裝和部署。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
如何聯(lián)系CMainFrame和CView各自的成員變量? VC/MFC / 界面
MFC 中獲得各個(gè)類(lèi)的指針/句柄 ID的總結(轉)
MFC單文檔程序架構解析
深入分析MFC文檔視圖結構
框架、文檔、視圖類(lèi)之間的調用關(guān)系
VS2010/MFC編程入門(mén)之四十一(文檔、視圖和框架:分割窗口)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久