VC中各類的調用_第1頁
VC中各類的調用_第2頁
VC中各類的調用_第3頁
免費預覽已結束,剩余17頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、6、在其他類中獲取文檔、視圖指針SDI:CMa in Frame* pMai nF rame = (CMa in Frame*)AfxGetMai nWnd();CYourDoc* pDoc = (CYourDoc*)pMa in Frame->GetActiveDocume nt();CYourView* pView = (CYourView*)pMai nFrame->GetActiveView();MDI:CMa in Frame* pMai nF rame = (CMa in Frame*)AfxGetMai nWnd();CChildFrame* pChildFrame

2、= (CChildFrame*)pMai nFrame->GetActiveFrame();CYourDoc* pDoc = (CYourDoc*)pChildFrame->GetActiveDocume nt();CYourView* pView = (CYourView*)pChildFrame->GetActiveView();從視圖獲取文檔指針:CYourDoc* pDoc = GetDocume nt();從文檔獲取視圖指針:利用成員函數GetFirstViewPosition()和 GetNextView()遍歷 virtual POSITION GetFirst

3、ViewPositio n() const;virtual CView* GetNextView(POSITIO N& rPositi on) con st;SDI:CYourView* pView;POSITION pos = GetFirstViewPositio n();pView = GetNextView(pos);MDI:定義函數CView* CYourDoc:GetView(CR un timeClass* pCIass)CView* pView;POSITION pos=GetFirstViewPositio n();while(pos!=NULL)pView=GetN

