mfc类之间的指针句柄转换_第1页
mfc类之间的指针句柄转换_第2页
mfc类之间的指针句柄转换_第3页
mfc类之间的指针句柄转换_第4页
mfc类之间的指针句柄转换_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe框架,无论是多文档还是单文档,都存在指针获取和操作问题。下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。这其中的关键在于理解m_pMainWnd, AfxGetApp(,AfxGetMainWnd( 的意义!1在View中获得Doc指针CYouSDIDoc *pDoc=GetDocument(;一个视只能有一

2、个文档。2 在App中获得MainFrame指针CWinApp 中的 m_pMainWnd变量就是MainFrame的指针,也可以: CMainFrame *pMain =(CMainFrame *AfxGetMainWnd(;3 在View中获得MainFrame指针CMainFrame *pMain=(CmaimFrame *AfxGetApp(->m_pMainWnd;4 获得View(已建立指针CyouView *pView=(CyouView *pMain->GetActiveView(;5 获得当前文档指针CDocument * pCurrentDoc =(CFrame

3、Wnd *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;(CM

4、ainFrame *GetParent(->m_wndStatusBar;8 在Mainframe获得菜单指针CMenu *pMenu=m_pMainWnd->GetMenu(;9 在任何类中获得应用程序类AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针B1.如何在自己的类和“应用程序类”中获得“文档类”的句柄?SDI AfxGetMainWnd( -> GetActiveView( -> GetDocument( 得到指针MDI AfxGetMainWnd( -> MDIGetActive( -> GetActiveView

5、( -> GetDocument( 得到指针B3.如何在“框架类”中获得“文档类”句柄?SDI GetActiveView( -> GetDocument( 得到指针,MDI MDIGetActive( -> GetActiveView( -> GetDocument( 从 CMainFrame 得到指针,GetActiveView( -> GetDocument( 从 CChildFrame 得到指针B4.如何在“视图类”中获得“文档类”句柄?GetDocument(C1. 如何在“文档类”中获得“视图类”句柄?GetView(,调用 GetFirstViewP

6、osition 和 GetNextView 函数得到指针。C2.如何在自己的类和“应用程序类”中获得“视图类”句柄?SDI GetActiveView 得到指针MDI MDIGetActive( -> GetActiveView( 从 CMainFrame 得到指针, GetActiveView 从 CChildFrame 得到指针最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。如:AfxGetApp(;/得到的是WinApp类的句柄,所以操作前记得转换成自己定义的类的句柄。如:(CMyApp*AfxGetApp(-&

7、gt;XXXX(;/这的xxxx(就是你定义的类中间的成员。另外,附上 MSDN 关于应用程序信息和管理的各个函数:When you write an application, you create a single CWinApp-derived object. At times, you may want to get information about this object from outside the CWinApp-derived object.The Microsoft Foundation Class Library provides the following globa

8、l functions to help you accomplish these tasks:Application Information and Management FunctionsAfxFreeLibraryDecrements the reference count of the loaded dynamic-link library (DLL module; when the reference count reaches zero, the module is unmapped.AfxGetAppReturns a pointer to the application'

9、s single CWinApp object.AfxGetAppNameReturns a string containing the application's name.AfxGetInstanceHandleReturns an HINSTANCE representing this instance of the application.AfxGetMainWndReturns a pointer to the current "main" window of a non-OLE application, or the in-place frame win

10、dow of a server application.AfxGetResourceHandleReturns an HINSTANCE to the source of the application's default resources. Use this to access the application's resources directly.AfxInitRichEditInitializes the version 1.0 rich edit control for the application.AfxInitRichEdit2Initializes the

11、version 2.0 and later rich edit control for the application.AfxLoadLibraryMaps a DLL module and returns a handle that can be used to get the address of a DLL function.AfxRegisterWndClassRegisters a Windows window class to supplement those registered automatically by MFC.AfxSocketInitCalled in a CWin

12、App:InitInstance override to initialize Windows Sockets.AfxSetResourceHandleSets the HINSTANCE handle where the default resources of the application are loaded.AfxRegisterClassRegisters a window class in a DLL that uses MFC.AfxBeginThreadCreates a new thread.AfxEndThreadTerminates the current thread

13、.AfxGetThreadRetrieves a pointer to the current CWinThread object.AfxWinInitCalled by the MFC-supplied WinMain function, as part of the CWinApp initialization of a GUI-based application, to initialize MFC. Must be called directly for console applications using MFC.转自:ID-HANDLE-HWND三者之间的互相转换id->句柄

14、(由ID得到句柄-hWnd = :GetDlgItem(hParentWnd,id;id->指针(由ID得到指针-CWnd:GetDlgItem(;句柄->id(由句柄得到ID-id = GetWindowLong(hWnd,GWL_ID;句柄->指针(由句柄得到指针-CWnd *pWnd=CWnd:FromHandle(hWnd;指针->ID(由指针得到ID-id =GetWindowLong(pWnd->GetSafeHwnd,GWL_ID;GetDlgCtrlID(;指针->句柄(由指针得到句柄-hWnd=cWnd.GetSafeHandle( or

15、mywnd->m_hWnd;访问应用程序的其它类获得CWinApp:-在CMainFrame,CChildFrame,CDocument,CView中直接调用 AfxGetApp(或用theApp-在其它类中只能用AfxGetApp(获得CMainFrame:-在CMinApp中用AfxGetMainWnd(或者m_pMainWnd-在 CChildFrame中可用GetParentFrame(-在其它类中用AfxGetMainWnd(获得CChildFrame:-在CView中用GetParentFrame(-在CMainFrame中用 MDIGetActive(或GetActiveF

16、rame(-在其它类中用 AfxGetMainWnd(->MDIGetActive(或AfxGetMainWnd(->GetActiveFrame(获得CDocument:-在CView中用GetDocument(-在CChildFrame中用 GetActiveView(->GetDocument(-在CMainFrame中用-if SDI:GetActiveView(->GetDocument(-if MDI:MDIGetActive(->GetActiveView(->GetDocument(-在其它类中-if SDI:AfxGetMainWnd(-&

17、gt;GetActiveView(->GetDocument(-ifMDI:AfxGetMainWnd(->MDIGetActive(->GetActiveView(->GetDocument(获得CView:-在CDocument中 POSITION pos = GetFirstViewPosition(;GetNextView(pos -在CChildFrame中 GetActiveView(-在CMainFrame中-if SDI:GetActiveView(-if MDI:MDIGetActive(->GetActiveView(-在其它类中-if SDI

18、:AfxGetMainWnd(->GetActiveView(-if MDI:AfxGetMainWnd(->MDIGetActive(->GetActiveView(*View.h,就会引起嵌套包含问题,这样要在*Doc.h中加入 class C*View;而在*Doc.cpp中加入 #include "*View.h"/ /其实完全可以在CYourApp中添加各种视或文档的指针,在那些视或文档初始化的时候将指针传给CYourApp中的对应变量,这样以后不管在哪用上面指针只需(CYourApp*AfxGetApp(取其属性变量即可,明了而且清楚更是方便我

19、一直专门操作的说:/ /我先抛块砖,有玉的砸过来!在何时何地,你都可以通过以下方法精确的得到任何一个对象(Application, DocTemplate,Document,View,Frame1。通过AfxGetApp(得到当前的 App对象;2。通过AfxGetMainWnd(得到主窗口;3。通过 CMDIFrameWnd:GetActiveFrame得到当前活动窗口;4。通过GetNextWindow(遍例所有的子窗口;(如果要得到你想要的子窗口,可以通过特定的成员变量来标志;5。通过 CWinApp:GetFirstDocTemplatePostion(以及CWinApp:GetNex

20、tDocTemplate(的组合应用来遍历所有的DocTemplate对象,并且用CDocTemplate:GetDocString(来判断当前得到的文档莫板对象是哪个。6。通过CDocTemplate:GetFirstDocPosition(以及CDocTemplate的GetNextDoc(组合来遍历所有的该模板的文档对象,并用CDocument:GetDocTemplate(来得到文档模板,用CDocment:GetTitle( 或者GetPathName(来判断当前的文档是哪个。7。通过CDocuemt的GetFirstViewPositon(以及 GetNextView(来遍历视图对

21、象,一般通过访问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 在V

22、iew中获得MainFrame指针4 获得View(已建立指针5 获得当前文档指针6 获得状态栏与工具栏指针7 获得状态栏与工具栏变量8 在Mainframe获得菜单指针9 在任何类中获得应用程序类10 从文档类取得视图类的指针(111 在App中获得文档模板指针12 从文档模板获得文档类指针13 在文档类中获得文档模板指针14 从文档类取得视图类的指针(215 从一个视图类取得另一视图类的指针VC中编程对于刚刚开始学习的同学,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本上是每本VC学习工具书上必讲的内容,而且通过MSDN 很多问题都能解决。下面文字主要是个人在编程中指针使用

23、的一些体会,说的不当的地方请指正。一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe框架,无论是多文档还是单文档,都存在指针获取和操作问题。下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。1在View中获得Doc指针 CYouSDIDoc *pDoc=GetDocument(;一个视只能有一个文档。2 在App中获得MainFrame指针CWinApp 中的

24、 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

25、 * 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

26、(->m_wndToolBar;(CMainFrame *GetParent(->m_wndStatusBar;8 在Mainframe获得菜单指针 CMenu *pMenu=m_pMainWnd->GetMenu(;9 在任何类中获得应用程序类用MFC全局函数AfxGetApp(获得。10 从文档类取得视图类的指针我是从从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。CDocument类提供了两个函数用于视图类的定位:GetFirstViewPosition( 和GetNex

27、tView(virtual POSITION GetFirstViewPosition( const;virtual CView* GetNextView(POSITION& rPosition const;注意:GetNextView(括号中的参数用的是引用方式,因此执行后值可能改变。GetFirstViewPosition(用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值,GetNextView(有两个功能:返回下一个视图类的指针以及用引用调用的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调

28、用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作:CTestView* pTestView;POSITION pos=GetFirstViewPosition(;pTestView=GetNextView(pos;这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类

29、的实例时,可用IsKindOf(成员函数时行检查,如:pView->IsKindOf(RUNTIME_CLASS(CTestView;即可检查pView所指是否是CTestView类。有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:CView* CTestDoc:GetView(CRuntimeClass* pClassCView* pView;POSITION pos=GetFirstViewPosition(;while(pos!=NULLpView=GetNextView(pos;if(

30、!pView->IsKindOf(pClassbreak;if(!pView->IsKindOf(pClassAfxMessageBox("Connt Locate the View.rn http:/www.VCKBASE.com" return NULL;return pView;其中用了两次视图类的成员函数IsKindOf(来判断,是因为退出while循环有三种可能:1.pos为NULL,即已经不存在下一个视图类供操作;2.pView已符合要求。1和2同是满足。这是因为GetNextView(的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,

31、因此pos是 pView的下一个视图类的POSITION,有可能既是pos=NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。使用该函数应遵循如下格式(以取得CTestView指针为例:CTestView* pTestView=(CTestView*GetView(RUNTIME_CLASS(CTestView; RUNTIME_CLASS 是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能

32、避免一些可能出现的麻烦。3.从一个视图类取得另一视图类的指针综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数: (假设要从CTestAView中取得指向其它视图类的指针CView* CTestAView:GetView(CRuntimeClass* pClassCTestDoc* pDoc=(CTestDoc*GetDocument(;CView* pView;POSITION pos=pDoc->GetFirstViewPosition(;while(po

33、s!=NULLpView=pDoc->GetNextView(pos;if(!pView->IsKindOf(pClassbreak;if(!pView->IsKindOf(pClassAfxMessageBox("Connt Locate the View."return NULL;return pView;这个函数和2中的GetView(相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition( 和GetNextView(前加上了文档类指针,以表示它们是文档类成员函数。有了此函数;当要从CTestAView中取得 CTest

34、BView的指针时,只需如下:CTestBView*pTestbView=(CTestView*GetView(RUNTIME_CLASS(CTestBView;11对于单文档中也可以加入多个文档模板,但是一般的开发就使用MDI方式多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,请查阅MSDN,(以下四个内容(11、12、13、14来源:可以用CWinApp:GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的位置;利用该值来调用CWinApp:GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。 POSITION GetFirstDocTemplate( const; CDocTemplate *GetNextDocTemplate( POSITION & pos const;第二个函数返回由pos 标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论