AfxGetApp

基本概述

函式原型:
CWinApp* AFXAPI AfxGetApp( );
返回值:
A pointer to the single CWinAppobject for the application.
返回指向應用程式的單一的CWinApp對象的指針。
注意:
The pointerreturned by this function can be used to access application information such as the main message-dispatch code or the topmost window.
這個函式返回的指針可以被用來訪問應用程式的信息,比如主訊息調度代碼以及頂層視窗等。
例子:
// Print the application's executable filename.
TRACE("Executable filename = %s\n", AfxGetApp()->m_pszExeName);

AfxGetApp 解剖

AfxGetApp( )是全局的。
AfxGetApp( )這個函式可以得到當前套用進程的指針,是CWinApp*類型的,通過這個指針可以訪問到這個進程中的對象。
比如在全局函式中要向對話框中的列表寫數據。
void writeString(char* pString)
{
CWnd* pWnd = AfxGetApp()->GetMainWnd();
CMyDlg * pDlg;
pDlg=(CMyDlg *) pWnd;
pDlg->ShowMsg(pString);

}
AfxGetApp()得到進程指針CWinApp*,通過這個指針可以得到pWnd。要不在全局函數裡你怎么對已存在的對話框操作呢。
AfxGetApp( )這個函式可以得到當前引用的指針CWinApp*,通過這個指針可以訪問到這個進程中的對象。
==============================================================================
我們在任何一個VC工程中都會看到一個類似於:
//Test.cpp檔案中
CTestApp theApp;(工程名為Test)
的語句。它是指向工程對象的一個指針,你可以用它訪問Test工程的成員函式和變數。
如果工程中添加了一個CConfig類,在CConfig中想調用Test工程中的成員函式和變數,則可以這樣調用之:
CTestApp *pApp=(CTestApp *)AfxGetApp( );
如果在CTest類中我們聲明如下一些變數:
//Test.cpp檔案
class CTestApp : public CWinApp
{
public:
CTestApp( );
CString str;//添加的對話框變數
...
}
//Test.cpp檔案
CTestApp::CTestApp()
{
str="abc";
}
好了,現在我們就在CConfig類中調用str吧!
//Config.cpp檔案
CTestApp *pApp=(CTestApp *)AfxGetApp( );
AfxMessageBox(pApp->str);
這樣,就實現了對CTestApp類中變數的調用。
================================================================
afxgetapp -- 取應用程式實例指針
getmainwnd -- 取主視窗對象指針
這兩個函式可以合成一個: AfxGetMainWnd();
================================================================
我通常把一些重要的工程一開始就需要初始化的並且在其它地方類中都要用到的變數或
函式定義在C***App類中,然後通過此函式獲得這些變數或函式。
如果你定義為取全局變數,只需在需要的地方用extern聲名即可
如果把變數在你的C*App類中定義,就可以通過通過AfxGetApp()獲取C*App的指針,這樣就可以調用它的變數了.如果是全局變數,這不需要用這個函式調用它AfxGetApp()的返回值是指向theApp的指針,與全局變數無關。
AfxGetApp()這個函式在VC當中很常見,主要是用來獲得CWinAPP生成的全局對象的。一般情況下將其強制類型轉換成你自己寫的App類就可以調用裡面的方法了。但是如果編寫的是DLL程式的話,情況會稍有不同。你會發現在DLL中調用AfxGetApp這個函式會得到DLL的套用對象。原因出現在DLL的模組狀態上。應用程式在調用DLL時為了保證資源不出問題,往往會調用一句:

AFX_MANAGE_STATE(AfxGetStaticModuleState())

注意這是一個宏。他的作用是切換模組的全局變數範圍,即把應用程式的那些全局變數拷貝切換到這個DLL的全局變數拷貝,自然用AfxGetApp得到就是DLL裡面的這個APP了。如果向訪問應用程式的APP對象,那么只要把模組狀態切換回去就可以了,記著執行完後一定要把狀態再切換回來啊,否則就要出問題了。
例如:
// switch thread state back to application
_AFX_THREAD_STATE* pState = AfxGetThreadState();
AfxSetModuleState(pState->m_pPrevModuleState);
// do something with the application
AfxGetApp()->...
// switch thread state back to dll
AFX_MANAGE_STATE(AfxGetStaticModuleState())

相關詞條

相關搜尋

熱門詞條

聯絡我們