应用程序信息和管理

编写应用程序时,将创建单个 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 版丰富编辑控件。
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 指向全局 shell 管理器 的指针
AfxSocketInit 在 重写 CWinApp::InitInstance 中调用以初始化Windows套接字。
AfxUserToolsManager 指向全局用户 工具管理器 的指针
AfxWinInit 由 MFC 提供的函数调用,作为初始化基于 GUI 的应用程序的一 WinMain 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
为线程设置的优先级。 有关可用优先级的完整列表和说明,请参阅 Windows SetThreadPriority SDK。

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

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

  • CREATE_SUSPENDED 启动挂起计数为 1 的线程。 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 :创建线程User-Interface线程。

示例

请参阅 的示例 CSocket::Attach

要求

Header afxwin.h

AfxContextMenuManager

指向全局上下文菜单 管理器 的指针

语法

CContextMenuManager* afxContextMenuManager;

要求

标头:afxcontextmenumanager.h

AfxEndThread

调用此函数以终止当前正在执行的线程。

void AFXAPI AfxEndThread(
    UINT nExitCode,
    BOOL bDelete  = TRUE);

参数

nExitCode
指定线程的退出代码。

bDelete
从内存中删除线程对象。

备注

必须从要终止的线程中调用 。

有关 有关详细信息 AfxEndThread ,请参阅多 线程:终止线程一文

要求

Header 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 模块。

请确保使用 和 (而不是 Win32 函数,如果) AfxFreeLibrary AfxLoadLibrary 使用多个线程 FreeLibrary LoadLibrary ,则使用 和 。 使用 和 可确保在加载和卸载 MFC 扩展 DLL 时执行的启动和关闭代码 AfxLoadLibrary AfxFreeLibrary 不会损坏全局 MFC 状态。

示例

请参阅 的示例 AfxLoadLibrary

要求

Header afxdll_.h

AfxGetApp

此函数返回的指针可用于访问应用程序信息,例如主消息调度代码或最顶层窗口。

CWinApp* AFXAPI AfxGetApp();

返回值

指向应用程序的单个 CWinApp 对象的指针。

备注

如果此方法返回 NULL ,则可能会指示应用程序主窗口尚未完全初始化。 它也可能表示存在问题。

示例

// Print the application's executable filename.
TRACE(_T("Executable filename = %s\n"), AfxGetApp()->m_pszExeName);

要求

Header afxwin.h

AfxGetAppName

返回的字符串可用于诊断消息,或用作临时字符串名称的根。

LPCTSTR AFXAPI AfxGetAppName();

返回值

包含应用程序名称的以 null 结尾的字符串。

示例

// Print the application name to the debugger output window.
TRACE(_T("Application name is %s\n"), AfxGetAppName());

要求

Header afxwin.h

AfxGetInstanceHandle

此函数使您能够检索当前应用程序的实例句柄。

HINSTANCE  AFXAPI AfxGetInstanceHandle();

返回值

应用程序的 HINSTANCE 当前实例的 。 如果从与 USRDLL 版本的 MFC 链接的 DLL 中调用,则返回 HINSTANCE DLL 的 。

备注

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

示例

// Print the application instance handle to the debugger output window.
TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetInstanceHandle());

要求

Header 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);

要求

Header 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

要求

Header 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));

要求

Header afxwin.h

AfxGetThread

调用此函数可获取指向表示 CWinThread 当前正在执行的线程的对象的指针。

CWinThread* AfxGetThread();

返回值

指向当前正在执行的线程的指针;否则 NULL 为 。

备注

必须从线程内调用 。

备注

如果要移植从 Visual C++ AfxGetThread 4.2、5.0 或 6.0 版本调用的 MFC 项目,如果未找到线程,则 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);

要求

Header 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 CRichEditCtrl CRichEditView CRichEditDoc 可能需要调用。

要求

Header afxwin.h

AfxInitRichEdit2

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

BOOL AFXAPI AfxInitRichEdit2();

备注

调用此函数以加载 RICHED20.DLL 并初始化富编辑控件的版本 2.0。 如果调用 、 或 的 方法,则通常不需要调用此函数,但在某些情况下 Create CRichEditCtrl CRichEditView CRichEditDoc 可能需要调用。

要求

Header afxwin.h

AfxIsExtendedFrameClass

确定给定窗口是否是扩展框架对象。

语法

BOOL AFXAPI AfxIsExtendedFrameClass( CWnd* pWnd );

参数

pWnd
[in]指向派生自 的对象的指针 CWnd

返回值

TRUE 如果提供的窗口是扩展框架对象,则为 ;否则 FALSE 为 。

备注

如果 派生 TRUEpWnd 以下类之一,则此方法返回 :

  • CFrameWndEx

  • CMDIFrameWndEx

  • COleIPFrameWndEx

  • COleDocIPFrameWndEx

  • CMDIChildWndEx

