应用程序信息和管理

当你编写应用程序时,会创建一个 CWinApp 派生对象。 有时,你可能想要从 CWinApp 派生对象外部获取有关此对象的信息。 或者,可能需要访问其他全局“管理器”对象。

Microsoft 基础类库提供以下全局函数来帮助你完成这些任务:

应用程序信息和管理函数

名称 描述
AfxBeginThread 创建新线程。
AfxContextMenuManager 指向全局上下文菜单管理器的指针。
AfxEndThread 终止当前线程。
AfxFindResourceHandle 遍历资源链并按资源 ID 和资源类型找到特定资源。
AfxFreeLibrary 减少已加载动态链接库 (DLL) 模块的引用计数。 当引用计数达到零时,模块被取消映射。
AfxGetApp 返回指向应用程序单个 CWinApp 对象的指针。
AfxGetAppName 返回包含应用程序名称的字符串。
AfxGetInstanceHandle 返回表示此应用程序实例的 HINSTANCE
AfxGetMainWnd 返回一个指针,指向非 OLE 应用程序的当前“主”窗口,或服务器应用程序的就地框架窗口。
AfxGetPerUserRegistration 使用此函数可确定应用程序是否将注册表访问重定向到 HKEY_CURRENT_USER (HKCU) 节点。
AfxGetResourceHandle HINSTANCE 返回到应用程序默认资源的源。 用于直接访问应用程序的资源。
AfxGetThread 检索指向当前 CWinThread 对象的指针。
AfxInitRichEdit 为应用程序初始化 1.0 版 Rich Edit 控件。
AfxInitRichEdit2 为应用程序初始化 2.0 版和更高版本的 Rich Edit 控件。
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 指向全局 shell 管理器的指针。
AfxSocketInit CWinApp::InitInstance 替代中调用以初始化 Windows 套接字。
AfxUserToolsManager 指向全局用户工具管理器的指针。
AfxWinInit 在基于 GUI 的应用程序的 CWinApp 初始化过程中由 MFC 提供的 WinMain 函数调用,用于初始化 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
派生自 CWinThread 的对象的 RUNTIME_CLASS

pParam
要传递给控制函数的参数。

nPriority
要为线程设置的优先级。 有关可用优先级的完整列表和说明,请参阅 Windows SDK 中的 SetThreadPriority

nStackSize
指定新线程堆栈的大小(以字节为单位)。 如果为 0,则堆栈大小默认为与所创建线程相同的堆栈大小。

dwCreateFlags
指定一个用于控制线程创建的额外标志。 此标志可以包含两个值之一:

  • CREATE_SUSPENDED 以 1 的挂起计数启动线程。 如果要在线程开始运行之前初始化 CWinThread 对象的任何成员数据(例如 m_bAutoDelete 或派生类的任何成员),请使用 CREATE_SUSPENDED。 初始化完成后,使用 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
指向资源的类型的指针。 有关资源类型的列表,请参阅 Windows SDK 中的 FindResource

返回值

包含资源的模块的句柄。

注解

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 函数 FreeLibraryLoadLibrary)。 使用 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。 如果从某个与 MFC 的 USRDLL 版本链接的 DLL 中进行调用,则会返回该 DLL 的 HINSTANCE

备注

AfxGetInstanceHandle 始终返回可执行文件 (.EXE) 的 HINSTANCE,除非从某个与 MFC 的 USRDLL 版本链接的 DLL 中进行调用。 在这种情况下,它将返回该 DLL 的 HINSTANCE

示例

// 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

注解

必须从线程内部调用。

注意

如果将调用 AfxGetThread 的 MFC 项目从 Visual C++ 4.2、5.0 或 6.0 版转移,则 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

调用此函数为应用程序初始化 Rich Edit 控件(1.0 版)。

BOOL AFXAPI AfxInitRichEdit();

备注

此函数可以向后兼容。 新应用程序应使用 AfxInitRichEdit2

AfxInitRichEdit 加载 RICHED32.DLL 以初始化 Rich Edit 控件的 1.0 版。 若要使用 Rich Edit 控件的 2.0 和 3.0 版,需要加载 RICHED20.DLL。 通过调用 AfxInitRichEdit2 来进行加载。

若要将现有 Visual C++ 应用程序中的 Rich Edit 控件更新到 2.0 版,请以文本格式打开 .RC 文件,将每个 Rich Edit 控件的类名从“RICHEDIT”更改为“RichEdit20a”。 然后用 AfxInitRichEdit2 替换对 AfxInitRichEdit 的调用。

如果尚未为进程初始化库,此函数还会初始化公共控件库。 如果你是直接从 MFC 应用程序使用 Rich Edit 控件,请调用此函数以确保 MFC 已正确初始化 Rich Edit 控件运行时。 如果调用 CRichEditCtrlCRichEditViewCRichEditDocCreate 方法,通常不需要调用此函数,但在某些情况下可能必须调用。

