一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(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(已建立)指针 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) 在任何类中获得应用程序类 AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针 B1.如何在自己的类和 “应用程序类”中获得“文档类”的句柄? SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指针 MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到指针 B3.如何在“框架类”中获得“文档类”句柄? SDI GetActiveView() -> GetDocument() 得到指针,MDI MDIGetActive() -> GetActiveView() -> GetDocument() 从 CMainFrame 得到指针,GetActiveView() -> GetDocument() 从 CChildFrame 得到指针 B4.如何在“视图类”中获得“文档类”句柄? GetDocument() C1. 如何在“文档类”中获得“视图类”句柄? GetView(),调用 GetFirstViewPosition 和 GetNextView 函数得到指针。 C2.如何在自己的类和“应用程序类”中获得“视图类”句柄? SDI GetActiveView 得到指针 MDI MDIGetActive() -> GetActiveView() 从 CMainFrame 得到指针,GetActiveView 从 CChildFrame 得到指针 最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄 转换成自己的类的句柄。 如: AfxGetApp();//得到的是WinApp类的句柄, 所以操作前记得转换成自己定义的类的句 柄。 如: ((CMyApp*)AfxGetApp())->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 global functions to help you accomplish these tasks: Application Information and Management Functions AfxFreeLibrary Decrements the reference count of the loaded dynamic-link library (DLL) module; when the reference count reaches zero, the module is unmapped. AfxGetApp Returns a pointer to the application's single CWinApp object. AfxGetAppName Returns a string containing the application's name. AfxGetInstanceHandle Returns an HINSTANCE representing this instance of the application. AfxGetMainWnd Returns a pointer to the current "main" window of a non-OLE application, or the in-place frame window of a server application. AfxGetResourceHandle Returns an HINSTANCE to the source of the application's default resources. Use this to access the application's resources directly. AfxInitRichEdit Initializes the version 1.0 rich edit control for the application. AfxInitRichEdit2 Initializes the version 2.0 and later rich edit control for the application. AfxLoadLibrary Maps a DLL module and returns a handle that can be used to get the address of a DLL function. AfxRegisterWndClass Registers a Windows window class to supplement those registered automatically by MFC. AfxSocketInit Called in a CWinApp::InitInstance override to initialize Windows Sockets. AfxSetResourceHandle Sets the HINSTANCE handle where the default resources of the application are loaded. AfxRegisterClass Registers a window class in a DLL that uses MFC. AfxBeginThread Creates a new thread. AfxEndThread Terminates the current thread. AfxGetThread Retrieves a pointer to the current CWinThread object. AfxWinInit Called 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->句柄(由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 mywnd->m_hWnd; 访问应用程序的其它类 获得CWinApp: 获得CMainFrame: 获得CChildFrame: 获得CDocument: 获得CView:
////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// 1) 在View中获得Doc指针 VC中编程对于刚刚开始学习的同学,最大的障碍和问题就是消息机制和指针获取与 1) 在View中获得Doc指针 CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文 7) 如果框架中加入工具栏和状态栏变量还可以这样 8) 在Mainframe获得菜单指针 CMenu *pMenu=m_pMainWnd->GetMenu(); 10) 从文档类取得视图类的指针 注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。 这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没 有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作 while(pos!=NULL){ if(!pView->IsKindOf(pClass)){ return pView; 其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种 1.pos为NULL,即已经不存在下一个视图类供操作; 1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图 3.从一个视图类取得另一视图类的指针 综合1和2,很容易得出视图类之间互相获得 return pView; 可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板 第二个函数返回由pos 标识的文档模板。POSITION是MFC定义的一个用于迭代或对象 12)一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文 如果列表为空,则rPos被置为NULL. 13)在文档中可以调用CDocument::GetDocTemplate获得指向该文档模板的指针。 14)一个文档可以有多个视。每一个文档都保留并维护一个所有相关视的列表。 应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的 15)从一个视图类取得另一视图类的指针 |
|