一般我們使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,無論是多文檔還是單文檔,都存在指針獲取和操作 問題。
下面這節(jié)內(nèi)容主要是一般的框架,然后再講多線程中的指針使用。使用到的類需要包含響應(yīng)的頭文件。 首先一般獲得本類(視,文檔,對話框都支持)實(shí)例指針 this,用this的目的,主要可以通過類中的函數(shù)向其他類或者函數(shù)中發(fā)指針,以便于在非本類中操作和使用本類中的功能。 這其中的關(guān)鍵在于理解 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) 獲得當(dāng)前文檔指針 CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument(); 6) 獲得狀態(tài)欄與工具欄指針 CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR); 7) 如果框架中加入工具欄和狀態(tài)欄變量還可以這樣 (CMainFrame *)GetParent()->m_wndToolBar; (CMainFrame *)GetParent()->m_wndStatusBar; 8) 在Mainframe獲得菜單指針 CMenu *pMenu=m_pMainWnd->GetMenu(); 9) 在任何類中獲得應(yīng)用程序類 AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指針 B1.如何在自己的類和 “應(yīng)用程序類”中獲得“文檔類”的句柄? 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(),調(diào)用 GetFirstViewPosition 和 GetNextView 函數(shù)得到指針。 C2.如何在自己的類和“應(yīng)用程序類”中獲得“視圖類”句柄? SDI GetActiveView 得到指針 MDI MDIGetActive() -> GetActiveView() 從 CMainFrame 得到指針,GetActiveView 從 CChildFrame 得到指針 最后提醒大家,在提取到各個句柄之后,因?yàn)槌醮翁崛〉亩际菢?biāo)準(zhǔn)類句柄,所以,在使用時要注意將標(biāo)準(zhǔn)句柄 轉(zhuǎn)換成自己的類的句柄。 如: AfxGetApp();//得到的是WinApp類的句柄, 所以操作前記得轉(zhuǎn)換成自己定義的類的句 柄。 如: ((CMyApp*)AfxGetApp())->XXXX();//這的xxxx()就是你定義的類中間的成員。 另 外,附上 MSDN 關(guān)于應(yīng)用程序信息和管理的各個函數(shù): 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. 轉(zhuǎn)自:http://blog./lihailin560/252689/message.aspx#
ID--HANDLE--HWND三者之間的互相轉(zhuǎn)換
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; 訪問應(yīng)用程序的其它類 獲得CWinApp: 獲得CMainFrame: 獲得CChildFrame: 獲得CDocument: 獲得CView:
////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// 1) 在View中獲得Doc指針 VC中編程對于剛剛開始學(xué)習(xí)的同學(xué),最大的障礙和問題就是消息機(jī)制和指針獲取與 1) 在View中獲得Doc指針 CYouSDIDoc *pDoc=GetDocument();一個視只能有一個文 7) 如果框架中加入工具欄和狀態(tài)欄變量還可以這樣 8) 在Mainframe獲得菜單指針 CMenu *pMenu=m_pMainWnd->GetMenu(); 10) 從文檔類取得視圖類的指針 注意:GetNextView()括號中的參數(shù)用的是引用方式,因此執(zhí)行后值可能改變。 這樣,便可到了CTestView類的指針pTestView.執(zhí)行完幾句后,變量pos=NULL,因?yàn)闆] 有了以上基礎(chǔ),我們已經(jīng)可以從文檔類取得任何類的指針。為了方便,我們將其作 while(pos!=NULL){ if(!pView->IsKindOf(pClass)){ return pView; 其中用了兩次視圖類的成員函數(shù)IsKindOf()來判斷,是因?yàn)橥顺鰓hile循環(huán)有三種 1.pos為NULL,即已經(jīng)不存在下一個視圖類供操作; 1和2同是滿足。這是因?yàn)镚etNextView()的功能是將當(dāng)前視圖指針改變成一個視圖 3.從一個視圖類取得另一視圖類的指針 綜合1和2,很容易得出視圖類之間互相獲得 return pView; 可以用CWinApp::GetFirstDocTemplatePostion獲得應(yīng)用程序注冊的第一個文檔模板 第二個函數(shù)返回由pos 標(biāo)識的文檔模板。POSITION是MFC定義的一個用于迭代或?qū)ο? 12)一個文檔模板可以有多個文檔,每個文檔模板都保留并維護(hù)了一個所有對應(yīng)文 如果列表為空,則rPos被置為NULL. 13)在文檔中可以調(diào)用CDocument::GetDocTemplate獲得指向該文檔模板的指針。 14)一個文檔可以有多個視。每一個文檔都保留并維護(hù)一個所有相關(guān)視的列表。 應(yīng)用程序可以調(diào)用CDocument::GetFirstViewPosition返回與調(diào)用文檔相聯(lián)系的視的 15)從一個視圖類取得另一視圖類的指針 |
|