要求

页眉afxwin.h

AfxInitRichEdit2

调用此函数为应用程序初始化 Rich Edit 控件(2.0 版和更高版本)。

BOOL AFXAPI AfxInitRichEdit2();

备注

调用此函数以加载 RICHED20.DLL 并初始化 Rich Edit 控件 2.0 版。 如果调用 CRichEditCtrlCRichEditViewCRichEditDocCreate 方法,通常不需要调用此函数,但在某些情况下可能必须调用。

要求

页眉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 函数 LoadLibraryFreeLibrary)。 使用 AfxLoadLibraryAfxFreeLibrary 可以确保在加载和卸载 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,请确保使用 AfxLoadLibraryExAfxFreeLibrary(而不是 Win32 函数 LoadLibraryExFreeLibrary)。 使用 AfxLoadLibraryExAfxFreeLibrary 可以确保在加载和卸载 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 的宏,因为将自动取消注册在应用程序中注册的类。 如果使用 AfxRegisterClass 代替 RegisterClass,则你的代码可以使用,而无需在应用程序和 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 类样式或样式组合。 有关类样式的列表,请参阅 Windows SDK 中的 WNDCLASS 结构。 如果为 NULL,则默认设置如下:

  • 将鼠标样式设置为 CS_DBLCLKS,当用户双击鼠标时,它会将双击消息发送到窗口过程。

  • 将箭头光标样式设置为 Windows 标准 IDC_ARROW

  • 将背景画笔设置为 NULL,这样窗口就不会擦除其背景。

  • 将图标设置为标准的 Windows 徽标图标(飘扬的旗帜)。

hCursor
指定要在从窗口类创建的每个窗口中安装的光标资源的句柄。 如果使用默认值 0,将获得标准的 IDC_ARROW 光标。

hbrBackground
指定要在从窗口类创建的每个窗口中安装的画笔资源的句柄。 如果使用默认值 0,将获得 NULL 背景画笔,并且在默认情况下,窗口在处理 WM_ERASEBKGND 时不会擦除其背景。

hIcon
指定要在从窗口类创建的每个窗口中安装的图标资源的句柄。 如果使用默认值 0,将获得标准的 Windows 徽标图标(飘扬的旗帜)。

返回值

包含类名的以 null 结尾的字符串。 可以将此类名传递到 CWnd 或其他 **CWnd-** 派生类中的 Create 成员函数以创建窗口。 该名称由 Microsoft 基础类库生成。

注意

返回值是指向静态缓冲区的指针。 若要保存此字符串,请将其分配到 CString 变量。

备注

Microsoft 基础类库将自动为您注册若干标准窗口类。 如果要注册您自己的窗口类,则调用此函数。

AfxRegisterWndClass 为类注册的名称仅依赖于参数。 如果使用相同的参数调用 AfxRegisterWndClass 多次,它只会在首次调用时注册类。 之后使用相同的参数继续对 AfxRegisterWndClass 进行调用,则会返回已注册的类名。

如果使用相同的参数为多个 CWnd 派生类调用 AfxRegisterWndClass,而不是为每个类获得单独的窗口类,则每个类都将共享同一窗口类。 此共享可能在使用了 CS_CLASSDC 类样式时导致问题。 最终得到的不是多个 CS_CLASSDC 窗口类,而是一个 CS_CLASSDC 窗口类。 使用该类的所有 C++ 窗口共享同一个 DC。 为了避免此问题,请调用 AfxRegisterClass 来注册该类。

有关窗口类注册和 AfxRegisterWndClass 函数的详细信息,请参阅技术说明 TN001:Window 类注册

示例

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

指向全局 shell 管理器的指针。

语法

CShellManager* afxShellManager;

要求

标头afxshellmanager.h

AfxSocketInit

CWinApp::InitInstance 重写中调用此函数可初始化 Windows 套接字。

BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);

参数

lpwsaData
指向 WSADATA 结构的指针。 如果 lpwsaData 不等于 NULL,则通过调用 WSAStartup 来填充 WSADATA 结构的地址。 此函数还确保在应用程序终止前为您调用 WSACleanup

返回值

如果该函数成功,则为非 0;否则为 0。

备注

在静态链接的 MFC 应用程序中的辅助线程中使用 MFC 套接字时,您必须在使用套接字的每个线程中调用 AfxSocketInit 来初始化套接字库。 默认情况下,仅在主线程中调用 AfxSocketInit

要求

页眉afxsock.h

AfxUserToolsManager

指向全局用户工具管理器的指针。

语法

CUserToolsManager* afxUserToolsManager;

要求

标头afxusertoolsmanager.h

AfxWinInit

在基于 GUI 的应用程序的 CWinApp 初始化过程中,此函数由 MFC 提供的 WinMain 函数调用,用于初始化 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