已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6、在其他类中获取文档、视图指针SDI:CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();CYourDoc* pDoc = (CYourDoc*)pMainFrame-GetActiveDocument();CYourView* pView = (CYourView*)pMainFrame-GetActiveView();MDI:CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();CChildFrame* pChildFrame = (CChildFrame*)pMainFrame-GetActiveFrame();CYourDoc* pDoc = (CYourDoc*)pChildFrame-GetActiveDocument();CYourView* pView = (CYourView*)pChildFrame-GetActiveView();从视图获取文档指针:CYourDoc* pDoc = GetDocument();从文档获取视图指针:利用成员函数 GetFirstViewPosition() 和 GetNextView() 遍历virtual POSITION GetFirstViewPosition() const;virtual CView* GetNextView(POSITION& rPosition) const;SDI:CYourView* pView;POSITION pos = GetFirstViewPosition();pView = GetNextView(pos);MDI:定义函数CView* CYourDoc:GetView(CRuntimeClass* pClass) CView* pView; POSITION pos=GetFirstViewPosition(); while(pos!=NULL) pView=GetNextView(pos); if(!pView-IsKindOf(pClass) break; if(!pView-IsKindOf(pClass) AfxMessageBox(Connt Locate the View.); return NULL; return pView;使用如下:CYourView* pView=(CYourView*)GetView(RUNTIME_CLASS(CYourView);1、获取应用程序指针CMyApp* pApp=(CMyApp*)AfxGetApp();2、获取主框架指针CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()-m_pMainWnd);或者CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();、获取菜单指针CMenu* pMenu = AfxGetMainWnd()-GetMenu();、获取工具栏、状态栏指针主框架中可以直接使用m_wndToolBar、m_wndStatusBar其他:CToolBar* pToolBar = (CToolBar*)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_TOOLBAR);CStatusBar* pStatusBar = (CStatusBar*)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_STATUS_BAR);5、获取控件指针先用 GetDlgItem() 再转换,如:CButton* pButton = (CButton*)GetDlgItem(IDC_MYBUTTON);6、获取文档、视图指针SDI:CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();CYourDoc* pDoc = (CYourDoc*)pMainFrame-GetActiveDocument();CYourView* pView = (CYourView*)pMainFrame-GetActiveView();MDI:CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();CChildFrame* pChildFrame = (CChildFrame*)pMainFrame-GetActiveFrame();CYourDoc* pDoc = (CYourDoc*)pChildFrame-GetActiveDocument();CYourView* pView = (CYourView*)pChildFrame-GetActiveView();7、文档、视图从视图获取文档指针:CYourDoc* pDoc = GetDocument();从文档获取视图指针:利用成员函数 GetFirstViewPosition() 和 GetNextView() 遍历virtual POSITION GetFirstViewPosition() const;virtual CView* GetNextView(POSITION& rPosition) const;SDI:CYourView* pView;POSITION pos = GetFirstViewPosition();pView = GetNextView(pos);MDI:定义函数CView* CYourDoc:GetView(CRuntimeClass* pClass) CView* pView; POSITION pos=GetFirstViewPosition(); while(pos!=NULL) pView=GetNextView(pos); if(!pView-IsKindOf(pClass) break; if(!pView-IsKindOf(pClass) AfxMessageBox(Connt Locate the View.); return NULL; return pView;使用如下:CYourView* pView=(CYourView*)GetView(RUNTIME_CLASS(CYourView);8、文档模版、文档从文档获取文档模版指针:CDocTemplate* GetDocTemplate() const;从文档模版获取文档指针:viaual POSITION GetFirstDocPosition( ) const = 0; visual CDocument* GetNextDoc(POSITION & rPos) const = 0;9、获取分割视图中各个视图的指针主框架中定义:CSplitterWnd m_wndSplitter;定义两个View类:CView1、CView2框架类中重载:BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext) VERIFY(m_splitter.CreateStatic(this,2,1); /分割成两行一列 VERIFY(m_splitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100),pContext); VERIFY(m_splitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext); return TRUE;获取分割视图指针CView1* pView1 = (CView1*)m_wndSplitter.GetPane(0,0);CView2* pView2 = (CView2*)m_wndSplitter.GetPane(1,0);10、通过鼠标获得子窗口指针CWnd* ChildWindowFromPoint(POINT point) const;CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const;用于确定包含指定点的子窗口如 果指定点在客户区之外,函数返回NULL;如果指定点在客户区内,但是不属于任何一个子窗口,函数返回该CWnd的指针;如果有多个子窗 口包含指定点,则返回第一个子窗口的指针。还要注意的是,该函数返回的是一个伪窗口指针,不能将它保存起来供以后使用。对于第二个参数 nFlags有几个含义:CWP_ALL file:/不忽略任何子窗口CWP_SKIPNIVSIBLE file:/忽略不可见子窗口CWP_SKIPDISABLED file:/忽略禁止的子窗口CWP_SKIPRANSPARENT file:/忽略透明子窗口获 取工具条的指针在缺省状态下,有一个默认的工具条AFX_IDW_TOOLBAR, 我们可以根据相应的ID去获取工具条指针,方法如下: CToolBar* pToolBar=(CToolBar*)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_TOOLBAR);是不是很简单?获取状态条的指 针在缺省状态下,有一个默认的状态条AFX_IDW_STATUS_BAR, 我们自然也可以根据相应的ID去获取状态条指针,方法如下: CStatusBar* pToolBar=(CStatusBar*)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_STATUS_BAR);是不是同样很简单? 获取控件的指针 这里有两种方法。一、调用CWnd: : GetDlgItem, 获取一个CWnd*指针调用成员函数。例如,我们想获取CButton指针,方法如下: CButton* pButton=(CButton*) GetDlgItem (IDC_MYBUTTON);二、可以使用ClassWizard将控件和成员变量联系起来。在ClassWizard中 简单地选择Member Variables标签,然后选择Add Variable 按钮。如 果在对话资源编辑器中,按下Ctrl键并双击控件即可转到Add Member Variable对 话。 在文档类中调用 视图类指针我们可以利用文档类的成员函数GetFirstView()和GetNextView()遍 历视图。 在视图类中调用文档类其实,在视图类中有一个现成的成员函数供我们使用,那就是:GetDocument();利 用它我们可以很容易的得到文档类指针,我们先看一下GetDocument()函数的实现: CColorButtonDoc* CColorButtonView:GetDocument() ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CColorButtonDoc);return (CColorButtonDoc*)m_pDocument; 这里实际上是将m_pDocument强制转换成CColorButtonDoc*, 也就是我们想要的。 在框架类中调 用文档类、视图类这里我们可以利用GetActiveXXXXX()去 掉用当前激活的文档和视图: CMyDoc* pDoc=(CMyDoc*)GetActiveDocument(); CMyView* pView=(CMyView*)GetActiveView(); 获得应用程序指针这个很简单,一句话搞定: CMyApp* pApp=(CMyApp*)AfxGetApp(); 获得主框架指 针在类CWinThread里面有一个公有 的成员变量:CWnd* m_pMainWnd; 它存在的主要目的就是提供我们获得CWnd指 针,我们可以利用它来达到我们的目的: CMainFrame* pFrame=(CMainFrame*)(AfxGetApp()-m_pMainWnd);通过鼠标获 得子窗口指针这里我们要用到一个不太常用的函数:ChildWindowFromPoint。 他的原型如下: CWnd* ChildWindowFromPoint(POINT point) const; CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const;这个函数用于确定包含指定点的子窗口,如果指定点在客户区之外,函数返回NULL;如果指定点在客户区 内,但是不属于任何一个子窗口,函数返回该CWnd的指针;如果有多个子窗口包含指定点,则返回第一个子窗口的指针。不过,这 里还要注意的是:该函数返回的是一个伪窗口指针,不能将它保存起来供以后使用。对于第二个参数nFlags有几个含义: CWP_ALLfile:/不忽略任何子窗口 CWP_SKIPNIVSIBLEfile:/忽略不可见子窗口 CWP_SKIPDISABLEDfile:/忽略禁止的子窗口 CWP_SKIPRANSPARENTfile:/忽略 透明子窗口 在何时何地,你都可以通过以下方法精确的得到任何一个对象 (Application,DocTemplate,Document,View,Frame)1。通过AfxGetApp()得到当前的App 对象;2。通过AfxGetMainWnd()得到主窗口;3。通过CMDIFrameWnd:GetActiveFrame得到当前 活动窗口;4。通过GetNextWindow()遍例所有的子窗口;(如果要得到你想要的子窗口,可以通过特定的成员变量来标志);5。 通过CWinApp:GetFirstDocTemplatePostion()以及CWinApp:GetNextDocTemplate()的组 合应用来遍历所有的DocTemplate对象,并且用CDocTemplate:GetDocString()来判断当前得到的文档莫板对象是哪个。6。 通过CDocTemplate:GetFirstDocPosition()以及CDocTemplate的GetNextDoc()组合来遍历所有的 该模板的文档对象,并用CDocument:GetDocTemplate()来得到文档模板,用CDocment:GetTitle() 或者GetPathName()来判断当前的文档是哪个。7。通过CDocuemt的GetFirstViewPositon()以及 GetNextView()来遍历视图对象,一般通过访问View的成员变量来区别各个视图;通过CView:GetDocument()来得到文档对 象;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中获得MainFrame指针4) 获得View(已建立)指针5) 获得当前文档指针6) 获得状态栏与工具栏指针7) 获得状态栏与工具栏变量8) 在Mainframe获得菜单指针9) 在任何类中获得应用程序类10) 从文档类取得视图类的指针(1)11) 在App中获得文档模板指针12) 从文档模板获得文档类指针13) 在文档类中获得文档模板指针14) 从文档类取得视图类的指针(2)15) 从一个视图类取得另一视图类的指针VC中编程对于刚刚开始学习的同学,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本 上是每本VC学习工具书上必讲的内容,而且通过MSDN很多问题都能解决。下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方 请指正。一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获 取和操作问题。下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文 档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功 能。1) 在View中获得Doc指针 CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文档。2) 在App中获得MainFrame指针CWinApp 中的 m_pMainWnd变量就是MainFrame的指针也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();3) 在View中获得MainFrame指针 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()-m_pMainWnd;4) 获得View(已建立)指针 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()-m_pMainWnd;CyouView *pView=(CyouView *)pMain-GetActiveView();5) 获得当前文档指针 CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd-GetActiveDocument();6) 获得状态栏与工具栏指针 CStatusBar * pStatusBar(CStatusBar *)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_STATUS_BAR);CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_TOOLBAR);7) 如果框架中加入工具栏和状态栏变量还可以这样 (CMainFrame *)GetParent()-m_wndToolBar;(CMainFrame *)GetParent()-m_wndStatusBar;8) 在Mainframe获得菜单指针 CMenu *pMenu=m_pMainWnd-GetMenu();9) 在任何类中获得应用程序类用MFC全局函数 AfxGetApp()获得。10) 从文档类取得视图类的指针我是从/soft/program/article/vc/vc405.html学 到的,从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会特别是文字处理CEditView当产生多个视图类 时,这个功能是非常需要的。 CDocument类提供了两个函数用于视图类的定位:GetFirstViewPosition()和 GetNextView() virtual POSITION GetFirstViewPosition() const;virtual CView* GetNextView(POSITION& rPosition) const;注意:GetNextView()括 号中的参数用的是引用方式,因此执行后值可能改变。GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指 针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调用的方式来改变传入 的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如 下(需定义一个POSITION结构变量来辅助操作): CTestView* pTestView;POSITION pos=GetFirstViewPosition();pTestView=GetNextView(pos);这样,便可到了 CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的 POSITION.但是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针 时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:pView-IsKindOf(RUNTIME_CLASS(CTestView);即 可检查pView所指是否是CTestView类。有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文 档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下: CView* CTestDoc:GetView(CRuntimeClass* pClass)CView* pView;POSITION pos=GetFirstViewPosition();while(pos!=NULL)pView=GetNextView(pos);if(!pView-IsKindOf(pClass)break;if(!pView-IsKindOf(pClass)AfxMessageBox(Connt Locate the View.rn http:/www.VCKBASE.com);return NULL;return pView;其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出 while循环有三种可能:1.pos为NULL,即已经不存在下一个视图类供操作;2.pView已符合要求。1和2 同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一 个视图类的POSITION,完全有可能既是pos=NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时 就如引。因此需采用两次判断。使用该函数应遵循如下格式(以取得CTestView指针为例):CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView);RUNTIME_CLASS 是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个基 类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。3.从一个视图类取得另一视图类的指针 综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视 图定位函数取得另一个视图类。同样,可以实现成一个函数:(假设要从CTestAView中取得指向其它视图类的指针)CView* CTestAView:GetView(CRuntimeClass* pClass)CTestDoc* pDoc=(CTestDoc*)GetDocument();CView* pView;POSITION pos=pDoc-GetFirstViewPosition();while(pos!=NULL)pView=pDoc-GetNextView(pos);if(!pView-IsKindOf(pClass)break;if(!pView-IsKindOf(pClass)AfxMessageBox(Connt 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)来源:/vc /vc45.htm)可以用CWinApp:GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的 位置;利用该值来调用CWinApp:GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。 POSITION GetFirstDocTemplate( ) const; CDocTemplate *GetNextDocTemplate( POSITI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC TS 62282-7-1:2025 EN Fuel cell technologies - Part 7-1: Test methods - Single cell performance tests for polymer electrolyte fuel cells (PEFC)
- 心理学视角下的亲子教育
- 2025版传染性感冒症状解读及护理分享
- 环境设计毕业设计中期汇报
- 个人理财实训总结
- 老年骨质疏松症康复指南
- 居间协议书点位多少合法
- 婚后协议书出轨净身出户
- 2025-2026学年北京市房山区七年级物理上册期中考试试卷及答案
- 西师版高二化学上册月考考试试题及答案
- 山东淄博历年中考语文现代文阅读真题33篇(含答案)(2003-2023)
- 新《劳动合同法》知识学习考试题库200题(含答案)
- 【员工持股问题探究的相关理论基础与文献综述4900字】
- 2024-2029全球及中国商用车便携式轮胎充气机行业市场发展分析及前景趋势与投资发展研究报告
- 充电桩四方协议书范本
- 建筑工程质量管理体系文件
- 2024年国家义务教育质量监测-四年级心理健康测试卷
- 四年级数学上册口算练习卡约2400题
- MOOC 电工技术与实训-深圳职业技术学院 中国大学慕课答案
- 青春期生理变化
- 国家开放大学《Python语言基础》实验4:条件分支结构基本应用参考答案
评论
0/150
提交评论