mfc类之间的指针句柄转换.docx

上传人:b****3 文档编号:10465727 上传时间:2023-05-26 格式:DOCX 页数:13 大小:22.82KB
下载 相关 举报
mfc类之间的指针句柄转换.docx_第1页
第1页 / 共13页
mfc类之间的指针句柄转换.docx_第2页
第2页 / 共13页
mfc类之间的指针句柄转换.docx_第3页
第3页 / 共13页
mfc类之间的指针句柄转换.docx_第4页
第4页 / 共13页
mfc类之间的指针句柄转换.docx_第5页
第5页 / 共13页
mfc类之间的指针句柄转换.docx_第6页
第6页 / 共13页
mfc类之间的指针句柄转换.docx_第7页
第7页 / 共13页
mfc类之间的指针句柄转换.docx_第8页
第8页 / 共13页
mfc类之间的指针句柄转换.docx_第9页
第9页 / 共13页
mfc类之间的指针句柄转换.docx_第10页
第10页 / 共13页
mfc类之间的指针句柄转换.docx_第11页
第11页 / 共13页
mfc类之间的指针句柄转换.docx_第12页
第12页 / 共13页
mfc类之间的指针句柄转换.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

mfc类之间的指针句柄转换.docx

《mfc类之间的指针句柄转换.docx》由会员分享,可在线阅读,更多相关《mfc类之间的指针句柄转换.docx(13页珍藏版)》请在冰点文库上搜索。

mfc类之间的指针句柄转换.docx

mfc类之间的指针句柄转换

一般我们使用的框架是VC提供的Wizard生成的MFCAppWizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。

下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。

使用到的类需要包含响应的头文件。

首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。

这其中的关键在于理解m_pMainWnd,AfxGetApp(),AfxGetMainWnd()的意义!

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(已建立)指针

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)在任何类中获得应用程序类

AfxGetInstanceHandle得到句柄,AfxGetApp得到指针

B1.如何在自己的类和“应用程序类”中获得“文档类”的句柄?

SDIAfxGetMainWnd()->GetActiveView()->GetDocument()得到指针

MDIAfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()得到指针

B3.如何在“框架类”中获得“文档类”句柄?

SDIGetActiveView()->GetDocument()得到指针,MDIMDIGetActive()->GetActiveView()->GetDocument()从CMainFrame得到指针,GetActiveView()->GetDocument()从CChildFrame得到指针

B4.如何在“视图类”中获得“文档类”句柄?

GetDocument()

C1.如何在“文档类”中获得“视图类”句柄?

GetView(),调用GetFirstViewPosition和GetNextView函数得到指针。

C2.如何在自己的类和“应用程序类”中获得“视图类”句柄?

SDIGetActiveView得到指针

MDIMDIGetActive()->GetActiveView()从CMainFrame得到指针,GetActiveView从CChildFrame得到指针

最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。

如:

AfxGetApp();//得到的是WinApp类的句柄,

所以操作前记得转换成自己定义的类的句柄。

如:

