共用方式為


應用程式資訊和管理

當您撰寫應用程式時,您會建立單 CWinApp一衍生物件。 有時候,您可能會想要從衍生物件外部 CWinApp取得此對象的相關信息。 或者,您可能需要存取其他全域「管理員」物件。

Microsoft Foundation Class Library 提供下列全域函式,可協助您完成這些工作:

應用程式資訊與管理功能

名稱 描述
AfxBeginThread 建立新的線程。
AfxContextMenuManager 全域 操作功能表管理員的指標。
AfxEndThread 終止目前的線程。
AfxFindResourceHandle 逐步解說資源鏈結,並依資源標識符和資源類型找出特定資源。
AfxFreeLibrary 遞減已載入之動態連結庫 (DLL) 模組的參考計數。 當參考計數達到零時,模組會取消對應。
AfxGetApp 傳回應用程式單 CWinApp 一物件的指標。
AfxGetAppName 傳回包含應用程式名稱的字串。
AfxGetInstanceHandle HINSTANCE 回 ,表示應用程式的這個實例。
AfxGetMainWnd 傳回非 OLE 應用程式目前「主要」視窗的指標,或伺服器應用程式的就地框架視窗。
AfxGetPerUserRegistration 使用此函式來判斷應用程式是否將登錄存取重新導向至 HKEY_CURRENT_USERHKCU) 節點。
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_USERHKCU) 節點。
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 中內含資源。

模組會依此順序搜尋:

  1. 如果它是 MFC 延伸模組 DLL,則為主要模組。

  2. 非系統模組。

  3. 特定語言的模組。

  4. 如果是系統 DLL,則為主要模組。

  5. 系統模組。

需求

標頭: afxwin.h

AfxFreeLibrary

AfxFreeLibraryAfxLoadLibrary 會保留每個載入的程式庫模組的參考計數。

BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);

參數

hInstLib
所載入程式庫模組的控制代碼。 AfxLoadLibrary 會傳回這個句柄。

傳回值

TRUE 如果函式成功,則為 ;否則為 FALSE

備註

AfxFreeLibrary 會將載入的動態連結程式庫 (DLL) 模組的參考計數遞減。 在參考計數達到零時,模組就從呼叫處理序的位址空間取消對應,且控制代碼不再有效。 每次呼叫 AfxLoadLibrary 時,此參考計數會遞增。

在取消對應程式庫模組之前,系統會啟用 DLL 來中斷處理序使用它的連結。 這麼做可讓 DLL 有機會清除為目前進程配置的資源。 在進入點函式傳回之後,程式庫模組就會從目前處理序的位址空間中移除。

使用 AfxLoadLibrary 對應 DLL 模組。

如果您的應用程式使用多個線程,請務必使用 AfxFreeLibraryAfxLoadLibrary (而不是 Win32 函 FreeLibrary 式和 LoadLibrary)。 使用 AfxLoadLibraryAfxFreeLibrary 可確保載入和卸除 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_USERHKCU) 節點。

BOOL AFXAPI AfxGetPerUserRegistration();

傳回值

TRUE 表示登錄信息已導向至 HKCU 節點。 FALSE 表示應用程式會將登錄資訊寫入默認節點。 默認節點為 HKEY_CLASSES_ROOTHKCR)。

備註

如果您開啟登入重新導向,架構會將存取權從 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 已正確初始化豐富編輯控制項運行時間。 如果您呼叫 CreateCRichEditViewCRichEditDocCRichEditCtrl方法,通常不需要呼叫此函式,但在某些情況下可能是必要的。

需求

頁眉 afxwin.h

AfxInitRichEdit2

呼叫此函式以初始化應用程式的 Rich Edit 控制項 (2.0 版和更新版本)。

BOOL AFXAPI AfxInitRichEdit2();

備註

呼叫此函式以載入 RICHED20.DLL 和初始化 2.0 版的豐富編輯控制件。 如果您呼叫 CreateCRichEditViewCRichEditDocCRichEditCtrl方法,通常不需要呼叫此函式,但在某些情況下可能是必要的。

需求

頁眉 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,請務必使用 AfxLoadLibraryAfxFreeLibrary (而不是 Win32 函 LoadLibrary 式和 FreeLibrary)。 使用 AfxLoadLibraryAfxFreeLibrary 確保載入和卸除 MFC 擴充功能 DLL 時所執行的啟動和關機程式代碼不會損毀全域 MFC 狀態。

在應用程式中使用 AfxLoadLibrary 時,您必須動態連結至 MFC 的 DLL 版本。 只有在 MFC 連結至應用程式作為 DLL 時,才會包含、 的頭檔AfxLoadLibraryAfxdll_.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,請務必使用 AfxLoadLibraryExAfxFreeLibrary (而不是 Win32 函 LoadLibraryEx 式和 FreeLibrary)。 使用 AfxLoadLibraryExAfxFreeLibrary 可確保載入和卸除 MFC 擴充功能 DLL 時執行的啟動和關機程式代碼不會損毀全域 MFC 狀態。

在應用程式中使用 AfxLoadLibraryEx 時,您必須動態連結至 MFC 的 DLL 版本。 只有在 MFC 連結至應用程式作為 DLL 時,才會包含、 的頭檔AfxLoadLibraryExAfxdll_.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_USERHKCU) 節點。

void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);

參數

bEnable
[in] TRUE 表示登錄信息已導向至 HKCU 節點。 FALSE 表示應用程式會將登錄資訊寫入默認節點。 默認節點為 HKEY_CLASSES_ROOTHKCR)。

備註

在 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 類別