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

提交评论