




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、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 中编程对于刚刚开始学习的同学, 最大的障碍
2、和问题就是消息机制和指针获取与操作。 其实这些内容基本上是每本VC学习工具书上必讲的内容,而且通过MSDN很多问题都能解决。下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正。 一般我们使用的框架是 VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档, 都存在指针获取和操作问题。 下面这节内容主要是一般的框架, 然后再讲多线程中的指针使 用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持 )实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在 非本类中操作和使用本类中的
3、功能。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=(C
4、maimFrame *)AfxGetApp()-m_pMainWnd; CyouView *pView=(CyouView *)pMain-GetActiveView();pCurrentDoc=(CFrameWnd5) 获得当前文档指针 CDocument * *)m_pMainWnd-GetActiveDocument();6) 获得状态栏与工具栏指针(CStatusBarpToolBar=(CtoolBarCStatusBar * pStatusBar *)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_STATUS_BAR);CToolBar *
5、)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) 从文档类取得视图类的指针我是从
6、/soft/program/article/vc/vc405.html 学到的, 从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会 特别是文字处理 CEditView 当产生多个视图类时,这个功能是非常需要的。 CDocument 类提供了两个函数用于视图类的定位:GetFirstViewPosition() 和 GetNextView()virtualPOSITION GetFirstViewPosition()const;virtualCView* GetNextView(POSITION&rPosition)const;注意: GetNextView() 括号中
7、的参数用的是引用方式,因此执行后值可能改变。 GetFirstViewPosition() 用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调用的方式来改变传入的POSITION类型参数的值。很明显,在 Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):CTestView* pTestView;POSITION pos=GetFirstViewPosition();pTestView=GetNext
8、View(pos);这样,便可到了 CTestView类的指针pTestView执行完几句后,变量 pos=NULL因为没 有下一个视图类,自然也没有下一个视图类的POSITION旦是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指 定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指 向的是否某个类的实例时,可用IsKi ndOf()成员函数时行检查,如:pView-lsKi ndOf(RUNTIME_CLASS(CTestView);即可检查pView所指是否是CTestView类。有了以上基础,我们已经可以从文档类取得任
9、何类的指针。为了方便,我们将其作 为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:view pla in copy to clipboardpri nt?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(Co
10、nnt Locate the View.rn http:/www.VCKBASE.com); return NULL;return pView;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 Vie
11、w.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符合需要。当所需的视图是最后一个视图是最后一 个视图类时就如引。因此需采用两次判断。使用该函数应遵循
12、如下格式(以取得CTestView指针为例):CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView);RUNTIME_CLASS是个宏,可以简单地理解它的作用:将类的名字转化为CRu ntimeClass为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个 基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一 些可能出现的麻烦。3. 从一个视图类取得另一视图类的指针综合 1 和 2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1 的方法得到文档类的指针,再用 2的方法,以
13、文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:(假设要从CTestAView中取得指向其它视图类的指针)view plaincopy to clipboardprint?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(p
14、Class)break;if(!pView-IsKindOf(pClass)AfxMessageBox(Connt Locate the View.);return NULL;return pView;CView* CTestAView:GetView(CRuntimeClass* pClass)CTestDoc* pDoc=(CTestDoc*)GetDocument();CView* pView;POSITION pos=pDoc-GetFirstViewPosition();while(pos!=NULL) pView=pDoc-GetNextView(pos);if(!pView-Is
15、KindOf(pClass)break;if(!pView-IsKindOf(pClass)AfxMessageBox(Connt Locate the View.);return NULL;return pView;这个函数和 2 中的 GetView() 相比,一是多了第一句以取得文档类指针,二是在 GetFirstViewPosition() 和 GetNextView() 前加上了文档类指针,以表示它们是文档类成员函数。有了此函数;当要从 CTestAView中取得CTestBView的指针时,只需如 下: CTestBView* pTestbView=(CTestView*)GetV
16、iew(RUNTIME_CLASS(CTestBView);11) 对于单文档中也可以加入多个文档模板 但是一般的开发就使用 MDI 方式开发多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,请查阅MSDN,(以下四个内容(11、12、13、14)来源: /vc/vc45.htm )可以用 CWinApp:GetFirstDocTemplatePostion 获得应用程序注册的第一个文档模板 的位置;利用该值来调用 CWinApp:GetNextDocTemplate 函数,获得第一个 CDocTemplate 对象指
17、针。 POSITION GetFirstDocTemplate( ) const; CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;第二个函数返回由 pos标识的文档模板。POSITION是MFC定义的一个用于迭代或对象指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索 的文档模板是模板列表中的最后一个,则 pos 参数被置为 NULL。12)一个文档模板可以有多个文档, 每个文档模板都保留并维护了一个所有对应文档的 指针列表。用 CDocTemplate:GetFirstDocPosition 函数获得
18、与文档模板相关的文档集合中第一个文档的位置,并用POSITION值作为CDocTemplate:GetNextDoc的参数来重复遍历与模板相关的文档列表。函数原形为:viaual visualPOSITION GetFirstDocPosition( ) const =0;CDocument *GetNextDoc(POSITION & rPos) const =0;如果列表为空,则 rPos 被置为 NULL.13) 在文档中可以调用CDocument:GetDocTemplate 获得指向该文档模板的指针。函数原形如下: CDocTemplate * GetDocTemplate () const;如果该文档不属于文档模板管理,则返回值为NULL。14) 一个文档可以有多个视。每一个文档都保留并维护一个所有相关视的列表。CDocument:AddView 将一个视连接到文档上,将该视加入到文档相联系的视的列表 中,并将视的文档指针指向该文档。当有 File/New 、File/Open 、Windows/New 或 Window/Split的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安顺市中石油2025秋招笔试提升练习题含答案
- 南宁市中储粮2025秋招面试专业追问题库仓储保管岗
- 中国联通宝鸡市2025秋招心理测评常考题型与答题技巧
- 中国联通清远市2025秋招市场与服务类专业追问清单及参考回答
- 2025年中药分析考试试题及答案
- 深圳市中储粮2025秋招面试专业追问题库机电维修岗
- 2025年弟子出师考试题及答案
- 2025年四川机械联考试题及答案
- 石家庄市中石化2025秋招笔试模拟题含答案油田勘探开发岗
- 国家能源抚顺市2025秋招能源与动力工程类面试追问及参考回答
- 医院信息安全保密培训课件
- 物流紧急事件应急预案方案
- 幼儿创意玉米课件
- 2025年智能焊接机器人产业发展蓝皮书-GGII高工咨询
- 冷却塔填料更换施工方案
- 运输公司环保措施方案(3篇)
- 2025安全月八大特殊作业竞赛题库及答案
- 医疗机构基孔肯雅热防控卫生监督检查表
- 刀具更换管理办法
- 快消品包装行业可持续性发展报告2025:包装印刷行业绿色转型
- 痛风性关节炎鉴别
评论
0/150
提交评论