應用程式資訊和管理
當您撰寫應用程式時,您會建立單 CWinApp
一衍生物件。 有時候,您可能會想要從衍生物件外部 CWinApp
取得此對象的相關信息。 或者,您可能需要存取其他全域「管理員」物件。
Microsoft Foundation Class Library 提供下列全域函式,可協助您完成這些工作:
應用程式資訊與管理功能
名稱 | 描述 |
---|---|
AfxBeginThread |
建立新的線程。 |
AfxContextMenuManager |
全域 操作功能表管理員的指標。 |
AfxEndThread |
終止目前的線程。 |
AfxFindResourceHandle |
逐步解說資源鏈結,並依資源標識符和資源類型找出特定資源。 |
AfxFreeLibrary |
遞減已載入之動態連結庫 (DLL) 模組的參考計數。 當參考計數達到零時,模組會取消對應。 |
AfxGetApp |
傳回應用程式單 CWinApp 一物件的指標。 |
AfxGetAppName |
傳回包含應用程式名稱的字串。 |
AfxGetInstanceHandle |
傳 HINSTANCE 回 ,表示應用程式的這個實例。 |
AfxGetMainWnd |
傳回非 OLE 應用程式目前「主要」視窗的指標,或伺服器應用程式的就地框架視窗。 |
AfxGetPerUserRegistration |
使用此函式來判斷應用程式是否將登錄存取重新導向至 HKEY_CURRENT_USER (HKCU ) 節點。 |
AfxGetResourceHandle |
將 HINSTANCE 傳回至應用程式預設資源的來源。 使用直接存取應用程式的資源。 |
AfxGetThread |
擷取目前 CWinThread 物件的指標。 |
AfxInitRichEdit |
初始化應用程式的 1.0 版豐富編輯控制項。 |
AfxInitRichEdit2 |
初始化應用程式的 2.0 版和更新版本豐富編輯控制件。 |
AfxIsExtendedFrameClass |
判斷指定的視窗是否為擴充框架物件。 |
AfxIsMFCToolBar |
判斷指定的視窗是否為工具列物件。 |
AfxKeyboardManager |
全域 鍵盤管理員的指標。 |
AfxLoadLibrary |
對應 DLL 模組,並傳回可用來取得 DLL 函式位址的句柄。 |
AfxLoadLibraryEx |
使用指定的選項對應 DLL 模組,並傳回可用來取得 DLL 函式位址的句柄。 |
AfxMenuTearOffManager |
全域 卸除功能表管理員的指標。 |
AfxMouseManager |
全域 滑鼠管理員的指標。 |
AfxRegisterClass |
在使用 MFC 的 DLL 中註冊視窗類別。 |
AfxRegisterWndClass |
註冊 Windows 視窗類別,以補充 MFC 自動註冊的窗口類別。 |
AfxSetPerUserRegistration |
設定應用程式是否將登錄存取重新導向至 HKEY_CURRENT_USER (HKCU ) 節點。 |
AfxSetResourceHandle |
設定載入應用程式預設資源的 HINSTANCE 句柄。 |
AfxShellManager |
全域 殼層管理員的指標。 |
AfxSocketInit |
在覆寫中 CWinApp::InitInstance 呼叫 以初始化 Windows Sockets。 |
AfxUserToolsManager |
全域 使用者工具管理員的指標。 |
AfxWinInit |
由 MFC 提供的 WinMain 函式呼叫,做為 GUI 型應用程式初始化的一部分 CWinApp ,以初始化 MFC。 針對使用 MFC 的主控台應用程式,必須直接通叫 。 |
AfxBeginThread
呼叫此函式以建立新的線程。
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
參數
pfnThreadProc
指向背景工作線程的控制函式。 指標不能是 NULL
。 此函式必須宣告如下:
UINT __cdecl MyControllingFunction( LPVOID pParam );
pThreadClass
RUNTIME_CLASS
衍生自 CWinThread
之物件的 。
pParam
要傳遞至控制函式的參數。
nPriority
要為線程設定的優先順序。 如需可用優先順序的完整清單和描述,請參閱 SetThreadPriority
Windows SDK。
nStackSize
指定新線程堆疊的位元組大小。 如果為0,堆疊大小會預設為與建立線程相同的大小堆疊。
dwCreateFlags
指定控制線程建立的其他旗標。 此旗標可以包含兩個值的其中一個:
CREATE_SUSPENDED
使用暫停計數啟動線程。CREATE_SUSPENDED
如果您要線上程開始執行之前初始化物件的任何成員資料CWinThread
,例如m_bAutoDelete
或衍生類別的任何成員,請使用 。 初始化完成之後,請使用CWinThread::ResumeThread
來啟動執行中的線程。 在呼叫 之前CWinThread::ResumeThread
,線程不會執行。0 建立之後立即啟動線程。
lpSecurityAttrs
指向 SECURITY_ATTRIBUTES
結構,指定線程的安全性屬性。 如果 NULL
為 ,則會使用與建立線程相同的安全性屬性。 如需此結構的詳細資訊,請參閱 Windows SDK。
傳回值
新建立線程物件的指標,如果 NULL
發生失敗,則為 。
備註
的第一種形式 AfxBeginThread
會建立背景工作線程。 第二個窗體會建立線程,以做為使用者介面線程或背景工作線程。
AfxBeginThread
會建立新的 CWinThread
物件、呼叫其 CreateThread
函式以開始執行線程,並傳回線程的指標。 整個程式都會進行檢查,以確保如果建立的任何部分失敗,所有對象都會正確解除分配。 若要結束線程,請從線程內呼叫 AfxEndThread
,或從背景工作線程的控制函式傳回。
應用程式必須啟用多線程;否則,此函式將會失敗。 如需啟用多線程的詳細資訊,請參閱 /MD
、 /MT
/LD
(使用運行時間連結庫)。
如需 的詳細資訊AfxBeginThread
,請參閱多線程:建立背景工作線程和多線程:建立使用者介面線程一文。
範例
請參閱 CSocket::Attach
的範例。
需求
頁眉 afxwin.h
AfxContextMenuManager
全域 操作功能表管理員的指標。
語法
CContextMenuManager* afxContextMenuManager;
需求
標頭: afxcontextmenumanager.h
AfxEndThread
呼叫此函式以終止目前正在執行的線程。
void AFXAPI AfxEndThread(
UINT nExitCode,
BOOL bDelete = TRUE);
參數
nExitCode
指定線程的結束代碼。
bDelete
從記憶體中刪除線程物件。
備註
必須從線程內呼叫 ,才能終止。
如需 的詳細資訊AfxEndThread
,請參閱多線程:終止線程一文。
需求
頁眉 afxwin.h
AfxFindResourceHandle
使用 AfxFindResourceHandle
查核資源鏈結並依資源 ID 和資源類型尋找特定的資源。
語法
HINSTANCE AFXAPI AfxFindResourceHandle( LPCTSTR lpszName, LPCTSTR lpszType );
參數
lpszName
包含資源 ID 之字串的指標。
lpszType
資源類型的指標。 如需資源類型清單,請參閱 FindResource
Windows SDK 中的 。
傳回值
包含資源之模組的控制代碼。
備註
AfxFindResourceHandle
會尋找特定資源,並將句柄傳回包含資源的模組。 資源可能位於載入的任何MFC擴充 DLL 中。 AfxFindResourceHandle
會告知您哪一個 DLL 中內含資源。
模組會依此順序搜尋:
如果它是 MFC 延伸模組 DLL,則為主要模組。
非系統模組。
特定語言的模組。
如果是系統 DLL,則為主要模組。
系統模組。
需求
標頭: afxwin.h
AfxFreeLibrary
AfxFreeLibrary
和 AfxLoadLibrary
會保留每個載入的程式庫模組的參考計數。
BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);
參數
hInstLib
所載入程式庫模組的控制代碼。 AfxLoadLibrary
會傳回這個句柄。
傳回值
TRUE
如果函式成功,則為 ;否則為 FALSE
。
備註
AfxFreeLibrary
會將載入的動態連結程式庫 (DLL) 模組的參考計數遞減。 在參考計數達到零時,模組就從呼叫處理序的位址空間取消對應,且控制代碼不再有效。 每次呼叫 AfxLoadLibrary
時,此參考計數會遞增。
在取消對應程式庫模組之前,系統會啟用 DLL 來中斷處理序使用它的連結。 這麼做可讓 DLL 有機會清除為目前進程配置的資源。 在進入點函式傳回之後,程式庫模組就會從目前處理序的位址空間中移除。
使用 AfxLoadLibrary
對應 DLL 模組。
如果您的應用程式使用多個線程,請務必使用 AfxFreeLibrary
和 AfxLoadLibrary
(而不是 Win32 函 FreeLibrary
式和 LoadLibrary
)。 使用 AfxLoadLibrary
和 AfxFreeLibrary
可確保載入和卸除 MFC 擴充功能 DLL 時執行的啟動和關機程式代碼不會損毀全域 MFC 狀態。
範例
請參閱 AfxLoadLibrary
的範例。
需求
頁眉 afxdll_.h
AfxGetApp
此函式傳回的指標可用來存取應用程式資訊,例如主要訊息分派程式代碼或最上層視窗。
CWinApp* AFXAPI AfxGetApp();
傳回值
應用程式的單一 CWinApp
物件的指標。
備註
如果這個方法傳 NULL
回 ,它可能表示應用程式主視窗尚未完全初始化。 也可能表示有問題。
範例
// Print the application's executable filename.
TRACE(_T("Executable filename = %s\n"), AfxGetApp()->m_pszExeName);
需求
頁眉 afxwin.h
AfxGetAppName
傳回的字串可用於診斷訊息,或做為暫存字串名稱的根目錄。
LPCTSTR AFXAPI AfxGetAppName();
傳回值
包含應用程式名稱的 NULL 結尾字串。
範例
// Print the application name to the debugger output window.
TRACE(_T("Application name is %s\n"), AfxGetAppName());
需求
頁眉 afxwin.h
AfxGetInstanceHandle
這個函式可讓您擷取目前應用程式的執行個體控制代碼。
HINSTANCE AFXAPI AfxGetInstanceHandle();
傳回值
HINSTANCE
應用程式目前實例的 。 如果從與 USRDLL 版本的 MFC 連結的 DLL 內呼叫, HINSTANCE
則會傳回 DLL 的 。
備註
AfxGetInstanceHandle
除非您從與 USRDLL 版本的 MFC 連結的 DLL 內呼叫可執行檔 (.EXE) 的 ,否則一律會傳回 HINSTANCE
可執行檔的 。 在此情況下,它會將 HINSTANCE
傳回至 DLL。
範例
// Print the application instance handle to the debugger output window.
TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetInstanceHandle());
需求
頁眉 afxwin.h
AfxGetMainWnd
如果您的應用程式是 OLE 伺服器,請呼叫此函式,以擷取應用程式作用中主視窗的指標。 使用此結果,而不是直接參考 m_pMainWnd
應用程式對象的成員。
CWnd* AFXAPI AfxGetMainWnd();
傳回值
如果伺服器在作用中容器內有就地使用中的物件,則傳回包含就地使用中檔之框架視窗物件的指標。
如果容器內沒有就地作用中的物件,或您的應用程式不是 OLE 伺服器,則此函式會 m_pMainWnd
傳回應用程式物件的 。
如果從應用程式的主執行緒呼叫 AfxGetMainWnd
,則它會根據上述規則傳回應用程式的主視窗。 如果從應用程式的次要執行緒呼叫函式時,則函式會傳回與發出呼叫的執行緒關聯的主視窗。
備註
如果您的應用程式不是 OLE 伺服器,則呼叫此函式相當於直接參考 m_pMainWnd
應用程式對象的成員。
範例
//The following line send a WM_CLOSE message
// to the Application's main window. This will cause the
// Application to exit.
AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);
需求
頁眉 afxwin.h
AfxGetPerUserRegistration
使用此函式來判斷應用程式是否將登錄存取重新導向至 HKEY_CURRENT_USER
(HKCU
) 節點。
BOOL AFXAPI AfxGetPerUserRegistration();
傳回值
TRUE
表示登錄信息已導向至 HKCU
節點。 FALSE
表示應用程式會將登錄資訊寫入默認節點。 默認節點為 HKEY_CLASSES_ROOT
(HKCR
)。
備註
如果您開啟登入重新導向,架構會將存取權從 HKCR
重新導向至 HKEY_CURRENT_USER\Software\Classes
。 只有 MFC 和 ATL 架構會受到重新導向的影響。
若要變更應用程式是否重新導向登入存取權,請使用 AfxSetPerUserRegistration
。
需求
頁眉 afxstat_.h
AfxGetResourceHandle
HINSTANCE
使用此函式傳回的句柄,直接存取應用程式的資源,例如,在 Windows 函式 FindResource
的呼叫中。
extern HINSTANCE AfxGetResourceHandle();
傳回值
HINSTANCE
載入應用程式預設資源的句柄。
範例
//Load the menu specifying the module handle where resource is to be
//found & resource ID
HMENU hMenu = ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
需求
頁眉 afxwin.h
AfxGetThread
呼叫此函式,以取得代表目前執行中線程之 物件的指標 CWinThread
。
CWinThread* AfxGetThread();
傳回值
目前執行線程的指標;否則 NULL
為 。
備註
必須在線程內呼叫。
注意
如果您要從 Visual C++ 4.2、5.0 或 6.0 版移植 MFC 專案 AfxGetThread
,如果找不到任何線程, AfxGetThread
則會呼叫 AfxGetApp
。 在較新版本的編譯程式中,如果找不到任何線程, AfxGetThread
則會 NULL
傳回 。 如果您要應用程式執行緒,則必須呼叫 AfxGetApp
。
範例
//Print the current thread ID in the Debug Window
TRACE(_T("Current Thread ID = 0x%X\n"), AfxGetThread()->m_nThreadID);
需求
頁眉 afxwin.h
AfxInitRichEdit
呼叫此函式,以初始化應用程式的豐富編輯控制件 (1.0 版)。
BOOL AFXAPI AfxInitRichEdit();
備註
提供此函式以提供回溯相容性。 新的應用程式應該使用 AfxInitRichEdit2
。
AfxInitRichEdit
載入 RICHED32.DLL
以初始化 1.0 版的豐富編輯控制件。 若要使用 2.0 版和 3.0 版的豐富編輯控件, RICHED20.DLL
必須載入。 呼叫 來載入 AfxInitRichEdit2
它。
若要將現有 Visual C++ 應用程式中的豐富編輯控制項更新為 2.0 版,請開啟 。RC 檔案做為文字,將每個豐富編輯控件的類別名稱從 “RICHEDIT
” 變更為 “RichEdit20a
”。 然後將的呼叫 AfxInitRichEdit
取代為 AfxInitRichEdit2
。
如果連結庫尚未針對進程初始化,此函式也會初始化通用控件連結庫。 如果您直接從 MFC 應用程式使用豐富編輯控制項,請呼叫此函式以確保 MFC 已正確初始化豐富編輯控制項運行時間。 如果您呼叫 Create
、 CRichEditView
或 CRichEditDoc
的 CRichEditCtrl
方法,通常不需要呼叫此函式,但在某些情況下可能是必要的。
需求
頁眉 afxwin.h
AfxInitRichEdit2
呼叫此函式以初始化應用程式的 Rich Edit 控制項 (2.0 版和更新版本)。
BOOL AFXAPI AfxInitRichEdit2();
備註
呼叫此函式以載入 RICHED20.DLL
和初始化 2.0 版的豐富編輯控制件。 如果您呼叫 Create
、 CRichEditView
或 CRichEditDoc
的 CRichEditCtrl
方法,通常不需要呼叫此函式,但在某些情況下可能是必要的。
需求
頁眉 afxwin.h
AfxIsExtendedFrameClass
判斷指定的視窗是否為擴充框架物件。
語法
BOOL AFXAPI AfxIsExtendedFrameClass( CWnd* pWnd );
參數
pWnd
[in]衍生自 CWnd
的物件指標。
傳回值
TRUE
如果提供的視窗是擴充框架物件,則為 ;否則 FALSE
為 。
備註
如果 TRUE
衍生自下列其中一個類別,此方法會傳回 pWnd
:
CFrameWndEx
CMDIFrameWndEx
COleIPFrameWndEx
COleDocIPFrameWndEx
CMDIChildWndEx
當您必須驗證函式或方法參數是否為擴充框架物件時,此方法很有用。
需求
標頭: afxpriv.h
AfxIsMFCToolBar
判斷指定的視窗是否為工具列物件。
語法
BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd);
參數
pWnd
[in]衍生自 CWnd
的物件指標。
傳回值
TRUE
如果提供的視窗是工具列物件,則為 ;否則 FALSE
為 。
備註
如果pWnd
衍生自CMFCToolBar
,則這個方法會TRUE
傳回 。 當您必須驗證函式或方法參數是否為 CMFCToolBar
物件時,這個方法就很有用。
需求
標頭: afxpriv.h
AfxKeyboardManager
全域 鍵盤管理員的指標。
語法
CKeyboardManager* afxKeyboardManager;
需求
標頭: afxkeyboardmanager.h
AfxLoadLibrary
使用 AfxLoadLibrary
對應 DLL 模組。
HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName);
參數
lpszModuleName
指向包含模組名稱的 Null 終止字串(.DLL或.EXE檔案)。 指定的名稱是模組的檔案名。
如果字串指定路徑,但檔案不存在於指定的目錄中,則函式會失敗。
如果未指定路徑且省略擴展名,則會附加默認擴展名.DLL。 不過,檔名字串可以包含尾端點字元 (..), 表示模組名稱沒有擴展名。 未指定路徑時,函式會使用 傳統型應用程式的搜尋順序。
傳回值
如果函式成功,傳回值就是模組的句柄。 失敗時,傳回值為 NULL
。
備註
它會傳回可用來 GetProcAddress
取得 DLL 函式位址的句柄。 AfxLoadLibrary
也可以用來對應其他可執行的模組。
每個進程都會為每個載入的連結庫模組維護參考計數。 每次呼叫 時 AfxLoadLibrary
,這個參考計數都會遞增,每次呼叫時 AfxFreeLibrary
都會遞減。 在參考計數達到零時,模組就從呼叫處理序的位址空間取消對應,且控制代碼不再有效。
如果您的應用程式使用多個線程,以及動態載入 MFC 擴充 DLL,請務必使用 AfxLoadLibrary
和 AfxFreeLibrary
(而不是 Win32 函 LoadLibrary
式和 FreeLibrary
)。 使用 AfxLoadLibrary
和 AfxFreeLibrary
確保載入和卸除 MFC 擴充功能 DLL 時所執行的啟動和關機程式代碼不會損毀全域 MFC 狀態。
在應用程式中使用 AfxLoadLibrary
時,您必須動態連結至 MFC 的 DLL 版本。 只有在 MFC 連結至應用程式作為 DLL 時,才會包含、 的頭檔AfxLoadLibrary
Afxdll_.h
。 這項需求是設計,因為您必須連結至 MFC 的 DLL 版本,才能使用或建立 MFC 擴充 DLL。
範例
// The following shows how to create a MDI based application
// using a generic CView derived class that is implemented in
// a dynamically loaded MFC Extension DLL.
typedef CRuntimeClass *(*GETDLLVIEW)();
BOOL CUserApp::InitInstance()
{
// Standard Application Wizard generated initialization excluded.
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views
//Load MFC Extension DLL based view class.
m_hViewDll = AfxLoadLibrary(szMyViewDllPath);
if (!m_hViewDll)
{
CString str;
str.Format(_T("Error: Cannot find component %s"), szMyViewDllPath);
AfxMessageBox(str);
return FALSE;
}
GETDLLVIEW GetMyView = (GETDLLVIEW)GetProcAddress(m_hViewDll, "GetMyView");
ASSERT(GetMyView != NULL);
CMultiDocTemplate *pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_NVC_MFC_DLLUserTYPE,
RUNTIME_CLASS(CUserDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
GetMyView());
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
// Standard Application Wizard generated initialization excluded.
return TRUE;
}
int CUserApp::ExitInstance()
{
if (NULL != m_hViewDll)
{
AfxFreeLibrary(m_hViewDll);
m_hViewDll = NULL;
}
return CWinApp::ExitInstance();
}
需求
頁眉 afxdll_.h
AfxLoadLibraryEx
使用 AfxLoadLibraryEx
對應 DLL 模組。
HINSTANCE AFXAPI AfxLoadLibraryEx(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags);
參數
lpFileName
指向包含模組名稱的 Null 終止字串(.DLL或.EXE檔案)。 指定的名稱是模組的檔案名。
如果字串指定路徑,但檔案不存在於指定的目錄中,則函式會失敗。
如果未指定路徑且省略擴展名,則會附加默認擴展名.DLL。 不過,檔名字串可以包含尾端點字元 (..), 表示模組名稱沒有擴展名。 未指定路徑時,函式會使用 傳統型應用程式的搜尋順序。
hFile
這個參數會保留供日後使用。 其必須是 NULL
。
dwFlags
載入模組時要採取的動作。 如果未指定旗標,此函式的行為會與函式 AfxLoadLibrary
相同。 本文件說明 LoadLibraryEx
此參數的可能值。
傳回值
如果函式成功,傳回值就是模組的句柄。 失敗時,傳回值為 NULL
。
備註
AfxLoadLibraryEx
會傳回可用來 GetProcAddress
取得 DLL 函式位址的句柄。 AfxLoadLibraryEx
也可以用來對應其他可執行的模組。
每個進程都會為每個載入的連結庫模組維護參考計數。 每次呼叫 時 AfxLoadLibraryEx
,這個參考計數都會遞增,每次呼叫時 AfxFreeLibrary
都會遞減。 在參考計數達到零時,模組就從呼叫處理序的位址空間取消對應,且控制代碼不再有效。
如果您的應用程式使用多個線程,以及動態載入 MFC 擴充 DLL,請務必使用 AfxLoadLibraryEx
和 AfxFreeLibrary
(而不是 Win32 函 LoadLibraryEx
式和 FreeLibrary
)。 使用 AfxLoadLibraryEx
和 AfxFreeLibrary
可確保載入和卸除 MFC 擴充功能 DLL 時執行的啟動和關機程式代碼不會損毀全域 MFC 狀態。
在應用程式中使用 AfxLoadLibraryEx
時,您必須動態連結至 MFC 的 DLL 版本。 只有在 MFC 連結至應用程式作為 DLL 時,才會包含、 的頭檔AfxLoadLibraryEx
Afxdll_.h
。 這項需求是設計,因為您必須連結至 MFC 的 DLL 版本,才能使用或建立 MFC 擴充 DLL。
需求
頁眉 afxdll_.h
AfxMenuTearOffManager
全域 卸除功能表管理員的指標。
語法
CMenuTearOffManager* g_pTearOffMenuManager;
需求
標頭: afxmenutearoffmanager.h
AfxMouseManager
全域 滑鼠管理員的指標。
語法
CMouseManager* afxMouseManager;
需求
標頭: afxmousemanager.h
AfxRegisterClass
使用這個函式在使用 MFC 的 DLL 中登錄視窗類別。
BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass);
參數
lpWndClass
WNDCLASS
結構的指標,其中包含要註冊之窗口類別的相關信息。 如需此結構的詳細資訊,請參閱 Windows SDK。
傳回值
TRUE
如果已成功註冊類別,則為 ;否則 FALSE
為 。
備註
如果您使用這個函式,類別會在卸載 DLL 時自動解除登錄。
在非 DLL 組建中 AfxRegisterClass
,標識符會定義為對應至 Windows 函 RegisterClass
式的巨集,因為應用程式中註冊的類別會自動取消註冊。 如果您使用 而非 RegisterClass
,則可以在AfxRegisterClass
應用程式和 DLL 中使用程式代碼,而不需要變更。
範例
// Register your unique class name that you wish to use
WNDCLASS wndcls;
memset(&wndcls, 0, sizeof(WNDCLASS)); // start with NULL defaults
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
//you can specify your own window procedure
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = LoadIcon(wndcls.hInstance, MAKEINTRESOURCE(IDI_MYICON));
wndcls.hCursor = LoadCursor(wndcls.hInstance, MAKEINTRESOURCE(IDC_ARROW));
wndcls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;
// Specify your own class name for using FindWindow later
wndcls.lpszClassName = _T("MyNewClass");
// Register the new class and trace if it fails
if(!AfxRegisterClass(&wndcls))
{
TRACE("Class Registration Failed\n");
}
需求
頁眉 afxwin.h
AfxRegisterWndClass
可讓您註冊您的視窗類別。
LPCTSTR AFXAPI AfxRegisterWndClass(
UINT nClassStyle,
HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0,
HICON hIcon = 0);
參數
nClassStyle
指定視窗類別的 Windows 類別樣式或樣式組合,使用位 OR (|
) 運算子建立的樣式。 如需類別樣式的清單,請參閱 WNDCLASS
Windows SDK 中的 結構。 如果 NULL
為 ,則會設定預設值,如下所示:
將滑鼠樣式設定為
CS_DBLCLKS
,當使用者按兩下滑鼠時,會將按兩下訊息傳送至視窗程式。將箭頭游標樣式設定為 Windows 標準
IDC_ARROW
。將背景筆刷設定為
NULL
,因此視窗不會清除其背景。將圖示設定為標準的旗標 Windows 標誌圖示。
hCursor
指定將在從視窗類別建立之各個視窗中安裝的游標資源控制代碼。 如果您使用預設值 0,則會取得標準 IDC_ARROW
數據指標。
hbrBackground
指定將在從視窗類別建立之各個視窗中安裝的筆刷資源控制代碼。 如果您使用預設值 0,您將有 NULL
背景筆刷,而且根據預設,您的視窗在處理 WM_ERASEBKGND
時不會清除其背景。
hIcon
指定將在從視窗類別建立之各個視窗中安裝的圖示資源控制代碼。 如果您使用預設值 0,則會取得標準、揮舞旗標 Windows 標誌圖示。
傳回值
包含類別名稱的以 NULL 結尾字串。 您可以將這個類別名稱傳遞至 Create
中的 CWnd
成員函式或其他 **CWnd-
**衍生類別,以建立視窗。 此名稱是由 MFC 程式庫所產生。
注意
傳回值是靜態緩衝區的指標。 若要儲存此字串,請將它指派給 CString
變數。
備註
MFC 程式庫會自動為您註冊多個標準視窗類別。 如果您要註冊自己的視窗類別,請呼叫這個函式。
由 AfxRegisterWndClass
為類別註冊的名稱取決於參數的內容。 如果您以相同參數多次呼叫 AfxRegisterWndClass
,它只會註冊第一次呼叫的類別。 稍後使用相同參數呼叫 AfxRegisterWndClass
會傳回已註冊的 classname。
如果您針對具有相同參數的多個CWnd
衍生類別呼叫 AfxRegisterWndClass
,而不是為每個類別取得個別的窗口類別,每個類別都會共用相同的窗口類別。 如果使用類別樣式, CS_CLASSDC
此共用可能會造成問題。 您最後只會有一個CS_CLASSDC
窗口類別,而不是多個CS_CLASSDC
窗口類別。 使用該類別的所有C++視窗都會共用相同的DC。 若要避免這個問題,請呼叫 AfxRegisterClass
以註冊 類別。
如需窗口類別註冊和函AfxRegisterWndClass
式的詳細資訊,請參閱 Technical Note TN001:Window Class Registration。
範例
CString strMyClass;
// load stock cursor, brush, and icon for
// my own window class
try
{
strMyClass = AfxRegisterWndClass(
CS_VREDRAW | CS_HREDRAW,
::LoadCursor(NULL, IDC_ARROW),
(HBRUSH)::GetStockObject(WHITE_BRUSH),
::LoadIcon(NULL, IDI_APPLICATION));
}
catch (CResourceException *pEx)
{
AfxMessageBox(_T("Couldn't register class! (Already registered?)"));
pEx->Delete();
}
需求
頁眉 afxwin.h
AfxSetPerUserRegistration
設定應用程式是否將登錄存取重新導向至 HKEY_CURRENT_USER
(HKCU
) 節點。
void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);
參數
bEnable
[in] TRUE
表示登錄信息已導向至 HKCU
節點。 FALSE
表示應用程式會將登錄資訊寫入默認節點。 默認節點為 HKEY_CLASSES_ROOT
(HKCR
)。
備註
在 Windows Vista 之前,存取登錄的應用程式通常會使用 HKEY_CLASSES_ROOT
節點。 不過,使用 Windows Vista 或更新版本的作業系統,您必須以提升許可權模式執行應用程式,才能寫入 HKCR
。
這個方法可讓應用程式讀取和寫入登錄,而不需以提升許可權模式執行。 其運作方式是將登入記憶體取從 HKCR
重新導向至 HKCU
。 如需詳細資訊,請參閱 Linker Property Pages。
如果您開啟登入重新導向,架構會將存取權從 HKCR
重新導向至 HKEY_CURRENT_USER\Software\Classes
。 只有 MFC 和 ATL 架構會受到重新導向的影響。
默認實作會存取 下的 HKCR
登錄。
需求
頁眉 afxstat_.h
AfxSetResourceHandle
使用此函式來設定 HINSTANCE
句柄,以決定載入應用程式的預設資源位置。
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
參數
hInstResource
載入應用程式的資源的 .EXE 或 DLL 檔的執行個體或模組控制代碼。
範例
// This code is taken from CMyApp::InitInstance
HINSTANCE hRes = NULL;
hRes = LoadLibrary(_T("Resource.dll"));
if (hRes)
AfxSetResourceHandle(hRes);
需求
頁眉 afxwin.h
AfxShellManager
全域 殼層管理員的指標。
語法
CShellManager* afxShellManager;
需求
標頭: afxshellmanager.h
AfxSocketInit
在您的 CWinApp::InitInstance
覆寫中呼叫此函式,以初始化 Windows Sockets。
BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);
參數
lpwsaData
結構的指標 WSADATA
。 如果 lpwsaData
不等於 NULL
,則 結構的位址 WSADATA
會由 對的呼叫 WSAStartup
填入。 這個函式也可確保 WSACleanup
在應用程式終止之前為您呼叫 。
傳回值
如果函式成功則為非零,否則為 0。
備註
在靜態連結 MFC 應用程式中的次要線程中使用 MFC 套接字時,您必須在每個使用套接字來初始化套接字連結庫的線程中呼叫 AfxSocketInit
。 根據預設, AfxSocketInit
只會在主要線程中呼叫 。
需求
頁眉 afxsock.h
AfxUserToolsManager
全域 使用者工具管理員的指標。
語法
CUserToolsManager* afxUserToolsManager;
需求
標頭: afxusertoolsmanager.h
AfxWinInit
MFC 提供的 WinMain
函式會呼叫此函式,做為 GUI 型應用程式初始化的一部分 CWinApp
,以初始化 MFC。
BOOL AFXAPI AfxWinInit(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow);
參數
hInstance
目前執行之模組的句柄。
hPrevInstance
應用程式上一個實例的句柄。 對於以 Win32 為基礎的應用程式,此參數一律 NULL
為 。
lpCmdLine
指向以 Null 結尾的字串,指定應用程式的命令行。
nCmdShow
指定如何顯示 GUI 應用程式的主視窗。
備註
對於不使用 MFC 提供的 WinMain
函式的控制台應用程式,您必須直接呼叫 AfxWinInit
以初始化 MFC。
如果您自行呼叫 AfxWinInit
,您應該宣告 類別的 CWinApp
實例。 針對主控台應用程式,您可以選擇不要從 CWinApp
衍生您自己的類別,而是直接使用 的 CWinApp
實例。 如果您決定在實作 main
中保留應用程式的所有功能,則這項技術是適當的。
注意
當它建立元件的啟用內容時,MFC 會使用使用者模組所提供的指令清單資源。 啟用內容可在 AfxWinInit
中建立。 如需詳細資訊,請參閱 MFC 模組狀態中的啟用內容支援。
範例
#include <afx.h>
#include <afxdb.h>
int _tmain(int /*argc*/, TCHAR * /*argv[]*/, TCHAR * /*envp[]*/)
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
// try to connect to an ODBC database that doesn't exist
// (this wouldn't work at all without initializing MFC)
CDatabase db;
try
{
db.Open(_T("This Databsae Doesn't Exist"));
// we shouldn't realistically get here
_tprintf_s(_T("Successful!\n")
_T("Closing ...\n"));
db.Close();
_tprintf_s(_T("Closed!"));
}
catch (CDBException *pEx)
{
// we got an exception! print an error message
// (this wouldn't work without initializing MFC)
TCHAR sz[1024];
_tprintf_s(_T("Error: "));
if (pEx->GetErrorMessage(sz, 1024))
_tprintf_s(sz);
else
_tprintf_s(_T("No error message was available"));
_tprintf_s(_T("\n"));
pEx->Delete();
nRetCode = 1;
}
}
return nRetCode;
}
需求
頁眉 afxwin.h
另請參閱
巨集和全域
CWinApp
類
CContextMenuManager
類別
CWnd
類
CFrameWndEx
類
CMFCToolBar
類
CKeyboardManager
類別
CMenuTearOffManager
類
CMouseManager
類別
CShellManager
類
CUserToolsManager
類別