((CMyApp*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。

另外,附上MSDN关于应用程序信息和管理的各个函数:

Whenyouwriteanapplication,youcreateasingleCWinApp-derivedobject.Attimes,youmaywanttogetinformationaboutthisobjectfromoutsidetheCWinApp-derivedobject.

TheMicrosoftFoundationClassLibraryprovidesthefollowingglobalfunctionstohelpyouaccomplishthesetasks:

ApplicationInformationandManagementFunctions

AfxFreeLibrary

Decrementsthereferencecountoftheloadeddynamic-linklibrary(DLL)module;whenthereferencecountreacheszero,themoduleisunmapped.

AfxGetApp

Returnsapointertotheapplication'ssingleCWinAppobject.

AfxGetAppName

Returnsastringcontainingtheapplication'sname.

AfxGetInstanceHandle

ReturnsanHINSTANCErepresentingthisinstanceoftheapplication.

AfxGetMainWnd

Returnsapointertothecurrent"main"windowofanon-OLEapplication,orthein-placeframewindowofaserverapplication.

AfxGetResourceHandle

ReturnsanHINSTANCEtothesourceoftheapplication'sdefaultresources.Usethistoaccesstheapplication'sresourcesdirectly.

AfxInitRichEdit

Initializestheversion1.0richeditcontrolfortheapplication.

AfxInitRichEdit2

Initializestheversion2.0andlaterricheditcontrolfortheapplication.

AfxLoadLibrary

MapsaDLLmoduleandreturnsahandlethatcanbeusedtogettheaddressofaDLLfunction.

AfxRegisterWndClass

RegistersaWindowswindowclasstosupplementthoseregisteredautomaticallybyMFC.

AfxSocketInit

CalledinaCWinApp:

:

InitInstanceoverridetoinitializeWindowsSockets.

AfxSetResourceHandle

SetstheHINSTANCEhandlewherethedefaultresourcesoftheapplicationareloaded.

AfxRegisterClass

RegistersawindowclassinaDLLthatusesMFC.

AfxBeginThread

Createsanewthread.

AfxEndThread

Terminatesthecurrentthread.

AfxGetThread

RetrievesapointertothecurrentCWinThreadobject.

AfxWinInit

CalledbytheMFC-suppliedWinMainfunction,aspartoftheCWinAppinitializationofaGUI-basedapplication,toinitializeMFC.MustbecalleddirectlyforconsoleapplicationsusingMFC.

转自:

ID--HANDLE--HWND三者之间的互相转换

id->句柄(由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()ormywnd->m_hWnd;

访问应用程序的其它类

获得CWinApp:

-在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp

-在其它类中只能用AfxGetApp()

获得CMainFrame:

-在CMinApp中用AfxGetMainWnd()或者m_pMainWnd

-在CChildFrame中可用GetParentFrame()

-在其它类中用AfxGetMainWnd()

获得CChildFrame:

-在CView中用GetParentFrame()

-在CMainFrame中用MDIGetActive()或GetActiveFrame()

-在其它类中用AfxGetMainWnd()->MDIGetActive()或AfxGetMainWnd()->GetActiveFrame()

获得CDocument:

-在CView中用GetDocument()

-在CChildFrame中用GetActiveView()->GetDocument()

-在CMainFrame中用

-ifSDI:

GetActiveView()->GetDocument()

-ifMDI:

MDIGetActive()->GetActiveView()->GetDocument()

-在其它类中

-ifSDI:

AfxGetMainWnd()->GetActiveView()->GetDocument()

-ifMDI:

AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()

获得CView:

-在CDocument中POSITIONpos=GetFirstViewPosition();GetNextView(pos)

-在CChildFrame中GetActiveView()

-在CMainFrame中

-ifSDI:

GetActiveView()

-ifMDI:

MDIGetActive()->GetActiveView()

-在其它类中

-ifSDI:

AfxGetMainWnd()->GetActiveView()

-ifMDI:

AfxGetMainWnd()->MDIGetActive()->GetActiveView()

不过要注意在doc中要取得view的指针C*View要注意类C*View声明的问题,

因为默认情况下,mfc在*View.h中已经包含了*Doc.h,如果在*Doc.h中包含

*View.h,就会引起嵌套包含问题,这样要在*Doc.h中加入classC*View;

而在*Doc.cpp中加入#include"*View.h"

//////////////////////////////////////////////////////////////////

其实完全可以在CYourApp中添加各种视或文档的指针,在那些视或文档初

始化的时候将指针传给CYourApp中的对应变量,这样以后不管在哪用上面

指针只需(CYourApp*)AfxGetApp()取其属性变量即可,明了而且清楚更是

方便我一直专门操作的说:

//////////////////////////////////////////////////////////////////

我先抛块砖,有玉的砸过来!

在何时何地,你都可以通过以下方法精确的得到任何一个对象(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生成的MFCAppWizard(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)从文档类取得视图类的指针

我是从到的,

从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会

特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。

CDocument类提供了两个函数用于视图类的定位:

GetFirstViewPosition()和GetNextView()

virtualPOSITIONGetFirstViewPosition()const;

virtualCView*GetNextView(POSITION&rPosition)const;

注意:

GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。

GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一

个POSITION类型值),GetNextView()有两个功能:

返回下一个视图类的指针以及用

引用调用的方式来改变传入的POSITION类型参数的值。

很明显,在Test程序中,只有

一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定

义一个POSITION结构变量来辅助操作):

CTestView*pTestView;

POSITIONpos=GetFirstViewPosition();

pTestView=GetNextView(pos);

这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没

有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不

具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指

定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。

判断一个类指针指

向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:

pView->IsKindOf(RUNTIME_CLASS(CTestView));

即可检查pView所指是否是CTestView类。

有了以上基础,我们已经可以从文档类取得任何类的指针。

为了方便,我们将其作

为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。

实现如下:

CView*CTestDoc:

:

GetView(CRuntimeClass*pClass)

{

CView*pView;

POSITIONpos=GetFirstViewPosition();

 while(pos!

=NULL){

pView=GetNextView(pos);

if(!

pView->IsKindOf(pClass))

break;

}

 if(!

pView->IsKindOf(pClass)){

AfxMessageBox("ConntLocatetheView.\r\nhttp:

//www.VCKBASE.com");

returnNULL;

}

 returnpView;

}

其中用了两次视图类的成员函数I

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2