4、extView(pos);if(!pView->lsKi ndOf(pClass)break;if(!pView->lsKi ndOf(pClass)AfxMessageBox("Co nnt Locate the View.");return NULL;return pView;使用如下:CYourView* pView=(CYourView*)GetView(RUNTIME_CLASS(CYourView);1、獲取應用程序指針CMyApp* pApp=(CMyApp*)AfxGetApp();2、獲取主框架指針CWin App 中的公有成員變量 m_pMa

5、i nWnd就是主框架的指針CMai nF rame* pMai nF rame = (CMai nF rame*)(AfxGetApp()->m_pMai nWnd);或者CMa in Frame* pMai nF rame = (CMa in Frame*)AfxGetMai nWnd();3、獲取菜單指針CMe nu* pMe nu = AfxGetMai nWnd()->GetMe nu();4、獲取工具欄、狀態欄指針主框架中可以直接使用m_wndToolBar、m_wndStatusBar其他:CToolBar* pToolBar =(CToolBar*)AfxGetMa

6、i nWnd()->GetDesce nda ntWin dow(AFX_IDW_TOOLBAR);CStatusBar* pStatusBar =(CStatusBar*)AfxGetMai nWnd()->GetDesce ndantWin dow(AFX_IDW_STATUS_BAR);5、獲取控件指針先用 GetDlgItem() 再轉換,如:CButto n* pButton = (CButto n*)GetDlgltem(IDC_MYBUTTON);6、獲取文檔、視圖指針SDI:CMa in Frame* pMai nF rame = (CMa in Frame*)Af

7、xGetMai nWnd();CYourDoc* pDoc = (CYourDoc*)pMa in Frame->GetActiveDocume nt();CYourView* pView = (CYourView*)pMai nFrame->GetActiveView();MDI:CMa in Frame* pMai nF rame = (CMa in Frame*)AfxGetMai nWnd();CChildFrame* pChildFrame = (CChildFrame*)pMai nFrame->GetActiveFrame();CYourDoc* pDoc =

8、(CYourDoc*)pChildFrame->GetActiveDocume nt();CYourView* pView = (CYourView*)pChildFrame->GetActiveView();7、文檔、視圖從視圖獲取文檔指針:CYourDoc* pDoc = GetDocume nt();從文檔獲取視圖指針:利用成員函數 GetFirstViewPosition() 和 GetNextView()遍歷virtual POSITION GetFirstViewPositio n() const;virtual CView* GetNextView(POSITIO N

9、& rPositi on) const;SDI:CYourView* pView;POSITION pos = GetFirstViewPositio n();pView = GetNextView(pos);MDI:定義函數CView* CYourDoc:GetView(CR un timeClass* pClass)CView* pView;POSITION pos=GetFirstViewPositio n();while(pos!=NULL)pView=GetNextView(pos);if(!pView->lsKi ndOf(pClass)break;if(!pView

10、->lsKi ndOf(pClass)AfxMessageBox("Co nnt Locate the View.");return NULL;return pView;使用如下:CYourView* pView=(CYourView*)GetView(RUNTIME_CLASS(CYourView);&文檔模版、文檔從文檔獲取文檔模版指針:CDocTemplate* GetDocTemplate() con st;從文檔模版獲取文檔指針:viaual POSITION GetFirstDocPositio n() con st = 0;visual CDoc

11、ume nt* GetNextDoc(POSITION & rPos) const = 0;9、獲取分割視圖中各個視圖的指針主框架中定義:CSplitterWnd m_wn dSplitter;定義兩個 View 類:CViewl、CView2框架類中重載:BOOL CMai nFrame:O nCreateClie nt(LPCREATESTRUCT, CCreateCo ntext* pCo ntext)VERIFY(m_splitter.CreateStatic(this,2,1); / 分割成兩行一列VERIFY(m_splitter.CreateView(0,0,RUNTIM

12、E_CLASS(CView1),CSize(100,100),pCon text);VERIFY(m_splitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext);return TRUE;獲取分割視圖指針CView1* pView1 = (CView1*)m_w ndSplitter.GetPa ne(O,O);CView2* pView2 = (CView2*)m_w ndSplitter.GetPa ne(1,0);10、通過鼠標獲得子窗口指針CWnd* ChildWi ndowFromPoi nt(POINT

13、 poi nt) const;CWnd* ChildWi ndowFromPoi nt(POINT poi nt,UINT n Flags) const;用于確定包含指定點的子窗口如果指定點在客戶區之外,函數返回NULL ;如果指定點在客戶區,但是不屬于任何一個子窗口,函數返回該CWnd的指針;如果有多個子窗口包含指定點,則返回第一個子窗口的指針。還要注意的是,該函數返回的是一個偽窗口指針,不能將它保存起來供以后使用。對于第二個參數 nF lags有幾個含義:CWP_ALLfile:/不忽略任何子窗口CWP_SKIPNIVSIBLE file:/ 忽略不可見子窗口CWP_SKIPDISABLE

14、D file:/ 忽略禁止的子窗口CWP_SKIPRANSPARENT file:/忽略透明子窗口獲取工具條的指針在缺省狀態下,有一個默認的工具條 AFX_IDW_TOOLBAR ,我們可以根據相應的ID去獲取工具條指 針,方法如下:CToolBar* pToolBar=(CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);是不是很簡單?獲取狀態條的指針在缺省狀態下,有一個默認的狀態條AFX_IDW_STATUS_BAR ,我們自然也可以根據相應的ID去獲取狀態條指針,方法如下:CStatusBar* pTool

15、Bar=(CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);是不是同樣很簡單?獲取控件的指針這里有兩種方法。一、調用CWnd: : GetDlgItem ,獲取一個CWnd*指針調用成員函數。例如,我們想獲取CButton指針, 方法如下:CButton* pButton=(CButton*) GetDlgItem (IDC_MYBUTTON);二、 可以使用 ClassWizard將控件和成員變量聯系起來。在ClassWizard中簡單地選擇 MemberVariables標簽,然后選擇 Add V

16、ariable按鈕。如 果在對話資源編輯器中,按下Ctrl鍵并雙擊控件即可轉到 Add Member Variable 對話。在文檔類中調用視圖類指針我們可以利用文檔類的成員函數GetFirstView()和GetNextView()遍歷視圖。在視圖類中調用文檔類其實,在視圖類中有一個現成的成員函數供我們使用,那就是:GetDocument();利用它我們可以很容易的得到文檔類指針,我們先看一下GetDocument()函數的實現:CColorButtonDoc* CColorButtonView:GetDocument()ASSERT(m_pDocument->lsKindOf(RUN

17、TIME_CLASS(CColorButtonDoc);return (CColorButtonDoc*)m_pDocument;這里實際上是將m_pDocument強制轉換成CColorButtonDoc* , 也就是我們想要的。在框架類中調用文檔類、視圖類這里我們可以利用 GetActiveXXXXX()去掉用當前激活的文檔和視圖:CMyDoc* pDoc=(CMyDoc*)GetActiveDocument();CMyView* pView=(CMyView*)GetActiveView();獲得應用程序指針這個很簡單,一句話搞定:CMyApp* pApp=(CMyApp*)AfxGet

18、App();獲得主框架指針在類CWinThread里面有一個公有的成員變量:CWnd* m_pMainWnd; 它存在的主要目的就是提供 我們獲得CWnd指 針,我們可以利用它來達到我們的目的:CMainFrame* pFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);通過鼠標獲 得子窗口指針這里我們要用到一個不太常用的函數:ChildWindowFromPoint 。他的原型如下:CWnd* ChildWindowFromPoint(POINT point) const;CWnd* ChildWindowFromPoint(POINT point

19、,UINT nFlags) const;這個函數用于確定包含指定點的子窗口,如果指定點在客戶區之外,函數返回NULL ;如果指定點在客戶區,但是不屬于任何一個子窗口,函數返回該CWnd的指針;如果有多個子窗口包含指定點,則返回第一個子窗口的指針。不過,這里還要注意的是:該函數返回的是一個偽窗口指針,不能將它保存起來供以后使用。對于第二個參數nFlags有幾個含義:CWP_ALLfile:/不忽略任何子窗口CWP_SKIPNIVSIBLEfile:/ 忽略不可見子窗口CWP_SKIPDISABLEDfile:/ 忽略禁止的子窗口CWP_SKIPRANSPARENT file:/ 忽略 透明子窗口

20、在何時何地,你都可以通過以下方法精確的得到任何一個對象(Application ,DocTemplate,Document , View,Frame )1。通過AfxGetApp()得到當前的 App對象;2。通過 AfxGetMainWnd ()得到主窗口;3。 通過 CMDIFrameWnd:GetActiveFrame得到當前活動窗口;4。通過GetNextWindow()遍例所有的子窗口;(如果要得到你想要的子窗口,可以通過特 定的成員變量來標志);5。 通過 CWinApp:GetFirstDocTemplatePostion()以及 CWinApp:GetNextDocTempla

21、te()的組合應用來遍歷所有的DocTemplate對象,并且用 CDocTemplate:GetDocString()來判斷當前得到的文檔莫板對象是哪個。6。 通過 CDocTemplate:GetFirstDocPosition()以及 CDocTemplate 的 GetNextDoc ()組板,用 CDocment:GetTitle() 或者 GetPathName()來判斷當前的文檔是哪個。7。通過 CDocuemt 的 GetFirstViewPositon() 以及 GetNextView()來遍歷視圖對象,一般通過訪問View的成員變量來區別各個視圖;通過 CView:GetD

22、ocument() 來得到文檔對 象;8。Frame->View : 通過 GetActiveView 方法;9。Frame->Doc :通過 GetActiveDocument();10。View->Frame : GetParentFrame();11。 View->Doc:GetDocuemt()前面已經說了。12。Doc->View:前面說了;13。Doc->Frame:不知道有沒有很直接的方法。MFC應用程序中指針的使用1)在View中獲得Doc指針2)在App中獲得 MainFrame 指針3)在View中獲得 Mai nF rame 指針4)獲

23、得View (已建立)指針5)獲得當前文檔指針6)獲得狀態欄與工具欄指針7)獲得狀態欄與工具欄變量8)在Main frame獲得菜單指針9)在任何類中獲得應用程序類10)從文檔類取得視圖類的指針(1)11)在App中獲得文檔模板指針12)從文檔模板獲得文檔類指針13)在文檔類中獲得文檔模板指針14)從文檔類取得視圖類的指針(2)15)從一個視圖類取得另一視圖類的指針VC中編程對于剛剛開始學習的同學,最大的障礙和問題就是消息機制和指針獲取與操作。其實這些容基本上是每本VC學習工具書上必講的容,而且通過MSDN很多問題都能解決。下面文字主要是個人在編程中指針使用的一些體會,說的不當的地方請指正。一