此方法在你必须验证函数或方法参数是否是扩展框架窗口时很有用。

要求

标头:afxpriv.h

AfxIsMFCToolBar

确定给定窗口是否为工具栏对象。

语法

BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd);

参数

pWnd
[in]指向派生自 的对象的指针 CWnd

返回值

TRUE 如果提供的窗口是工具栏对象,则为 ;否则 FALSE 为 。

备注

如果 派生 TRUE 自 , pWnd 则此方法返回 CMFCToolBar 。 此方法在您必须验证函数或方法参数是否是 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 还可用于映射其他可执行模块。

每个进程维护每个已加载库模块的引用计数。 每次调用 时,此引用计数会递增,并且每次调用 时 AfxLoadLibraryAfxFreeLibrary 减量。 当引用计数达到零时,将从调用进程的地址空间取消映射模块,并且句柄不再有效。

如果应用程序使用多个线程 (动态加载 MFC 扩展 DLL,请确保使用 (而不是 Win32 函数和 AfxLoadLibrary AfxFreeLibrary LoadLibrary FreeLibrary) 。 使用 和 可确保在加载和卸载 MFC 扩展 DLL 时执行的启动和关闭代码 AfxLoadLibrary AfxFreeLibrary 不会损坏全局 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();
}

要求

Header 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 还可用于映射其他可执行模块。

每个进程维护每个已加载库模块的引用计数。 每次调用 时,此引用计数会递增,并且每次调用 时 AfxLoadLibraryExAfxFreeLibrary 减量。 当引用计数达到零时,将从调用进程的地址空间取消映射模块,并且句柄不再有效。

如果应用程序使用多个线程 (动态加载 MFC 扩展 DLL,请确保使用 和 (而不是 Win32 函数和 AfxLoadLibraryEx AfxFreeLibrary LoadLibraryEx FreeLibrary) 。 使用 和 可确保在加载和卸载 MFC 扩展 DLL 时执行的启动和关闭代码 AfxLoadLibraryEx AfxFreeLibrary 不会损坏全局 MFC 状态。

AfxLoadLibraryEx在应用程序中使用 需要动态链接到 MFC 的 DLL 版本。 只有当 MFC 作为 DLL 链接到应用程序时,才包含 、 AfxLoadLibraryEx Afxdll_.h 的头文件。 此要求是设计使的,因为必须链接到 MFC 的 DLL 版本,以使用或创建 MFC 扩展 DLL。

要求

Header 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 生成中,标识符定义为映射到 Windows 函数 的宏,因为应用程序中注册的类 AfxRegisterClass RegisterClass 会自动注销。 如果使用 而不是 ,则无需在应用程序和 DLL 中更改即可 AfxRegisterClass RegisterClass 使用代码。

示例

// 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");
}

要求

Header afxwin.h

AfxRegisterWndClass

允许您注册自己的窗口类。

LPCTSTR AFXAPI AfxRegisterWndClass(
    UINT nClassStyle,
    HCURSOR hCursor = 0,
    HBRUSH hbrBackground = 0,
    HICON hIcon = 0);

参数

nClassStyle
指定Windows类样式或样式组合,这些样式是使用窗口类的按位或 () | 运算符创建的。 有关类样式的列表,请参阅 Windows WNDCLASS 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- 派生类,以创建窗口。 该名称由 Microsoft 基础类库生成。

备注

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

备注

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

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

如果调用具有相同参数的多个派生类,而不是获取每个类的单独窗口类,则每个类 AfxRegisterWndClass CWnd 共享同一个窗口类。 如果使用类样式,这种 CS_CLASSDC 共享可能会导致问题。 最终只有一 CS_CLASSDC 个窗口类,而不是多个 CS_CLASSDC 窗口类。 使用该类的所有 C++ 窗口共享同一 DC。 若要避免此问题,请调用 AfxRegisterClass 来注册 类。

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

示例

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();
}

要求

Header 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

要求

Header 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);

要求

Header afxwin.h

AfxShellManager

指向全局 shell 管理器 的指针

语法

CShellManager* afxShellManager;

要求

标头:afxshellmanager.h

AfxSocketInit

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

BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);

参数

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

返回值

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

备注

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

要求

Header afxsock.h

AfxUserToolsManager

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

语法

CUserToolsManager* afxUserToolsManager;

要求

标头:afxusertoolsmanager.h

AfxWinInit

此函数由 MFC 提供的函数调用,作为初始化基于 GUI 的应用程序的一部分,以 WinMain 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;
}

要求

Header afxwin.h

请参阅

宏和全局
CWinApp 班级
CContextMenuManager 班级
CWnd 班级
CFrameWndEx 班级
CMFCToolBar 班级
CKeyboardManager 班级
CMenuTearOffManager 班级
CMouseManager 班级
CShellManager 班级
CUserToolsManager 班级