24、般我們使用的框架是VC提供的 Wizard生成的MFC App Wizard(exe)框架,無論是多文檔還是單文檔,都存在指針獲取和操作問題。下面這節容主要是一般的框架,然后再講多線程中的指針使用。使用到的類需要包含響應的頭文件。首先一般獲得本類(視,文檔,對話框都支持)實例指針this,用this的目的,主要可以通過類中的函數向其他類或者函數中發指針,以便于在非本類中操作和使用本類中的功能。1) 在 View 中獲得 Doc 指針 CYouSDIDoc *pDoc=GetDocument();個視只能有一個文 檔。2) 在App中獲得 MainFrame 指針CWin App 中的 m_pM

25、ai nWnd 變量就是 Mai nF rame 的指針也可以:CMa inF rame *pMa in =(CMa in Frame *)AfxGetMai nWnd();3) 在 View 中獲得 Mai nF rame 指針 CMai nF rame *pMa in=(CmaimFrame*)AfxGetApp()->m_pMai nWnd;4) 獲得 View (已建立)指針 CMainFrame *pMain=(CmaimFrame*)AfxGetApp()->m_pMai nWnd;CyouView *pView=(CyouView *)pMai n->GetAc

26、tiveView();5) 獲得當前文檔指針CDocument * pCurrentDoc =(CFrameWnd*)m_pMai nWnd->GetActiveDocume nt();6) 獲得狀態欄與工具欄指針CStatusBar * pStatusBar = (CStatusBar*)AfxGetMai nWnd()->GetDesce nda ntWin dow(AFX_IDW_STATUS_BAR);CToolBar * pToolBar=(CtoolBar*)AfxGetMai nWnd()->GetDesce ndantWin dow(AFX_IDW_TOOLB

27、AR);7) 如果框架中加入工具欄和狀態欄變量還可以這樣(CMai nFrame *)GetPare nt()->m_w ndToolBar;(CMai nFrame *)GetPare nt()->m_w ndStatusBar;8) 在 Mainframe 獲得菜單指針 CMenu *pMenu=m_pMainWnd->GetMenu();9) 在任何類中獲得應用程序類用MFC全局函數 AfxGetApp()獲得。10) 從文檔類取得視圖類的指針我是從 download.cqcnc./soft/program/article/vc/vc405.html學 至曲勺,從文檔獲

28、得視圖類指針目的一般為了控制同一文檔的多個視圖的定位問題,我的體會特別是文字處理 CEditView當產生多個視圖類時,這個功能是非常需要的。CDocument類提供了兩個函數用于視圖類的定位:GetFirstViewPosition()和 GetNextView()virtual POSITION GetFirstViewPositio n() const;virtual CView* GetNextView(POSITIO N& rPositi on) const;注意:GetNextView()括 號中的參數用的是引用方式,因此執行后值可能改變。GetFirstViewPosit

29、io n()用于返回第一個視圖位置(返回的并非視圖類指針,而是一個POSITION類型值),GetNextView()有兩個功能:返回下一個視圖類的指針以及用 引用調用的方式來改變傳入的POSITION類型參數的值。很明顯,在Test程序中,只有一個視圖類,因此只需將這兩個函數調用一次即可得到CTestView的指針如下(需定義一個POSITION結構變量來輔助操作):CTestView* pTestView;POSITION pos=GetFirstViewPositio n();pTestView=GetNextView(pos);這樣,便可到了 CTestView類的指針pTestVie

30、w.執行完幾句后,變量pos=NULL,因為沒有下一個視圖類,自然也沒有下一個視圖類的POSITION.但是這幾條語句太簡單,不具有太強的通用性和安全特征;當象前面說的那樣,當要在多個視圖為中返回某個指 定類的指針 時,我們需要遍歷所有視圖類,直到找到指定類為止。判斷一個類指針指 向的是否某個類的實例時,可用IsKindOf()成員函數時行檢查,如:pView->lsKi ndOf(RUNTIME_CLASS(CTestView);即可檢查pView所指是否是 CTestView 類。有了以上基礎,我們已經可以從文檔類取得任何類的指針。為了方便,我們將其作 為一個文 檔類的成員函數,它有

31、一個參數,表示要獲得哪個類的指針。實現如下:CView* CTestDoc:GetView(CR un timeClass* pClass)CView* pView;POSITION pos=GetFirstViewPositio n();while(pos!=NULL) pView=GetNextView(pos); if(!pView->lsKi ndOf(pClass) break; if(!pView->lsKi ndOf(pClass)AfxMessageBox("Connt Locate the View.rn.VCKBASE.");return N

32、ULL;return pView;其中用了兩次視圖類的成員函數IsKindOf()來判斷,是因為退出 while循環有三種可能:1. pos為NULL,即已經不存在下一個視圖類供操作;2. pView已符合要求。1和2同是滿足。這是因為 GetNextView()的功能是將當前視圖指針改變成一個視圖的位置同時返回當前視圖指針,因此 pos是pView的下一個視圖類的POSITION,完全 有可能既是pos=NULL又是pView符合需要。當所需的視圖是最后一個視圖是最后一 個視圖類時 就如引。因此需采用兩次判斷。使用該函數應遵循如下格式(以取得 CTestView指針為例):CTestView

33、* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView);RUNTIME_CLASS是一個宏,可以簡單地理解它的作用:將類的名字轉化為CRu ntimeClass為指針。至于強制類型轉換也是為了安全特性考慮的,因為從同一個 基 類之間的指針類型是互相兼容的。這種強制類型轉換也許并不必要,但能避免一 些可能出現的麻煩。3. 從一個視圖類取得另一視圖類的指針綜合1和2,很容易得出視圖類之間互相獲得指針的方法:就是用文檔類作中轉,先用1的方法得到文檔類的指針,再用2的方法,以文檔類的視 圖定位函數取得另一個視圖類。同樣,可以實現成一個函數:(假

34、設要從CTestAView中取得指向其它視圖類的指針)CView* CTestAView:GetView(CR un timeClass* pClass)CTestDoc* pDoc=(CTestDoc*)GetDocume nt();CView* pView;POSITION pos=pDoc->GetFirstViewPositio n();while(pos!=NULL)pView=pDoc->GetNextView(pos);if(!pView->lsKi ndOf(pClass)break;if(!pView->lsKi ndOf(pClass)AfxMess

35、ageBox("Co nnt Locate the View.");return NULL;return pView;這個函 數和2中的GetView()相比,一是多了第一句以取得文檔類指針,二是在GetFirstViewPosition() 和GetNextView()前加上了文檔類指針,以表示它們是文檔類成員函數。有了此函數;當要從 CTestAView中取得CTestBView的指針時,只需如下:CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView);對于單文檔中也可以加入多個文檔模板,但是一般的開發就使用MDI方式開發多文檔模板,其方法與上述視圖的獲取方法很接近,這里稍做解釋,如果不清楚,請查閱 MSDN,(以下四個容(11、12、13、14)來源:sanjia nxia.myrice./vc /vc45.htm )可以用CWinApp:GetFirstDocTemplatePostion獲得應用程序注冊的第一個文檔模板的位置;利用該值來調用CWinApp:GetNextDocTemplate 函數,獲得第一個CDocTemplate 對象指針。POSITION GetFirstDocTemplate( ) con st;CDocTemplate *GetNex

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論