C W inApp

C W inApp 是 一 个 基 类 , 你 通 过 它 来 继 承 W indow s应 用 程 序 对 象 。 应 用 程 序 对 象为 你 提 供 了 初 始 化 应 用 程 序 ( 以 及 它 的 每 一 个 实 例 ) 和 运 行 应 用 程 序 所 需 的 成员 函 数 。

每 个 使 用 微 软 基 础 类 库 的 应 用 程 序 都 只 能 包 含 一 个 从 C W inApp 继 承 的 对 象 。当 W indows 调 用 W in M ain 函 数 时 , 这 个 对 象 在 其 它 C++ 全 局 对 象 都 已 经 生 成并 且 可 用 之 后 才 被 创 建 , W in M ain 函 数 是 由 微 软 基 础 类 库 提 供 的 。 将 你 的C W inApp 对 象 定 义 为 全 局 的 。

当 你 从 C W inApp 继 承 应 用 程 序 类 的 时 候 , 应 重 载 InitInstance 成 员 函 数 以 创 建应 用 程 序 的 主 窗 口 对 象 。

除 了 C W inApp 的 成 员 函 数 以 外 , 微 软 基 础 类 库 还 提 供 了 以 下 全 局 函 数 , 用 于访 问 你 的 C W inApp 对 象 以 及 其 它 全 局 信 息 :

  • AfxGetApp 获 得 指 向 C W inApp 对 象 的 指 针 。

  • AfxGetInstanceHandle 获 得 当 前 应 用 程 序 实 例 的 句 柄 。

  • AfxGetResourceHandle 获 得 应 用 程 序 资 源 的 句 柄 。

  • AfxGetAppName 获 得 一 个 字 符 串 指 针 , 其 中 包 含 了 应 用 程

    序 的 名 字 。另 外 , 如 果 你 拥 有 一 个 指 向 CWinApp 对 象 的 指 针 , 可 以 通 过 m_pszExename 来 获 得 应 用 程 序 的 名 字 。

有 关 C W inApp 类 的 更 多 信 息 参 见 “ V isual C++ 程 序 员 指 南 ” 中 的 “ C W inApp : 应 用 程 序 类 ” , 其 中 包 括 下 面 的 内 容 :

  • AppWizard 生 成 的 C W inApp 派 生 代 码

  • C W inApp 在 你 的 应 用 程 序 执 行 顺 序 中 作 用

  • C W inApp 的 缺 省 成 员 函 数 实 现

  • C W inApp 的 主 要 可 重 载 函 数

#include <afxwin.h>

C W inApp 类 成 员

Data Members

m_pszAppName 指 定 了 应 用 程 序 的 名 字m_hInstance 标 识 了 应 用 程 序 的 当 前 实 例m_hPrevInstance 在 32 位 应 用 程 序 中 被 设 为 NULL

m_lpCmdLine 指 向 一 个 以 null 结 尾 的 字 符 串 , 指 定 了 应 用 程 序 的 命

令行

m_nCmdShow 指 定 最 初 如 何 显 示 窗 口

m_bHelpMode 指 明 用 户 是 否 处 于 Help 上 下 文 模 式( 通 常 用 SHIFT+F1

激 活 )

m_pActiveWnd 当 一 个 OLE 服 务 器 是 现 场 可 激 活 时 , 它 指 向 容 器 应

用 程 序 的 主 窗 口m_pszExeName 应 用 程 序 的 模 块 名 字m_pszHelpFilePath 应 用 程 序 的 帮 助 文 件 的 路 径m_pszProfileName 应 用 程 序 的 .INI 文 件 名

m_pszRegistryKey 用 于 确 定 保 存 应 用 程 序 主 要 设 置 的 完 整 的 注 册 表 键

Construction

C W inApp 构 造 一 个 C W inApp 对 象

Operations

LoadCursor

载 入 光 标 资 源

LoadStandardCursor

载 入 W INDOWS.H

IDC_ 常 量 所 指 定 的

W indows

LoadOEMCursor

预 定 义 光 标

载 入 W INDOWS.H

OCR _ 常 量 所 指 定 的

W indows

OEM 预 定 义 光 标

LoadIcon

载 入 图 标 资 源

LoadStandardIcon

载 入 W INDOWS.H

预 定 义 图 标

中 IDI_ 常 量 所 指 定 的

W indows

LoadOEMIcon

载 入 W INDOWS.H

中 OIC_ 常 量 所 指 定 的

W indows

OEM 预 定 义 图 标

RunAutomated 检 查 应 用 程 序 的 命 令 行 是 否 指 定 /Automation 选 项 。

已 不 用 。 应 当 在 调 用 ParseCommandLine 之 后 使 用

CCommandLineInfo::m_bRunEmbedded 中 的 值

RunEmbedded 检 查 应 用 程 序 的 命 令 行 是 否 指 定 /Embedding 选 项 。

已 不 用 。 应 当 在 调 用 ParseCommandLine 之 后 使 用

CCommandLineInfo::m_bRunEmbedded 中 的 值ParseCommandLine 解 析 命 令 行 中 的 每 个 参 数 和 标 志ProcessShellCommand 处 理 命 令 行 参 数 和 标 志

GetProfileInt 从 应 用 程 序 的 .INI 文 件 的 一 个 入 口 中 获 取 一 个 整 数

W riteProfileInt 将 一 个 整 数 写 到 应 用 程 序 的 .INI 文 件 的 入 口

GetProfileString 从 应 用 程 序 的 .INI 文 件 的 一 个 入 口 中 获 取 一 个 字 符

W riteProfileString 将 一 个 字 符 串 写 到 应 用 程 序 的 .INI 文 件 的 入 口

AddDocTemplate 将 一 个 文 档 模 板 加 到 应 用 程 序 的 可 用 文 档 模 板 列 表

GetFirstDocTemplate Position

获 取 第 一 个 文 档 模 板 的 位 置

GetNextDocTemplate 获 得 文 档 模 板 的 位 置 。 可 以 递 归 调 用

OpenDocumentFile 由 框 架 调 用 , 用 以 从 文 件 打 开 一 个 文 档AddToRecentFileList 将 一 个 文 件 名 加 入 最 近 使 用 ( MRU ) 的 文 件 列 表SelectPrinter 选 择 先 前 由 用 户 在 打 印 对 话 框 中 指 定 的 打 印 机CreatePrinterDC 创 建 一 个 打 印 机 设 备 环 境

GetPrinterDevice Defaults

获 得 缺 省 的 打 印 机 设 备

Overridables

InitInstance 可 被 重 载 以 执 行 W indows 的 实 例 初 始 化 , 比 如 创建 窗 口 对 象

Run 运 行 缺 省 的 消 息 循 环 。 可 被 重 载 以 定 制 消 息 循 环

OnIdle 可 被 重 载 以 执 行 应 用 程 序 指 定 的 空 闲 时 处 理

ExitInstance 可 被 重 载 以 在 应 用 程 序 结 束 时 执 行 清 除 操 作

HideApplication 在 关 闭 所 有 的 文 档 之 前 隐 藏 应 用 程 序

CloseAllDocuments 关 闭 所 有 打 开 的 文 档

PreTranslateMessage 在 消 息 被 分 派 到 W indows 函 数 ::TranslateMessage

和 ::D ispatchMessage 之 前 过 滤 消 息

SaveAllModified 提 示 用 户 保 存 所 有 改 变 了 的 文 档

DoMessageBox 为 应 用 程 序 实 现 A fx M essageBox ProcessMessageFilter 在 消 息 到 达 应 用 程 序 之 前 截 取 特 定 的 消 息ProcessWndProcException 截 取 应 用 程 序 的 消 息 和 命 令 处 理 函 数 抛 出 的 未

被 处 理 的 异 常

DoWaitCursor 打 开 或 关 闭 等 待 光 标

OnDDECommand 框 架 调 用 这 个 函 数 以 响 应 动 态 数 据 交 换 ( D D E )

执 行 命 令

W inHelp 调 用 W indows 的 W inHelp 函 数

Initialization

LoadStdProfileSettings 载 入 标 准 的 .INT 文 件 设 置 并 允 许 M R U 文 件 列 表 特

SetDialogBkColor 设 置 对 话 框 和 消 息 框 的 缺 省 背 景 颜 色

SetRegistryKey 使 应 用 程 序 的 设 置 保 存 在 注 册 表 中 , 而 不 是 .INI 文

件 中

EnableShellOpen 允 许 用 户 通 过 W indows 的 文 件 管 理 器 打 开 数 据 文 件

RegisterShellFileTypes 在 W indows 的 文 件 管 理 器 中 注 册 所 有 的 应 用 程 序 文

档 类 型Enable3dControls 使 控 件 具 有 三 维 外 观Enable3dControlsStatic 使 控 件 具 有 三 维 外 观

Command Handlers

OnFileNew 实现 ID_FILE_NEW 命 令

OnFileOpen 实现 ID_FILE_NEW 命 令OnFilePrintSetup 实 现 ID_FILE_PRINT_SETUP 命 令OnContextHelp 处 理 应 用 程 序 内 的 SHIFT+F1 命 令

OnHelp 处 理 应 用 程 序 内 的 F1 帮 助 命 令 ( 使 用 当 前 的 上 下 文 ) OnHelpIndex 处理 ID_HELP_INDEX 命 令 , 提 供 缺 省 的 帮 助 主 题OnHelpFinder 处 理 ID_HELP_FINDER 和 ID_DEFAULT_HELP 命 令OnHelpUsing 处理 ID_HELP_USING 命 令

成 员 函 数

C W inApp::AddDocTemplate

void AddDocTemplate( CDocTemplate* pTemplate );

参 数

pTemplate

指 向 要 增 加 的 CDocTemplate 的 指 针 。

说 明

调 用 这 个 成 员 函 数 , 将 文 档 模 板 加 入 应 用 程 序 维 护 的 可 用 文 档 模 板 列 表 中 。 你可 以 在 调 用 RegisterShellFileTypes 之 前 加 入 所 有 的 文 档 模 板 。

示 例

BOOL CMyApp::InitInstance()

{

// ...

// 下 面 的 代 码 是 在 你 选 择 M D I ( 多 文 档 界 面 ) 选 项 时

// AppWizard 为 你 生 成 的 。CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(

IDR_MYTYPE, RUNTIME_CLASS(CMyDoc),

RUNTIME_CLASS(CMDIChildWnd), // 标 准 的 M D I 子 框 架

RUNTIME_CLASS(CMyView));

AddDocTemplate(pDocTemplate);

// ...

}

请 参 阅 C W inApp::RegisterShellFileTypes, CMultiDocTemplate, CSingleDocTemplate

C W inApp::AddToRecentFileList

virtual void AddToRecentFileList( LPCTSTR lpszPathName );

参 数

lpszPathName

文 件 的 路 径 。

说 明

调 用 这 个 成 员 函 数 以 把 lpszPathName加 入 M R U 文 件 列 表 。 你 必 须 在 使 用 这 个 成员 函 数 之 前 调 用 LoadStdProfileSetting 成 员 函 数 以 载 入 当 前 的 MRU 文 件 列 表 。

当 框 架 打 开 一 个 文 件 或 者 执 行 Save As 命 令 用 新 名 字 保 存 文 件 时 , 它 就 调 用 这个 成 员 函 数 。

示 例

// 这 个 例 子 将 路 径 名 c:\temp\test.doc 加 入

// File 菜 单 中 的 最 近 使 用 ( M R U ) 文 件 列 表

AfxGetApp()->AddToRecentFileList("c:\\temp\\test.doc");

请 参 阅 C W inApp::LoadStdProfileSettings

C W inApp::CloseAllDocuments

void CloseAllDocuments( BOOL bEndSession );

参 数

bEndSession

指 定 W indows 会 话 是 否 要 结 束 。 如 果 为 TRUE , 则 会 话 将 结 束 ; 否 则 为

FALSE 。

说 明

调 用 这 个 函 数 以 在 退 出 之 前 关 闭 所 有 打 开 的 文 档 。 在 调 用 CloseAllDocuments 之前 调 用 HideApplication 。

请 参 阅 C W inApp::SaveAllModified, CWinApp::HideApplication

C W inApp::CreatePrinterDC

BOOL CreatePrinterDC( CDC& dc );

返 回 值

如 果 成 功 地 创 建 了 打 印 机 设 备 环 境 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

参 数

dc

对 打 印 机 设 备 环 境 的 引 用 。

调 用 该 成 员 函 数 从 选 定 的 打 印 机 中 创 建 打 印 机 设 备 上 下 文( D C )。 CreatePrinter D C 初 始 化 通 过 引 用 传 递 过 来 的 设 备 上 下 文 , 因 此 , 你 可 以 使 用 该 设 备 上 下 文 进行 打 印 。

如 果 该 函 数 调 用 成 功 , 在 你 打 印 完 毕 之 后 , 必 须 销 毁 该 设 备 上 下 文 。 你 可 以 让

C D C 对 象 的 析 构 器 去 做 这 件 事 , 也 可 以 显 式 地 调 用 CDC= ::DeleteDC。

请 参 阅 C W inApp::SelectPrinter

C W inApp::CWinApp

C W inApp( LPCTSTR lpszAppName = NULL );

参 数

lpszAppName

一 个 以 null 结 尾 的 字 符 串 , 其 中 包 含 了 W indow s使 用 的 应 用 程 序 的 名 字 。如 果 没 有 提 供 这 个 参 数 , 或 者 其 值 为 NULL , C W inApp 使 用 资 源 字 符 串AFX_IDS_APP_TITLE 或 可 执 行 文 件 的 文 件 名 。

构 造 一 个 C W inApp 对 象 并 将 lpszAppNam e传 递 给 它 , 当 作 应 用 程 序 的 名 字 保 存 。你 必 须 创 建 一 个 C W inApp 派 生 类 的 全 局 对 象 。 在 你 的 应 用 程 序 中 只 能 有 一 个 C W inApp 对 象 。 构 造 函 数 保 存 了 执 行 CWinApp 对 象 的 指 针 , 因 此 W in M ain 可 以调 用 对 象 的 成 员 函 数 以 初 始 化 并 运 行 应 用 程 序 。

C W inApp::DoMessageBox

virtual int DoMessageBox( LPCTSTR lpszPromp t, UINT nType , UINT nIDPrompt );

返 回 值

返 回 与 AfxMessageBox 相 同 的 值 。

参 数

lpszPrompt

消 息 框 中 文 本 的 地 址 。

nType

消 息 框 的 风 格 。

nIDPrompt

帮 助 上 下 文 字 符 串 的 索 引 。

说 明

框 架 调 用 这 个 成 员 函 数 来 实 现 全 局 函 数 AfxMessageBox 中 的 消 息 框 。不 要 用 这 个 成 员 函 数 来 打 开 消 息 框 , 应 该 使 用 AfxMessageBox 。

重 载 这 个 函 数 可 以 在 你 的 应 用 程 序 的 范 围 内 自 定 义 AfxMessageBox 的 处 理 。

请 参 阅 AfxMessageBox, ::M essageBox

C W inApp::Do W aitCursor

virtual void DoWaitCursor( int nCode );

参 数

nCode

如 果 这 个 参 数 为 1 , 则 出 现 等 待 光 标 。 如 果 为 0 , 则 恢 复 等 待 光 标 , 但 不增 加 引 用 计 数 。 如 果 为 -1 , 则 结 束 等 待 光 标 。

说 明

这 个 成 员 函 数 被 框 架 调 用 , 用 以 实 现 CWaitCursor ,

CCmdTarget::Begin W aitCursor , CCmdTarget::EndWaitCursor 和

CCmdTarget::RestoreWaitCursor。 缺 省 的 实 现 提 供 一 个 沙 漏 光 标 。 DoWaitCursor

维 护 一 个 引 用 计 数 。 当 它 为 正 时 , 将 显 示 沙 漏 光 标 。

尽 管 通 常 你 不 用 直 接 调 用 DoWaitCursor 函 数 , 你 也 可 以 重 载 这 个 成 员 函 数 以 改变 等 待 光 标 或 者 在 显 示 等 待 光 标 时 加 入 附 加 的 处 理 。

如 果 需 要 更 简 单 有 效 的 实 现 等 待 光 标 的 方 式 , 使 用 CWaitCursor。

请 参 阅 CCmdTarget::BeginWaitCursor, CCmdTarget::End W aitCursor, CCmdTarget::RestoreWaitCursor, CWaitCursor

C W inApp::Enable3dControls

BOOL Enable3dControls( ); BOOL Enable3dControlsStatic( );

注 意 在 这 个 部 分 同 时 描 述 了 Enable3dControls 和Enable3dControlsStatic 。

返 回 值

如 果 成 功 地 载 入 了 CTL3D32.DLL , 则 为 TRUE ; 否 则 为 FALSE 。如 果 操 作 系 统 支 持 控 件 的 三 维 外 观 , 则 这 个 函 数 将 返 回 FALSE 。

说 明

在 你 重 载 的 InitInstance 成 员 函 数 内 调 用 这 些 成 员 函 数 以 使 对 话 框 和 窗 口 的 控 件能 够 具 有 三 维 外 观 。 这 些 成 员 函 数 载 入 CTL3D32.DLL 并 向 它 注 册 应 用 程 序 。 如果 你 调 用 了 Enable3d - Controls 或 Enable3dControlsStatic , 你 不 需 要 调 用SetDialogBkColor成 员 函 数 。

在 与 MFC DLL 连 接 时 , 必 须 使 用 Enable3dControls 。 当 与 MFC 库 进 行 静 态 连接 时 , 必 须 使 用 Enable3dControlsStatic 。

仅 在 专 业 版 和 企 业 版 中 才 具 有 的 特 征 只 有 Visual C++ 的 专 业 版 和 企 业版 才 支 持 与 MFC 的 静 态 连 接 。 有 关 的 更 多 信 息 参 见 “ Visual C++ ” 。

MFC 自 动 为 下 列 的 窗 口 类 提 供 3D 控 件 效 果 :

  • CDialog

  • CDialogBar

  • CFormView

  • CPropertyPage

  • CPropertySheet

  • CControlBar

  • CToolBar

如 果 你 希 望 具 有 3D 外 观 的 控 件 所 在 窗 口 属 于 上 述 类 , 那 你 只 需 调 用Enable3dControls 或 Enable3dControlsStatic 。 如 果 你 希 望 为 基 于 其 它 类 的 窗 口 中的 控 件 提 供 3D 外 观 , 则 必 须 直 接 调 用 CTL3D32 的 API 函 数 。

示 例

#ifdef _AFXDLL

Enable3dControls( ); // 调 用 Enable3dControls #else

Enable3dControlsStatic( );

// 调用 Enable3dControlsStatic #endif

请 参 阅 C W inApp::InitInstance, CWinApp::SetDialogBkColor

C W inApp::EnableShellOpen

void EnableShellOpen( );

说 明

通 常 在 你 重 载 的 InitInstance 函 数 内 调 用 这 个 函 数 , 使 你 的 应 用 程 序 的 用 户 能 够通 过 在 W indow s的 文 件 管 理 器 内 双 击 文 件 的 方 式 打 开 数 据 文 件 。 与 这 个 函 数 一起 调 用 RegisterShellFileTypes 成 员 函 数 , 或 者 随 应 用 程 序 提 供 一 个 .REG 文 件 , 用 于 手 动 注 册 文 档 类 型 。

示 例

BOOL CMyApp::InitInstance()

{

// ...

CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(

IDR_MYTYPE, RUNTIME_CLASS(CMyDoc),

RUNTIME_CLASS(CMDIChildWnd), // 标 准 的 M D I 子 框 架

RUNTIME_CLASS(CMyView));

AddDocTemplate(pDocTemplate);

// 创建 M D I 的 主 框 架 窗 口

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE;

// 保 存 指 向 主 框 架 窗 口 的 指 针 。

// 这 是 框 架 获 得 主 框 架 窗 口 类 型 的 唯 一 方 式 。

m_pMainWnd = pMainFrame;

// 打 开 文 件 管 理 器 的 拖 /放 和 D D E 打 开 特 性 。

EnableShellOpen(); RegisterShellFileTypes();

// ...

// 根 据 应 用 程 序 启 动 时 传 递 的 nCmdShow 参 数 显 示 主 窗 口

pMainFrame->ShowWindow(m_nCmdShow);

pMainFrame->UpdateWindow();

// ...

}

请 参 阅 C W inApp::OnDDECommand, CWinApp::RegisterShellFileTypes

C W inApp::ExitInstance

virtual int ExitInstance( );

返 回 值

应 用 程 序 的 退 出 码 ; 0 表 示 没 有 错 误 , 大 于 0 的 值 表 示 有 错 误 。 这 个 值 被 用 作

W in M ain 的 返 回 值 。

说 明

框 架 在 Run 成 员 函 数 的 内 部 调 用 这 个 函 数 以 退 出 应 用 程 序 的 实 例 。

不 能 在 其 它 的 任 何 地 方 调 用 这 个 成 员 函 数 , 只 能 在 Run 成 员 函 数 内 部 调 用 。这 个 函 数 的 缺 省 实 现 将 框 架 的 选 项 写 入 应 用 程 序 的 .INI 文 件 。

重 载 这 个 函 数 以 在 应 用 程 序 退 出 的 时 候 执 行 一 些 清 除 操 作 。

请 参 阅 C W inApp::Run, CWinApp::InitInstance

C W inApp::GetFirstDocTemplatePosition

POSITION GetFirstDocTemplatePosition( ) const;

返 回 值

  • 个 POSITION 值 , 可 以 被 用 于 反 复 或 获 取 对 象 指 针 。 如 果

    这 个 列 表 为 空 则 返回 NULL 。

说 明

获 得 应 用 程 序 的 第 一 个 文 档 模 板 的 位 置 。 使 用 调 用 GetNextDocTemplate 时 返 回的 POSITION 值 来 获 得 第 一 个 CDocTemplate 对 象 。

请 参 阅 C W inApp::AddDocTemplate, CWinApp::GetNextDocTemplate

C W inApp::GetNextDocTemplate

CDocTemplate* GetNextDocTemplate( POSITION& pos ) const;

返 回 值

指 向 CDocTemplate 对 象 的 指 针 。

参 数

pos

对 一 个 POSITION 值 的 引 用 , 该 值 是 上 一 次 对 GetNextDocTemplate 或GetFirstDoc- Template 的 调 用 所 返 回 的 。 这 一 次 调 用 将 这 个 值 更 新 为 下 一个 位 置 。

说 明

获 得 pos 所 标 识 的 文 档 模 板 , 然 后 将 pos 设 置 为 POSITION 值 。 如 果 你 通 过 对GetFirstDocTemplatePosition 的 调 用 建 立 了 初 始 的 位 置 , 你 可 以 在 一 个 向 前 的 循环 中 使 用 GetNextDocTemplate 。

你 必 须 确 保 POSITION 值 是 有 效 的 。 如 果 它 无 效 , 那 么 微 软 基 础 类 库 的 调 试 版本 将 引 起 断 言 。

如 果 获 得 的 文 档 模 板 是 最 后 一 个 有 效 模 板 , 则 新 的 pos 值 将 被 设 为 NULL 。

请 参 阅 C W inApp::AddDocTemplate, CWinApp::GetFirstDocTemplatePosition

C W inApp::GetPrinterDeviceDefaults

BOOL GetPrinterDeviceDefaults( PRINTDLG* pPrintDlg );

返 回 值

如 果 成 功 , 则 为 非 零 值 ; 否 则 为 0 。

参 数

pPrintDlg

指 向 PRINTDLG 结 构 的 指 针 。

说 明

调 用 这 个 成 员 函 数 来 为 打 印 准 备 打 印 机 设 备 环 境 。 必 要 时 从 W indow s的 .INI文件 中 获 得 缺 省 的 打 印 机 , 或 者 使 用 用 户 在 Print Setup中 设 置 的 打 印 机 配 置 。

请 参 阅 CPrintDialog

C W inApp::GetProfileInt

UINT GetProfileInt( LPCTSTR lpszSection , LPCTSTR lpszEntry , int nDefault );

返 回 值

如 果 这 个 函 数 执 行 成 功 , 则 返 回 指 定 入 口 下 的 字 符 串 的 整 数 值 。 如 果 函 数 没 有找 到 入 口 , 则 返 回 值 为 nDefault 的 值 。 如 果 与 指 定 入 口 对 应 的 值 不 是 整 数 , 则

返 回 值 为 0 。

对 于 .INI 文 件 中 的 值 , 这 个 函 数 支 持 十 六 进 制 符 号 。 当 你 获 得 一 个 带 符 号 整 数时 , 你 必 须 将 其 值 强 制 转 换 为 整 数 值 。

参 数

lpszSection

指 向 一 个 以 null结 尾 的 字 符 串 , 指 定 了 包 含 入 口 的 部 分 。

lpszEntry

指 向 一 个 以 null结 尾 的 字 符 串 , 包 含 了 要 获 取 值 的 入 口 。

nDefault

指 定 了 当 框 架 找 不 到 入 口 时 的 缺 省 返 回 值 。 这 个 值 可 以 是 介 于 0 和 65535

之 间 的 无 符 号 数 , 也 可 以 是 介 于 -32768 和 32767 之 间 的 带 符 号 值 。

说 明

调 用 这 个 函 数 以 获 得 应 用 程 序 的 注 册 表 或 .IN I文 件 中 指 定 部 分 的 入 口 中 的 整 数值 。

这 些 入 口 按 照 如 下 方 式 保 存 :

  • W indows NT 该 值 保 存 在 注 册 表 中

  • W indows 3.X 该 值 保 存 在 W IN.IN I文 件 中 。

  • W indows 95 该 值 保 存 在 W IN.IN I的 缓 冲 版 本 中 。

这 个 函 数 对 大 小 写 不 敏 感 , 因 此 lpszSection 和 lpszEntry 参 数 中 的 字 符 串 在 大小 写 状 态 上 可 以 是 不 同 的 。

请 参 阅

C W inApp::GetProfileString, CWinApp::WriteProfileInt, ::GetPrivateProfileInt

C W inApp::GetProfileString

CString GetProfileString( LPCTSTR lpszSection , LPCTSTR lpszEntry , LPCTSTR

lpszDefault = NULL );

返 回 值

返 回 值 是 应 用 程 序 的 .INI 文 件 中 的 字 符 串 , 如 果 找 不 到 该 字 符 串 , 则 为lpszDefault 。 框 架 支 持 的 字 符 串 最 大 长 度 为 _MAX_PATH 。 如 果 lpszDefault 为NULL , 则 返 回 值 是 一 个 空 字 符 串 。

参 数

lpszSection

指 向 一 个 以 null结 尾 的 字 符 串 , 指 定 了 包 含 入 口 的 部 分 。

lpszEntry

指 向 一 个 以 null结 尾 的 字 符 串 , 其 中 包 含 了 要 获 取 字 符 串 的 入 口 。 这 个 值

不 能 为 NULL 。

lpszDefault

指 向 给 定 入 口 的 缺 省 字 符 串 值 , 当 初 始 化 文 件 中 找 不 到 入 口 时 使 用 该 值 。

说 明

调 用 这 个 函 数 以 获 得 与 应 用 程 序 的 注 册 表 或 .IN I文 件 中 指 定 部 分 的 入 口 相 关 的字 符 串 。

这 些 入 口 按 照 如 下 方 式 保 存 :

  • W indows NT 该 值 保 存 在 注 册 表 中

  • W indows 3.X 该 值 保 存 在 W IN.IN I文 件 中

  • W indows 95 该 值 保 存 在 W IN.IN I的 缓 冲 版 本 中

示 例

CString strSection = " M y Section"; CString strStringItem = " My String Item"; CString strIntItem = "My Int Item"; C W inApp* pApp = AfxGetApp();

pApp->WriteProfileString(strSection, strStringItem, "test"); CString strValue;

strValue = pApp->GetProfileString(strSection, strStringItem);

ASSERT(strValue == "test");

pApp->WriteProfileInt(strSection, strIntItem, 1234); int nValue;

nValue = pApp->GetProfileInt(strSection, strIntItem, 0); ASSERT(nValue == 1234);

请 参 阅

C W inApp::GetProfileInt, CWinApp::WriteProfileString, ::GetPrivateProfileString

C W inApp::HideApplication

void HideApplication( );

说 明

调 用 这 个 成 员 函 数 以 在 关 闭 打 开 的 文 档 之 前 隐 藏 应 用 程 序 。

请 参 阅 C W inApp::CloseAllDocuments

C W inApp::InitInstance

virtual BOOL InitInstance( );

返 回 值

如 果 初 始 化 成 功 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

说 明

W indow s允 许 在 同 一 时 刻 运 行 程 序 的 几 份 拷 贝 。 在 概 念 上 , 应 用 程 序 的 初 始 化可 以 被 分 为 两 个 部 分 : 一 次 性 的 应 用 程 序 初 始 化 工 作 , 这 些 在 应 用 程 序 第 一 次运 行 时 完 成 , 以 及 示 例 的 初 始 化 工 作 , 每 次 运 行 程 序 的 一 个 拷 贝 时 都 会 执 行 这些 操 作 , 包 括 第 一 次 运 行 时 。 框 架 中 W in M ain 的 实 现 调 用 这 个 函 数 。

重 载 InitInstance 以 初 始 化 在 W indows 下 运 行 的 应 用 程 序 的 每 个 新 实 例 。 通 常 , 你 重 载 InitInstance 以 构 造 主 窗 口 对 象 并 设 置 C W inThread::m_pMainWnd 数 据 成员 ,使 其 指 向 这 个 窗 口 。有 关 重 载 这 个 成 员 函 数 的 更 多 信 息 参 见“ V isual C++ 程序 员 指 南 ” 中 的 “ CWinApp : 应 用 程 序 类 ” 。

示 例

// AppWizard 根 据 你 选 择 的 选 项 实 现 重 载 的 InitInstance 函 数 。

// 例 如 , 对 于 下 面 由 AppWizard 创 建 的 代 码 , 选 择 了 单 文 档 界 面 ( SD I) 选 项 。

// 你 可 以 在 AppWizard 创 建 的 代 码 中 加 入 其 它 的 每 个 实 例 都 执 行 的 初 始 化 代码 。

BOOL CMyApp::InitInstance()

{

// 标 准 的 初 始 化 工 作

// 如 果 你 没 有 使 用 这 些 特 性 , 并 且 希 望 减 小 最 终 可 执 行 程 序 的 大 小 ,

// 你 应 当 从 下 面 的 初 始 化 例 程 中 移 去 不 必 要 的 代 码 。SetDialogBkColor(); // 将 对 话 框 的 背 景 色 设 为 灰 色 。LoadStdProfileSettings(); // 载 入 标 准 的 INI 文 件 选 项 ( 包 括 MRU )

// 注 册 应 用 程 序 的 文 档 模 板 。 文 档 模 板

// 被 用 作 文 档 、 框 架 窗 口 和 视 图 之 间 的 联 系 。CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME, RUNTIME_CLASS(CMyDoc),

RUNTIME_CLASS(CMainFrame), // SDI 的 主 框 架 窗 口

RUNTIME_CLASS(CMyView));

AddDocTemplate(pDocTemplate);

// 创 建 一 个 新 ( 空 的 ) 文 档

OnFileNew();

if (m_lpCmdLine[0] != '\0')

{

// 任 务 : 在 这 里 加 入 命 令 行 处 理 代 码

}

return TRUE;

}

C W inApp::LoadCursor

HCURSOR LoadCursor( LPCTSTR lpszResourceName ) const; HCURSOR LoadCursor( UINT nIDResource ) const;

返 回 值

如 果 成 功 , 则 返 回 光 标 的 句 柄 ; 否 则 返 回 NULL 。

参 数

lpszResourceName

指 向 一 个 以 null结 尾 的 字 符 串 , 其 中 包 含 了 光 标 资 源 的 名 字 。 你 可 以 在 这个 参 数 中 使 用 CString 对 象 。

nIDResource

光 标 资 源 的 ID 。

说 明

载 入 当 前 可 执 行 文 件 中 以 lpszResourceName为 名 或 nIDResource 指 定 的 光 标 资源 。 仅 当 光 标 以 前 没 有 被 载 入 内 存 时 , LoadCursor才 会 将 它 载 入 ; 否 则 , 它 获得 现 存 资 源 的 句 柄 。

如 果 要 访 问 预 定 义 的 W indows 光 标 , 则 使 用 LoadStandardCursor 或

LoadOEMCursor 。

示 例

HCURSOR hCursor;

// 载 入 最 初 用 图 形 编 辑 器 创 建 并 赋 给 ID 值 IDC_MYCURSOR 的 光 标 资 源

hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR);

请 参 阅 C W inApp::LoadStandardCursor, C W inApp::LoadOEMCursor, ::LoadCursor

C W inApp::LoadIcon

HICON LoadIcon( LPCTSTR lpszResourceName ) const; HICON LoadIcon( UINT nIDResource ) const;

返 回 值

如 果 成 功 , 则 返 回 图 标 的 句 柄 ; 否 则 返 回 NULL 。

参 数

lpszResourceName

指 向 一 个 以 null结 尾 的 字 符 串 , 其 中 包 含 了 图 标 资 源 的 名 字 。 你 可 以 在 这

个 参 数 中 使 用 CString 对 象 。

nIDResource

图 标 资 源 的 ID 。

说 明

载 入 可 执 行 文 件 中 以 lpszResourceName为 名 或 是 nIDResource指 定 的 图 标 资 源 。仅 当 以 前 图 标 没 有 被 载 入 内 存 时 才 将 它 载 入 ; 否 则 它 获 得 现 存 资 源 的 句 柄 。

你 可 以 使 用 LoadStandardIcon 或 LoadOEMIcon 成 员 函 数 来 访 问 预 定 义 的

W indows 图 标 。

注 意 这 个 成 员 函 数 调 用 Win32 API 函 数 LoadIcon , 它 仅 能 载 入 大 小 在SM_CXICON 和 SM_CYICON 之 内 的 图 标 。

请 参 阅 C W inApp::LoadStandardIcon, CWinApp::LoadOEMIcon, ::LoadIcon

C W inApp::LoadOEMCursor

HCURSOR LoadOEMCursor( UINT nIDCursor ) const;

返 回 值

如 果 成 功 , 则 返 回 光 标 的 句 柄 ; 否 则 返 回 NULL 。

参 数

nIDCursor

指 定 了 预 定 义 的 W indows 光 标 的 ODC_ 常 量 标 识 符 。 你 必 须 在 #include

<afxwin.h> 语 句 之 前 定 义 #define OEMRESOURCE , 以 获 取 对

W INDOWS.H 中 OCR_ 常 量 的 访 问 权 限 。

说 明

这 个 函 数 载 入 nIDCursor指 定 的 W indow s预 定 义 光 标 。

要 访 问 预 定 义 的 W indow s光 标 , 应 使 用 LoadOEMCursor 或 LoadStandardCursor 成员 函 数 。

示 例

// 在 stdafx.h 文 件 中 , 加 入 #define OEMRESOURCE 以

// 包含 windows.h 对 OCR_ 值 的 定 义

#define OEMRESOURCE

#include <afxwin.h> // MFC 内 核 和 标 准 组 件#include <afxext.h> // MFC 扩 展 ( 包 括 V B ) HCURSOR hCursor;

// 载 入 预 定 义 的 W indows 全 尺 寸 光 标

hCursor = AfxGetApp()->LoadOEMCursor(OCR_SIZEALL);

请 参 阅 C W inApp::LoadCursor, CWinApp::LoadStandardCursor, ::LoadCursor

C W inApp::LoadOEMIcon

HICON LoadOEMIcon( UINT nIDIcon ) const;

返 回 值

如 果 成 功 , 则 返 回 图 标 的 句 柄 ; 否 则 返 回 NULL 。

参 数

nIDIcon

指 定 了 预 定 义 的 W indows 图 标 的 OIC_ 常 量 标 识 符 。 你 必 须 在 #include

<afxwin.h> 语 句 之 前 定 义 #define OEMRESOURCE , 以 获 取 对

W INDOWS.H 中 OIC_ 常 量 的 访 问 权 限 。

说 明

这 个 函 数 载 入 nIDIcon 指 定 的 W indow s预 定 义 图 标 资 源 。

要 访 问 预 定 义 的 W indow s图 标 , 应 使 用 LoadOEMIcon 或 LoadStandardIcon 成员 函 数 。

请 参 阅 C W inApp::LoadStandardIcon, CWinApp::LoadIcon, ::LoadIcon

C W inApp::LoadStandardCursor

HCURSOR LoadStandardCursor( LPCTSTR lpszCursorName ) const;

返 回 值

如 果 成 功 , 则 返 回 光 标 的 句 柄 ; 否 则 返 回 NULL 。

参 数

lpszCursorName

标 识 了 预 定 义 的 W indows 光 标 的 IDC_ 常 量 标 识 符 。 这 些 标 识 符 在W INDOWS.H 中 定 义 。 下 面 给 出 的 是 可 能 取 值 的 列 表 和 lpszCursorName 的 含 义 :

  • IDC_ARROW 标 准 的 箭 头 光 标

  • IDC_IBEAM 标 准 的 插 入 文 本 光 标

  • IDC_WAIT 当 W indows 执 行 耗 时 操 作 时 使 用 的 沙 漏 光 标

  • IDC_CROSS 用 于 选 择 的 十 字 光 标

  • IDC_UPARROW 向 上 指 的 箭 头 光 标

  • IDC_SIZE 已 不 被 支 持 。 应 使 用 IDC_SIZEALL

  • IDC_SIZEALL 四 向 箭 头 。 用 于 改 变 窗 口 大 小 。

  • IDC_ICON 以 不 被 支 持 。 应 使 用 IDC_ARROW 。

  • IDC_SIZENWSE 双 向 箭 头 , 尾 部 在 左 上 角 和 右 下 角 。

  • IDC_SIZENESW 双 向 箭 头 , 尾 部 在 右 上 角 和 左 下 角 。

  • IDC_SIZEWE 双 向 水 平 箭 头

  • IDC_SIZENS 双 向 垂 直 箭 头

说 明

载 入 lpszCursorName指 定 的 W indow s预 定 义 光 标 。

要 访 问 W indow s的 预 定 义 光 标 , 应 使 用 LoadStandardCursor 或 LoadOEMCursor

成 员 函 数 。

示 例

HCURSOR hCursor;

// 载入 W indows 预 定 义 的 上 箭 头 光 标 。

hCursor = AfxGetApp()->LoadStandardCursor(IDC_UPARROW);

请 参 阅 C W inApp::LoadOEMCursor, CWinApp::LoadCursor, ::LoadCursor

C W inApp::LoadStandardIcon

HICON LoadStandardIcon( LPCTSTR lpszIconName ) const;

返 回 值

如 果 成 功 , 则 返 回 图 标 的 句 柄 ; 否 则 返 回 NULL 。

参 数

lpszIconName

指 定 了 W indows 的 预 定 义 图 标 的 常 量 标 识 符 。 这 些 标 识 符 在

W INDOWS.H 中 定 义 。下 面 列 出 的 是 可 能 的 取 值 和 lpszIconName 的 含 义 :

  • IDI_APPLICATION 缺 省 的 应 用 程 序 图 标

  • IDI_HAND 手 形 图 标 , 用 于 严 重 警 告 信 息

  • IDI_QUESTION 问 号 图 标 , 用 于 提 示 信 息

  • IDI_EXCLAMATION 感 叹 号 图 标 , 用 于 警 告 信 息

  • IDI_ASTERISK 星 号 图 标 , 用 于 通 知 消 息

说 明

这 个 函 数 载 入 lpszIconNam e指 定 的 W indow s预 定 义 图 标 。

要 访 问 W indow s的 预 定 义 图 标 , 应 使 用 LoadStandardIcon 或 LoadOEMIcon 成 员 函数 。

请 参 阅 C W inApp::LoadOEMIcon, CWinApp::LoadIcon, ::LoadIcon

C W inApp::LoadStdProfileSettings

void LoadStdProfileSettings( UINT nMaxMRU = _AFX_MRU_COUNT );

参 数

nMaxMRU

保 存 的 最 近 使 用 文 件 个 数 。

说 明

在 InitInstance成 员 函 数 内 部 调 用 这 个 成 员 函 数 以 允 许 并 载 入 最 近 使 用 ( M R U ) 文 件 列 表 和 最 后 一 次 预 览 状 态 。 如 果 nMaxMRU 为 0 , 则 不 维 护 MRU 列 表 。

请 参 阅 C W inApp::OnFileOpen, CWinApp::AddToRecentFileList

C W inApp::OnContextHelp

afx_msg void OnContextHelp( );

说 明

你 必 须 在 C W inApp 类 的 消 息 映 射 中 加 入

ON_COMMAND( ID_CONTEXT_HELP, OnContextHelp )

语 句 , 同 时 加 入 加 速 键 表 入 口 , 通 常 是 SHIFT+F1 , 以 允 许 这 个 成 员 函 数 。

OnContextHelp 使 应 用 程 序 进 入 帮 助 模 式 。 光 标 变 为 箭 头 和 问 号 , 用 户 可 以 移动 鼠 标 指 针 , 然 后 按 下 鼠 标 左 键 以 选 择 对 话 框 、 窗 口 、 菜 单 或 命 令 按 钮 。 这 个成 员 函 数 获 得 光 标 下 方 对 象 的 帮 助 上 下 文 并 据 此 调 用 W indows 函 数 W inHelp 。

请 参 阅 C W inApp::OnHelp, CWinApp::WinHelp

C W inApp::OnDDECommand

virtual BOOL OnDDECommand( LPTSTR lpszCommand );

返 回 值

如 果 处 理 了 命 令 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

参 数

lpszCommand

指 向 应 用 程 序 接 收 到 的 DDE 命 令 字 符 串 。

说 明

当 主 框 架 窗 口 接 收 到 一 个 D D E 执 行 消 息 时 , 框 架 就 调 用 这 个 函 数 。 缺 省 的 实 现检 查 此 命 令 是 否 申 请 打 开 一 个 文 档 , 如 果 是 , 则 打 开 指 定 的 文 档 。 通 常 当 用 户

双 击 一 个 数 据 文 件 的 时 候 , W indows 的 文 件 管 理 器 就 发 送 这 样 的 DDE 命 令 字 符串 。 如 果 要 处 理 其 它 的 DDE 执 行 命 令 , 如 打 印 命 令 , 则 应 重 载 此 函 数 。

示 例

BOOL CMyApp::OnDDECommand(LPTSTR lpszCommand)

{

if (CWinApp::OnDDECommand(lpszCommand)) return TRUE;

// 处 理 应 用 程 序 能 识 别 的 任 何 D D E 命 令 名 返 回 TRUE 。

// 分析 D D E 命 令 字 符 串 的 例 子 参 见 C W inApp::OnDDECommand 的 实 现

// 对 于 不 能 处 理 的 D D E 命 令 , 返 回 FALSE 。return FALSE;

}

请 参 阅 C W inApp::EnableShellOpen

C W inApp::OnFileNew

afx_msg void OnFileNew( );

说 明

你 必 须 在 C W inApp 类 的 消 息 映 射 中 加 入 以 下 语 句 :

ON_COMMAND( ID_FILE_NEW, OnFileNew )

以 允 许 这 个 成 员 函 数 。

如 果 允 许 这 个 成 员 函 数 , 则 这 个 函 数 将 处 理 File New 命 令 。

有 关 此 函 数 的 缺 省 动 作 以 及 替 换 这 个 成 员 函 数 的 方 法 参 见 技 术 注 释 22 。

示 例

// 下 面 的 消 息 映 射 是 AppWizard 生 成 的 , 将

// File New , Open 和 Print Setup 菜 单 命 令

// 映 射 到 框 架 中 这 些 命 令 的 缺 省 实 现 。

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// 标 准 的 基 于 文 件 的 文 档 命 令ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)

// 标 准 的 打 印 设 置 命 令

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()

// 下 面 的 消 息 映 射 演 示 了 如 何 将

// File New , Open 和 Print Setup 菜 单 命 令 重 定 向 到

// 你的 CWinApp 派 生 类 中 实 现 的 处 理 函 数 。 你 可 以

// 使用 ClassWizard 来 绑 定 这 些 命 令 , 如 下 面 所 演 示 的 ,

// 因 为 消 息 映 射 入 口 用 //{{AFX_MSG_MAP 和 //}}AFX_MSG_MAP

// 括 起 来 。 注 意 , 如 果 需 要 , 你 可 以 将 处 理 函 数 命 名 为

// CMyApp::OnFileNew , 而 不 是 CMyApp::OnMyFileNew , 其 它 处 理 函 数 类 似 。

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_FILE_NEW, OnMyFileNew) ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)

ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)

//}}AFX_MSG_MAP END_MESSAGE_MAP()

请 参 阅 C W inApp::OnFileOpen C W inApp::OnFileOpen afx_msg void OnFileOpen( );

说 明

你 必 须 在 C W inApp 类 的 消 息 映 射 中 加 入 以 下 语 句 :

ON_COMMAND( ID_FILE_OPEN, OnFileOpen )

以 允 许 这 个 成 员 函 数 。

如 果 允 许 这 个 成 员 函 数 , 它 将 处 理 File Open 命 令 。

有 关 此 函 数 的 缺 省 动 作 以 及 替 换 这 个 成 员 函 数 的 方 法 参 见 技 术 注 释 22 。

示 例

// 下 面 的 消 息 映 射 是 AppWizard 生 成 的 , 将

// File New , Open 和 Print Setup 菜 单 命 令

// 映 射 到 框 架 中 这 些 命 令 的 缺 省 实 现 。

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// 标 准 的 基 于 文 件 的 文 档 命 令ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)

// 标 准 的 打 印 设 置 命 令

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()

// 下 面 的 消 息 映 射 演 示 了 如 何 将

// File New , Open 和 Print Setup 菜 单 命 令 重 定 向 到

// 你的 CWinApp 派 生 类 中 实 现 的 处 理 函 数 。 你 可 以

// 使用 ClassWizard 来 绑 定 这 些 命 令 , 如 下 面 所 演 示 的 ,

// 因 为 消 息 映 射 入 口 用 //{{AFX_MSG_MAP 和 //}}AFX_MSG_MAP

// 括 起 来 。 注 意 , 如 果 需 要 , 你 可 以 将 处 理 函 数 命 名 为

// CMyApp::OnFileNew , 而 不 是 CMyApp::OnMyFileNew , 其 它 处 理 函 数 类 似 。

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_FILE_NEW, OnMyFileNew) ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)

ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)

//}}AFX_MSG_MAP END_MESSAGE_MAP()

请 参 阅 C W inApp::OnFileNew C W inApp::OnFile PrintSetup afx_msg void OnFilePrintSetup( );

说 明

你 必 须 在 C W inApp 类 的 消 息 映 射 中 加 入 以 下 语 句 :

ON_COMMAND( ID_FILE _PRINT_SETU P, OnFile PrintSetup )

以 允 许 这 个 成 员 函 数 。

如 果 允 许 这 个 成 员 函 数 , 它 将 处 理 File Prin t命 令 。

有 关 此 函 数 的 缺 省 动 作 以 及 替 换 这 个 成 员 函 数 的 方 法 参 见 技 术 注 释 22 。

示 例

// 下 面 的 消 息 映 射 是 AppWizard 生 成 的 , 将

// File New , Open 和 Print Setup 菜 单 命 令

// 映 射 到 框 架 中 这 些 命 令 的 缺 省 实 现 。

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

// 标 准 的 基 于 文 件 的 文 档 命 令ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)

// 标 准 的 打 印 设 置 命 令

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()

// 下 面 的 消 息 映 射 演 示 了 如 何 将

// File New , Open 和 Print Setup 菜 单 命 令 重 定 向 到

// 你的 CWinApp 派 生 类 中 实 现 的 处 理 函 数 。 你 可 以

// 使用 ClassWizard 来 绑 定 这 些 命 令 , 如 下 面 所 演 示 的 ,

// 因 为 消 息 映 射 入 口 用 //{{AFX_MSG_MAP 和 //}}AFX_MSG_MAP

// 括 起 来 。 注 意 , 如 果 需 要 , 你 可 以 将 处 理 函 数 命 名 为

// CMyApp::OnFileNew , 而 不 是 CMyApp::OnMyFileNew , 其 它 处 理 函 数 类 似 。

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

//{{AFX_MSG_MAP(CMyApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_FILE_NEW, OnMyFileNew) ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)

ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)

//}}AFX_MSG_MAP END_MESSAGE_MAP()

请 参 阅 C W inApp::OnFileNew

afx_msg void OnHelp( );

说 明

你 必 须 在 C W inApp 类 的 消 息 映 射 中 加 入 以 下 语 句 :

ON_COMMAND( ID_HELP, OnHelp )

以 允 许 这 个 成 员 函 数 。 通 常 你 还 将 为 F1 键 加 入 一 个 加 速 键 入 口 。 允 许 F1 键 只是 一 个 惯 例 , 并 不 是 必 须 的 。

如 果 允 许 这 个 成 员 函 数 , 当 用 户 按 下 F1 键 的 时 候 , 框 架 就 调 用 这 个 函 数 。

这 个 消 息 处 理 函 数 的 缺 省 实 现 确 定 对 应 当 前 窗 口 、 对 话 框 或 菜 单 项 的 帮 助 上 下文 , 然 后 调 用 W INHELP.EXE 。 如 果 当 前 没 有 可 用 的 上 下 文 , 则 使 用 缺 省 的 上下 文 。

如 果 要 为 不 是 当 前 具 有 焦 点 的 窗 口 、 对 话 框 、 菜 单 项 或 工 具 条 按 钮 的 其 它 对 象设 置 上 下 文 , 则 应 重 载 这 个 成 员 函 数 。 使 用 所 需 的 帮 助 上 下 文 ID 来 调 用W inHelp 。

请 参 阅 C W inApp::OnContextHelp, CWinApp::OnHelpUsing, C W inApp::OnHelpIndex, C w in - App::WinHelp

afx_msg void OnHelpFinder( );

说 明

你 必 须 在 C W inApp 类 的 消 息 映 射 中 加 入 以 下 语 句 :

ON_COMMAND( ID_HELP_FINDER, OnHelpFinder )

以 允 许 这 个 成 员 函 数 。

如 果 允 许 这 个 成 员 函 数 , 当 应 用 程 序 的 用 户 选 择 了 Help Finder命 令 , 用 标 准 的

HELP_FINDER 主 题 激 活 了 W inHelp 时 , 框 架 就 调 用 这 个 消 息 处 理 函 数 。请 参 阅 C W inApp::OnHelp, CWinApp::OnHelpUsing, CWinApp::WinHelp, C W inApp::OnHelpIndex

C W inApp::OnHelpIndex

afx_msg void OnHelpIndex( );

说 明

你 必 须 在 C W inApp 类 的 消 息 映 射 中 加 入 以 下 语 句 :

ON_COMMAND( ID_HELP_ INDEX , OnHelp Index)

以 允 许 这 个 成 员 函 数 。

如 果 允 许 这 个 成 员 函 数 , 当 应 用 程 序 的 用 户 选 择 了 Help Index 命 令 , 用 标 准 的

HELP_ INDEX 主 题 激 活 了 W inHelp 时 , 框 架 就 调 用 这 个 消 息 处 理 函 数 。

请 参 阅 C W inApp::OnHelp, CWinApp::OnHelpUsing, CWinApp::WinHelp

C W inApp::OnHelp Using

afx_msg void OnHelpUsing( );

说 明

你 必 须 在 C W inApp 类 的 消 息 映 射 中 加 入 以 下 语 句 :

ON_COMMAND( ID_HELP_ USING , OnHelp Using )

以 允 许 这 个 成 员 函 数 。

如 果 允 许 这 个 成 员 函 数 , 当 应 用 程 序 的 用 户 选 择 了 Help Using 命 令 , 用 标 准 的

HELP_HELPONHELP 主 题 激 活 了 W inHelp 时 , 框 架 就 调 用 这 个 消 息 处 理 函 数 。

请 参 阅 C W inApp::OnHelp, CWinApp::OnHelpIndex , C W inApp::WinHelp

C W inApp::OnIdle

virtual BOOL OnIdle( LONG lCount );

返 回 值

如 果 要 接 收 更 多 的 空 闲 处 理 时 间 , 则 返 回 非 零 值 ; 如 果 不 需 要 更 多 的 空 闲 时 间则 返 回 0 。

参 数

lCount

该 参 数 是 一 个 计 数 值 , 当 应 用 程 序 的 消 息 队 列 为 空 , OnIdle 函 数 被 调 用时 , 该 计 数 值 就 增 加 1 。 每 当 一 条 新 消 息 被 处 理 时 , 该 计 数 值 就 被 复 位 为0 。 你 可 以 使 用 lCount 参 数 来 确 定 应 用 程 序 不 处 理 消 息 时 空 闲 时 间 的 相 对长 度 。

说 明

如 果 要 执 行 空 闲 时 处 理 , 则 重 载 这 个 成 员 函 数 。 当 应 用 程 序 的 消 息 队 列 为 空 时 , OnIdle 就 在 缺 省 的 消 息 循 环 中 被 调 用 。 你 可 以 用 重 载 函 数 来 调 用 自 己 的 后 台 空闲 处 理 任 务 。

OnIdle 应 返 回 0 以 表 明 不 需 要 更 多 的 空 闲 处 理 时 间 。当 消 息 队 列 为 空 时 , OnIdle

每 被 调 用 一 次 lCount 参 数 就 增 加 , 而 每 处 理 一 条 新 消 息 lCount 就 被 复 位 为 0 。你 可 以 根 据 这 个 计 数 值 调 用 不 同 的 空 闲 处 理 例 程 。

下 面 总 结 了 空 闲 循 环 处 理 :

  1. 如 果 微 软 基 础 类 库 中 的 消 息 循 环 检 查 消 息 队 列 并 发 现

    没 有 未 被 处 理 的 消息 , 它 就 为 应 用 程 序 对 象 调 用 OnIdle 函 数 , 并 将 lCount 参 数 设 为 0 。

  2. OnIdle 执 行 一 些 处 理 , 然 后 返 回 一 个 非 零 值 , 表 示 它

    还 需 要 被 调 用 , 以 进行 进 一 步 处 理 。

  3. 消 息 循 环 再 次 检 查 消 息 队 列 。 如 果 没 有 未 处 理 的 消 息

    , 则 再 次 调 用 OnIdle , 增 加 lCount 参 数 。

  4. 最 后 , OnIdle 结 束 所 有 的 空 闲 任 务 并 返 回 0 。 这 就 告 诉

    消 息 循 环 停 止 调 用OnIdle 直 到 在 消 息 队 列 中 接 收 到 下 一 条 消 息 为 止 , 在 那 时 , 空 闲 循 环 将 重新 启 动 , 而 参 数 被 设 为 0 。

因 为 只 有 在 OnIdle 返 回 之 后 应 用 程 序 才 能 处 理 用 户 输 入 , 因 此 在 OnIdle 中 不应 进 行 较 长 的 任 务 。

注 意 OnIdle 的 缺 省 实 现 更 新 命 令 用 户 接 口 对 象 , 如 菜 单 项 和 工 具 条 等 , 还 实 现 了 内 部 数 据 结 构 的 清 理 。 因 此 , 如 果 你 重 载 了 OnIdle , 你 必 须 用重 载 版 本 中 使 用 的 lCount 值 来 调 用 CWinApp::OnIdle 。 首 先 调 用 所 有 基类 的 空 闲 处 理 ( 即 直 到 基 类 的 OnIdle 返回 0 ) 。 如 果 你 需 要 在 基 类 处 理完 成 之 前 进 行 一 些 工 作 , 则 应 回 顾 基 类 的 实 现 以 在 自 己 的 工 作 期 间 选 择一 个 合 适 的 lCount 值 。

示 例

下 面 的 两 个 例 子 演 示 了 OnIdle 的 用 法 。 第 一 个 例 子 处 理 两 个 空 闲 任 务 , 用 lCount 参 数 来 排 列 这 些 任 务 的 优 先 权 。 第 一 个 任 务 优 先 权 较 高 , 一 旦 可 能 你 就 应 当 执行 此 任 务 。 第 二 个 任 务 不 十 分 重 要 , 只 有 当 用 户 输 入 有 一 个 较 长 时 间 的 间 歇 的时 候 才 应 执 行 此 任 务 。 注 意 其 中 对 基 类 的 OnIdle 的 调 用 。 第 二 个 例 子 管 理 着 一组 具 有 不 同 优 先 权 的 空 闲 任 务 。

BOOL CMyApp::OnIdle(LONG lCount)

{

BOOL bMore = CWinApp::OnIdle(lCount); if (lCount == 0)

{

TRACE("App idle for short period of time\n"); bMore = TRUE;

}

else if (lCount == 10)

{

TRACE("App idle for longer amount of time\n"); bMore = TRUE;

}

else if (lCount == 100)

{

TRACE("App idle for even longer amount of time\n"); bMore = TRUE;

}

else if (lCount == 1000)

{

TRACE("App idle for quite a long period of time\n");

// b M ore 没 有 被 设 为 TRUE, 不 在 需 要 空 闲

// 重 要 : bMore 没 有 被 设 为 FALSE , 因 为 C W inApp::OnIdle 可 能

// 还 有 其 它 空 闲 任 务 要 完 成 。

}

return bMore;

// 返回 TRUE , 只 要 还 有 其 它 空 闲 任 务

}

第 二 个 示 例

// 在 这 个 例 子 中 , 有 四 个 空 闲 循 环 任 务 , 它 们 被 赋 予

// 不 同 的 优 先 权 , 运 行 的 机 会 不 同 :

// Task1 在 空 闲 时 总 能 运 行 , 要 求 在 框 架 处 理 它 自 己

// 的 空 闲 循 环 任 务 时 没 有 消 息 在 等 候 。 ( lCount 为 0 或 1 )

// Task2 仅当 Task1 以 及 运 行 时 才 能 运 行 , 要 求 当 Task1

// 运 行 时 没 有 消 息 在 等 候 。

// Task3 和 Task4 仅 当 Task1 和 Task2 都 运 行 之 后 才 能 运 行 ,

// 并 且 在 此 期 间 没 有 消 息 在 等 候 。 如 果 Task3 能 够 运 行 ,

// 则 Task4 总 是 在 Task3 之 后 立 即 运 行 。

BOOL CMyApp::OnIdle(LONG lCount)

{

// 在 这 个 例 子 中 , 像 多 数 应 用 程 序 一 样 , 你 应 该 让 基 类

// 的 C W inApp::OnIdle 在 你 试 图 进 行 任 何 附 加 的 空 闲 循 环

// 过 程 之 前 完 成 它 的 处 理 。if (CWinApp::OnIdle(lCount)) return TRUE;

// 基 类 的 C W inApp::OnIdle 为 lCount 保 留 0 和 1 给 框 架 自 己 的

// 空 闲 处 理 使 用 。 如 果 你 希 望 与 框 架 平 等 地 共 享 空 闲 处 理

// 时 间 , 则 应 替 换 上 面 的 if 语 句 , 直 接 调 用 C W inApp::OnIdle ,

// 然 后 为 lCount 的值 0 和 /或 1 加 入 一 个 case 语 句 。 首 先 应 当 研

// 究 基 类 的 实 现 以 理 解 你 的 空 闲 循 环 任 务 将 会 如 何 与 框 架 的

// 空 闲 循 环 处 理 竞 争 。

switch (lCount)

{

case 2:

Task1();

return TRUE; // 下 一 次 给 Task2 一 个 机 会

case 3:

Task2();

return TRUE; // 下 一 次 给 Task3 和 Task4 一 个 机 会

case 4:

Task3();

Task4();

return FALSE; // 再 次 回 到 空 闲 循 环 任 务

}

return FALSE;

}

C W inApp::OpenDocumentFile

virtual CDocument* OpenDocumentFile( LPCTSTR lpszFileName );

返 回 值

如 果 成 功 , 则 返 回 指 向 CDocumen t对 象 的 指 针 ; 否 则 返 回 NULL 。

参 数

lpszFileName

要 打 开 的 文 件 的 名 字 。

说 明

框 架 调 用 这 个 成 员 函 数 为 应 用 程 序 打 开 指 定 名 字 的 CDocumen t文 件 。 如 果 具 有该 名 字 的 文 档 已 经 被 打 开 了 , 则 包 含 这 个 文 档 的 第 一 个 框 架 窗 口 将 被 激 活 。 如果 应 用 程 序 支 持 多 文 档 模 板 , 则 框 架 使 用 文 件 扩 展 名 查 找 适 当 的 文 档 模 板 , 试图 载 入 此 文 档 。 如 果 成 功 , 则 文 档 模 板 为 该 文 档 创 建 一 个 框 架 窗 口 和 视 。

示 例

BOOL CMyApp::InitInstance()

{

// ...

if (m_lpCmdLine[0] == '\0')

{

// 创 建 一 个 新 ( 空 的 ) 文 档

OnFileNew();

}

else

{

// 打 开 作 为 第 一 个 命 令 行 参 数 传 递 的 文 件

OpenDocumentFile(m_lpCmdLine);

}

// ...

}

C W inApp::ParseCommandLine

void ParseCommandLine( CCommandLineInfo& rCmdInfo );

参 数

rCmdInfo

对 CCommandLineInfo 对 象 的 引 用 。

说 明

调 用 这 个 函 数 以 解 析 命 令 行 并 将 参 数 发 送 到 CCommandLineInfo::ParseParam , 每 次 一 个 。

当 你 通 过 AppWizard 开 始 一 个 新 的 MFC 项 目 时 , AppWizard 将 会 创 建 一 个Ccommand- LineInfo 的 本 地 实 例 , 然 后 在 InitInstance 成 员 函 数 中 调 用ProcessShellCommand 和 ParseCommandLine 。 命 令 行 的 过 程 描 述 如 下 :

  1. 在 InitInstance 中 被 创 建 之 后 , CCommandLineInfo 对 象 被 传 递

ParseCommandLine 。

  1. 随 后 ParseCommandLine 反 复 调 用 CCommandLineInfo::ParseParam ,

    每 次解 析 出 一 个 参 数 。

  2. ParseParam 填充 CCommandLineInfo 对 象 , 随 后 该 对 象 被 传 递 给

ProcessShellCommand 。

  1. ProcessShellCommand 处 理 命 令 行 参 数 和 标 志 。

注 意 如 果 需 要 的 话 , 你 可 以 直 接 调 用 ParseCommandLine 。

有 关 命 令 行 标 志 的 描 述 参 见 CCommandLineInfo::m_nShellCommand 。

请 参 阅 CCommandLineInfo, CWinApp::InitInstance, CCommandLineInfo::ParseParam,CWinApp::ProcessShellCommand, CCommandLineInfo::m_nShellCommand

C W inApp::PreTranslateMessage

virtual BOOL PreTranslateMessage( MSG* pMsg );

返 回 值

如 果 消 息 在 PreTranslate M essage 中 被 完 全 处 理 并 且 不 需 要 进 一 步 处 理 , 则 返 回非 零 值 。 如 果 消 息 还 需 要 按 照 通 常 方 式 处 理 , 则 返 回 零 。

参 数

pMsg

指 向 一 个 MSG 结 构 的 指 针 , 其 中 包 含 了 要 处 理 的 消 息 。

如 果 要 在 消 息 被 分 派 到 W indows 函 数 TranslateMessage和 DispatchMessage 之 前 过滤 窗 口 消 息 , 则 应 重 载 这 个 函 数 。 缺 省 的 实 现 执 行 加 速 键 的 转 换 , 因 此 你 可 以在 重 载 函 数 中 调 用 CWinApp::PreTranslateMessage成 员 函 数 。

请 参 阅 ::D ispatch M essage, ::TranslateMessage

C W inApp::ProcessMessageFilter

virtual BOOL ProcessMessageFilter( int code , LPMSG lpMsg );

返 回 值

如 果 消 息 被 处 理 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

参 数

code

指 定 了 钩 子 代 码 。 这 个 成 员 函 数 使 用 这 些 代 码 以 确 定 如 何 处 理 lpMsg

lpMsg

指 向 一 个 W indow s的 MSG 结 构 的 指 针 。

框 架 的 钩 子 函 数 调 用 这 个 成 员 函 数 以 过 滤 和 响 应 特 定 的 W indow s消 息 。 钩 子 函数 在 事 件 被 发 送 到 应 用 程 序 的 正 常 消 息 处 理 过 程 之 前 处 理 这 些 事 件 。

如 果 你 重 载 了 这 个 高 级 特 性 , 确 保 你 调 用 了 基 类 版 本 以 维 护 框 架 的 钩 子 处 理 。

请 参 阅 MessageProc, WH_MSGFILTER

C W inApp::ProcessShellCommand

BOOL ProcessShellCommand( CCommandLineInfo& rCmdInfo );

返 回 值

如 果 成 功 地 处 理 了 外 壳 命 令 , 则 返 回 非 零 值 。 如 果 InitInstance 返 回 了 FALSE , 则 返 回 0 。

参 数

rCmdInfo

对 CCommandLineInfo 对 象 的 引 用 。

这 个 成 员 函 数 被 InitInstance 调 用 , 用 以 接 收 rCmdInfo 所 标 识 的

CCommandLineInfo 对 象 传 递 的 参 数 , 并 执 行 指 定 的 动 作 。

当 你 通 过 AppWizard 开 始 一 个 MFC 的 新 项 目 时 , AppWizard 将 创 建CCommandLineInfo 的 一 个 本 地 实 例 , 然 后 在 InitInstance 成 员 函 数 中 调 用ProcessShellCommand 和 ParseCommandLine 。 命 令 行 按 照 下 面 描 述 的 路 线 传 递 :

  1. 在 InitInstance 中 被 创 建 以 后 , CCommandLineInfo 对 象 将 它 传

    递 给

ParseCommand-Line 。

  1. 随 后 ParseCommandLine 反 复 调 用 CCommandLineInfo::ParseParam ,

    每 次解 析 一 个 参 数 。

  2. ParseParam 填 充 CCommandLineInfo 对 象 , 然 后 将 之 传 递 给

ProcessShellCommand 。

  1. ProcessShellCommand 处 理 命 令 行 参 数 和 标 志 。

CCommandLineInfo 对 象 中 用 CCommandLineInfo::m_nShellCommand 标 识 的 数据 成 员 属 于 下 面 的 枚 举 类 型 , 它 在 CCommandLineInfo 类 中 定 义 。

enum{ FileNew, FileOpen, FilePrint, FilePrintTo, FileDDE,

};

有 关 这 些 值 的 简 要 描 述 参 见 CCommandLineInfo::m_nShellCommand 。

请 参 阅 CWinApp::ParseCommandLine, CCommandLineInfo, CCommandLineInfo::ParseParam, CCommandLineInfo::m_nShellCommand

C W inApp::Process W ndProcException

virtual LRESULT Process W ndProcException( CException* e , const MSG* pMsg );

返 回 值

这 个 返 回 值 必 须 返 回 给 W indows 。 通 常 , 对 于 W indows 消 息 , 返 回 值 为 0L , 对于 命 令 消 息 , 返 回 值 为 1L ( TRUE )。

参 数

e

指 向 没 有 被 捕 获 的 异 常 。

pMsg

一 个 MSG 结 构 , 其 中 包 含 了 有 关 导 致 框 架 出 现 异 常 的 W indow s消 息 的 信 息 。

说 明

每 当 应 用 程 序 不 能 捕 获 应 用 程 序 的 消 息 处 理 函 数 或 命 令 处 理 函 数 出 现 的 异 常时 , 框 架 就 调 用 这 个 成 员 函 数 。

不 要 直 接 调 用 这 个 函 数 。

这 个 成 员 函 数 的 缺 省 实 现 创 建 一 个 消 息 框 。 如 果 这 个 未 被 捕 获 的 异 常 源 于 一 条菜 单 、 工 具 条 或 加 速 键 命 令 失 败 , 则 消 息 框 显 示 一 条 “ Command failed ” 消 息 ; 否 则 , 显 示 一 条 “ Internal application error” 消 息 。

如 果 要 为 异 常 提 供 全 局 处 理 , 则 应 重 载 这 个 成 员 函 数 。 若 你 需 要 显 示 该 消 息 框 , 则 应 调 用 基 类 的 函 数 。

请 参 阅 CWnd::WindowProc, CException

C W inApp::RegisterShellFileTypes

void RegisterShellFileTypes( BOOL bCompat = FALSE );

参 数

bCompat

如 果 为 TRUE , 则 为 外 壳 命 令 Print和 Print To加 入 注 册 表 入 口 , 使 用 户 能够 从 外 壳 直 接 打 印 文 件 , 或 者 是 将 文 件 拖 动 到 打 印 机 对 象 上 。 同 时 它 也

加 入 一 个 DefaultIcon 键 。 缺 省 情 况 下 , 为 了 向 后 的 兼 容 性 , 这 个 参 数 为

FALSE 。

说 明

调 用 这 个 函 数 在 W indow s的 文 件 管 理 器 中 注 册 应 用 程 序 的 所 有 文 档 类 型 。 这 就使 用 户 能 够 通 过 在 文 件 管 理 器 内 双 击 而 打 开 应 用 程 序 创 建 的 数 据 文 件 。 对 于 应用 程 序 中 的 每 个 文 档 模 板 , 在 调 用 AddDocTemplate 之 后 调 用RegisterShellFileTypes 。 当 你 调 用 RegisterShellFile- Types 的 时 候 , 同 时 也 调 用EnableShellOpen成 员 函 数 。

RegisterShellFileTypes 在 应 用 程 序 维 护 的 CDocTemplate 对 象 列 表 中 反 复 ,并 且 , 对 于 每 个 文 档 模 板 , 在 W indows 维 护 的 注 册 表 数 据 库 中 加 入 入 口 。 当 用 户 双 击文 件 的 时 候 , 文 件 管 理 器 利 用 这 个 入 口 打 开 数 据 文 件 。 这 减 小 了 随 应 用 程 序 发放 .REG 文 件 的 必 要 性 。

如 果 注 册 表 数 据 库 中 已 经 将 指 定 的 文 件 扩 展 名 与 其 它 文 件 类 型 相 关 联 了 , 则 不会 创 建 新 的 关 联 。 有 关 注 册 信 息 时 所 用 的 字 符 串 格 式 , 请 参 见 CDocTemplate 类 。

请 参 阅 CDocTemplate, CWinApp::EnableShellOpen, C W inApp::AddDocTemplate

virtual int Run( );

返 回 值

W in M ain 返 回 的 整 数 值 。

说 明

这 个 函 数 提 供 了 缺 省 的 消 息 循 环 。 Run 函 数 接 收 并 分 派 W indow s消 息 , 直 到 应用 程 序 接 收 到 一 个 W M _QUIT 消 息 。 如 果 应 用 程 序 的 消 息 队 列 当 前 不 包 含 任 何消 息 , Run 就 调 用 OnIdle 以 执 行 空 闲 时 处 理 。 接 收 到 的 消 息 先 进 入PreTranslate M essage 成 员 函 数 以 进 行 特 殊 处 理 , 然 后 发 送 到 W indows 函 数TranslateMessage , 进 行 标 志 的 键 盘 转 换 , 最 后 , 调 用 W indows 函 数D ispatch M essage。

Run 很 少 被 重 载 , 但 是 你 也 可 以 重 载 它 以 提 供 特 殊 的 功 能 。

请 参 阅

C W inApp::PreTranslateMessage,

M_QUIT, ::DispatchMessage, ::TranslateMessage

BOOL RunAutomated( );

返 回 值

如 果 找 到 了 该 选 项 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

说 明

调 用 这 个 函 数 以 确 定 是 否 出 现 了 “ /Automation ” 或 “ -Automation ” 选 项 , 这 表明 服 务 器 程 序 是 否 是 由 客 户 应 用 程 序 启 动 的 。 如 果 有 , 则 从 命 令 行 中 清 除 这 个选 项 。 有 关 OLE 自 动 化 的 更 多 信 息 , 参 见 “ V isual C++ 程 序 员 指 南 ” 中 的 “ 自动 化 服 务 器 ” 。

请 参 阅 C W inApp::RunEmbedded

C W inApp::RunEmbedded

BOOL RunEmbedded( );

返 回 值

如 果 发 现 了 这 个 选 项 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

说 明

调 用 这 个 选 项 以 确 定 是 否 出 现 了 “ /Embedding ” 或 “ -Embedding ” 选 项 , 这 表明 服 务 器 应 用 程 序 是 否 是 由 客 户 应 用 程 序 启 动 的 。 如 果 有 , 则 从 命 令 行 中 清 除这 个 选 项 。 有 关 嵌 入 的 更 多 信 息 , 参 见 “ V isual C++ 程 序 员 指 南 ” 中 的 “ 服 务器 : 实 现 服 务 器 ” 。

请 参 阅 C W inApp::RunAutomated

C W inApp::SaveAllModified

virtual BOOL SaveAllModified( );

返 回 值

如 果 能 够 安 全 地 结 束 应 用 程 序 , 则 返 回 非 零 值 ; 如 果 不 安 全 , 则 返 回 0 。

说 明

当 应 用 程 序 的 主 框 架 窗 口 要 被 关 闭 时 , 或 者 接 收 到 WM_QUERYENDSESSION

消 息 时 , 框 架 调 用 这 个 函 数 以 保 存 所 有 的 文 档 。

这 个 成 员 函 数 的 缺 省 实 现 为 应 用 程 序 中 所 有 被 修 改 的 文 档 调 用

CDocument::SaveModified 成 员 函 数 。

void SelectPrinter( HANDLE hDevNames , HANDLE hDevMode , BOOL bFreeOld = TRUE );

参 数

hDevNames

指 向 DEVNAMES 结 构 的 句 柄 , 标 识 了 指 定 打 印 机 的 驱 动 程 序 、 设 备 和 输 出端 口 名 。

hDevMode

指 向 D E V M O D E 结 构 的 句 柄 , 指 定 了 有 关 设 备 初 始 化 和 打 印 机 环 境 的 信 息 。

bFreeOld

释 放 以 前 选 择 的 打 印 机 。

说 明

调 用 这 个 成 员 函 数 以 选 择 指 定 的 打 印 机 , 并 释 放 先 前 在 Prin t对 话 框 中 选 择 的 打印 机 。

如 果 hDevMode 和 hDevNames 都 是 NULL , 则 SelectPrinter 使 用 当 前 的 缺 省 打 印机 。

请 参 阅 CPrintDialog, DEVMODE , DEVNAMES

void SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF

clrCtlText = RGB(0, 0, 0) );

参 数

clrCtlBk

应 用 程 序 的 对 话 框 的 背 景 颜 色 。

clrCtlText

应 用 程 序 的 对 话 框 控 件 的 颜 色 。

说 明

在 InitInstance 成 员 函 数 内 调 用 这 个 成 员 函 数 以 设 置 应 用 程 序 中 对 话 框 和 消 息 框的 缺 省 背 景 色 和 文 本 颜 色 。

示 例

BOOL CMyApp::InitInstance()

{

// 标 准 的 初 始 化

SetDialogBkColor(); // 将 对 话 框 背 景 颜 色 设 为 灰

LoadStdProfileSettings(); // 载 入 标 准 的 INI 文 件 选 项 ( 包 括 MRU )

// ...

}

C W inApp::SetRegistryKey

void SetRegistryKey( LPCTSTR lpszRegistryKey ); void SetRegistryKey( UINT nIDRegistryKey );

参 数

lpszRegistryKey

字 符 串 指 针 , 包 含 了 键 的 名 字 。

nIDRegistryKey

注 册 表 中 键 的 ID /索 引 。

说 明

这 个 函 数 将 应 用 程 序 的 设 置 保 存 在 注 册 表 而 不 是 INI 文 件 中 。 这 个 函 数 设 置m_pszRegistry Key , 它 被 C W inApp 的 成 员 函 数 GetProfileInt, GetProfileString , W riteProfileIn t和 W riteProfileString 使 用 。如 果 调 用 了 这 个 函 数 ,最 近 使 用( MRU ) 的 文 件 也 被 保 存 到 注 册 表 中 。 通 常 注 册 表 的 键 为 公 司 的 名 字 。 它 保 存 在 如 下 形式 的 键 中 :

HKEY_CURRENT_USER\Software\<company name>\<application name>\<section name>\<value name>.

请 参 阅

C W inApp::InitInstance, CWinApp::GetProfileInt, CWinApp::GetProfileString, C W inApp::WriteProfileInt, CWinApp::WriteProfileString

C W inApp:: W inHelp

virtual void WinHelp( DWORD dwData , UINT nCmd = HELP_CONTEXT );

参 数

dwData

指 定 了 附 加 数 据 。 这 些 值 依 赖 于 nCm d 参 数 的 值 。

nCmd

指 定 了 请 求 的 帮 助 类 型 。 可 能 取 值 的 列 表 以 及 它 们 影 响 dwData 参 数 的 方式 参 见 W indow s函 数 W inHelp 。

说 明

调 用 这 个 函 数 以 激 活 W inHelp 应 用 程 序 。 框 架 也 会 调 用 这 个 函 数 以 激 活 W inHelp

应 用 程 序 。

当 你 的 应 用 程 序 终 止 时 , 框 架 会 自 动 关 闭 W inHelp 应 用 程 序 。

示 例

// 头 文 件 : HELPIDS.H

//

// 这 个 例 子 的 头 文 件 被 包 含 了 两 次 :

// (1) 它 被 .CPP 文 件 包 含 , 将 D W O R D 类 型 的 上 下

// 文 ID 传 递 给 CWinApp::WinHelp 。

// (2) 它 被 包 含 在 .HPJ 文 件 中 的 [MAP] 部 分 , 将 帮

// 助 上 下 文 字 符 串 “ HID_MYTOPIC ” 与 帮 助 上 下

// 文 ID101 关 联 起 来 。

// 帮 助 上 下 文 字 符 串 “ HID_MYTOPIC ” 标 识 了 帮 助

// 的 .RTF 源 文 件 中 的 帮 助 主 题 , 带 有 “ # ” 脚 注 :

// # HID_MYTOPIC

//

// 没 有 必 要 用 这 种 方 式 管 理 在 RESOURCE.H 文 件 中 定 义

// 的 与 命 令 对 象 或 用 户 界 面 对 象 相 关 的 帮 助 主 题 的 帮 助

// 上 下 文 ID 。 你 可 以 使 用 M A K E H M 工 具 , 或 者 是

//AppWizard 的 上 下 文 帮 助 选 项 所 生 成 的 MAKEHELP.BAT

// 文 件 来 为 这 些 ID 生 成 帮 助 映 射 ( .HM ) 文 件 。 仅 对 那 些

// 不 与 命 令 对 象 或 用 户 界 面 对 象 相 关 的 帮 助 主 题 才 有 必 要

// 按 照 这 里 演 示 的 方 式 管 理 帮 助 上 下 文 ID 。#define HID_MYTOPIC 101

// 显 示 了 在 帮 助 的 .RTF 文 件 中 具 有 上 下 文 字 符 串

// “ HID_MYTOPIC ” 的 自 定 义 帮 助 主 题 , 它 被 映

// 射到 HELPIDS.H 文 件 中 的 DWORD 型 ID 值 HID_MYTOPIC 。AfxGetApp()->WinHelp(HID_MYTOPIC);

// 下 面 是 M A K E H M 工 具 生 成 的 帮 助 映 射 ( .HM ) 文 件

// 中 的 一 行 代 码 , 随 后 它 被 AppWizard 的 上 下 文 帮 助

// 选 项 所 生 成 的 MAKEHELP.BAT 文 件 所 调 用 。

// MAKETM 工 具 读 出 应 用 程 序 的 RESOURCE.H 文 件 中

// 的 #define 语 句 :

// #define ID_MYCOMMAND 0x08004

// 然 后 加 上 一 个 帮 助 ID 的 偏 移 量 0x10000 以 创 建 帮 助 上

// 下 文 的 DWORD 值 0x18004 。 有 关 帮 助 ID 偏 移 量 的 更

// 多 信 息 参 见 MFC 的 技 术 注 释 28 。

HID_MYCOMMAND 0x18004

// 你 很 少 需 要 利 用 帮 助 上 下 文 ID 为 命 令 或 用 户 界 面 对 象

// 直 接 调 用 W inHelp 。 例 如 , 当 焦 点 位 于 My Command 菜

// 单 项 上 时 , 如 果 用 户 按 下 F1 键 , 框 架 就 会 自 动 调 用 W inHelp 。

// 但 是 , 如 果 你 想 要 为 与 命 令 相 关 的 帮 助 主 题 直 接 调 用 W inHelp ,

// 下 面 是 调 用 的 方 法 :

AfxGetApp()->WinHelp(0x10000 + ID_MYCOMMAND);

请 参 阅 C W inApp::OnContextHelp, CWinApp::OnHelpUsing, C W inApp::OnHelp, CWinApp::OnHelpIndex, ::WinHelp

C W inApp:: W riteProfileInt

BOOL WriteProfileInt( LPCTSTR lpszSection , LPCTSTR lpszEntry , int nValue );

返 回 值

如 果 成 功 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

参 数

lpszSection

指 向 一 个 以 null结 尾 的 字 符 串 , 指 定 了 包 含 入 口 的 部 分 。 如 果 这 个 部 分 不存 在 , 就 创 建 它 。 这 个 部 分 的 名 字 对 大 小 写 不 敏 感 , 字 符 串 可 以 是 大 写字 符 和 小 写 字 符 的 任 意 组 合 。

lpszEntry

指 向 一 个 以 null结 尾 的 字 符 串 , 指 定 了 包 含 要 写 入 值 的 入 口 的 部 分 。 如 果在 指 定 的 部 分 中 不 存 在 这 个 入 口 , 就 创 建 它 。

nValue

包 含 了 要 写 入 的 值 。

说 明

调 用 这 个 成 员 函 数 以 把 指 定 的 值 写 入 应 用 程 序 的 注 册 表 或 IN I文 件 的 指 定 部 分 。这 些 入 口 按 如 下 方 式 保 存 :

  • 在 W indows NT 中 , 该 值 被 保 存 在 注 册 表 中 。

  • 在 W indows 3.X 中 , 该 值 被 保 存 在 W IN .IN I文 件 中 。

  • 在 W indows 95 中 , 该 值 被 保 存 在 W IN.IN I的 缓 存 版 本 中 。

示 例

CString strSection = " M y Section"; CString strStringItem = " My String Item"; CString strIntItem = " My Int Item";

C W inApp* pApp = AfxGetApp();

pApp->WriteProfileString(strSection, strStringItem, "test"); CString strValue;

strValue = pApp->GetProfileString(strSection, strStringItem);

ASSERT(strValue == "test");

pApp->WriteProfileInt(strSection, strIntItem, 1234); int nValue;

nValue = pApp->GetProfileInt(strSection, strIntItem, 0); ASSERT(nValue == 1234);

请 参 阅 C W inApp::GetProfileInt, CWinApp::WriteProfileString

C W inApp:: W riteProfileString

BOOL WriteProfileString( LPCTSTR lpszSection , LPCTSTR lpszEntry , LPCTSTR

lpszValue );

返 回 值

如 果 成 功 , 则 返 回 非 零 值 ; 否 则 返 回 0 。

参 数

lpszSection

指 向 一 个 以 null结 尾 的 字 符 串 , 指 定 了 包 含 入 口 的 部 分 。 如 果 这 个 部 分 不存 在 , 就 创 建 它 。 这 个 部 分 的 名 字 对 大 小 写 不 敏 感 , 字 符 串 可 以 是 大 写字 符 和 小 写 字 符 的 任 意 组 合 。

lpszEntry

指 向 一 个 以 null结 尾 的 字 符 串 , 指 定 了 包 含 要 写 入 值 的 入 口 的 部 分 。 如 果在 指 定 的 部 分 中 不 存 在 这 个 入 口 , 就 创 建 它 。

lpszValue

指 向 要 写 入 的 字 符 串 。如 果 这 个 参 数 为 NULL ,则 将 删 除 lpszEntry 指 定 的 键 。

说 明

调 用 这 个 函 数 将 指 定 的 字 符 串 写 入 应 用 程 序 的 注 册 表 或 IN I文 件 的 指 定 部 分 。这 些 入 口 按 如 下 方 式 保 存 :

  • 在 W indows NT 中 , 该 值 被 保 存 在 注 册 表 中 。

  • 在 W indows 3. x 中 , 该 值 被 保 存 在 W IN.IN I文 件 中 。

  • 在 W indows 95 中 , 该 值 被 保 存 在 W IN.IN I的 缓 存 版 本 中 。

示 例

CString strSection = " M y Section"; CString strStringItem = " My String Item"; CString strIntItem = " My Int Item";

C W inApp* pApp = AfxGetApp();

pApp->WriteProfileString(strSection, strStringItem, "test"); CString strValue;

strValue = pApp->GetProfileString(strSection, strStringItem); ASSERT(strValue == "test");

pApp->WriteProfileInt(strSection, strIntItem, 1234);

int nValue;

nValue = pApp->GetProfileInt(strSection, strIntItem, 0); ASSERT(nValue == 1234);

请 参 阅 C W inApp::GetProfileString,

C W inApp::WriteProfileInt, :: W ritePrivateProfileStringC W inApp::SetRegistryKey

数 据 成 员

C W inApp::m_bHelpMode

说 明

如 果 应 用 程 序 处 于 帮 助 上 下 文 模 式 ( 通 常 由 SHIFT+F1 激 活 ) , 则 为 TRUE , 否则 为 FALSE 。 在 帮 助 上 下 文 模 式 中 , 光 标 变 为 问 号 , 用 户 可 以 在 屏 幕 上 移 动 它 。如 果 你 希 望 在 帮 助 模 式 下 实 现 特 殊 处 理 , 则 检 查 这 个 标 志 。 m_bHelpMode 是BOOL 类 型 的 公 有 变 量 。

C W inApp::m_hInstance

说 明

对 应 W indow s传 递 给 W in M ain 的 hInstance 参 数 。 m_hInstance 数 据 成 员 是 指 向 运行 在 W indows 环 境 中 的 应 用 程 序 当 前 实 例 的 句 柄 。 它 是 由 全 局 函 数AfxGetInstanceHandle 返 回 的 。 m_hInstance 是 HINSTANCE 类 型 的 公 有 变 量 。

示 例

// 通 常 你 不 用 直 接 把 应 用 程 序 的 hInstance 传 递 给

// W indows 的 API , 因 为 等 效 的 MFC 成 员 函 数 传 递

// 了 hInstance。 下 面 的 例 子 不 太 典 型 。

HCURSOR hCursor;

hCursor = ::LoadCursor(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_MYCURSOR));

// 获 得 应 用 程 序 的 hInstance 的 更 直 接 的 方 式 是 调 用 AfxGetInstanceHandle :

hCursor = ::LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_MYCURSOR));

// 如 果 你 在 载 入 资 源 的 时 候 需 要 hInstance , 最 好

// 调用 AfxGetResourceHandle , 而 不 是 AfxGetInstanceHandle 。hCursor = ::LoadCursor(AfxGetResourceHandle(),

MAKEINTRESOURCE(IDC_MYCURSOR));

// 载 入 光 标 资 源 的 更 好 方 式 是 调 用 C W inApp::LoadCursor hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR);

C W inApp::m_hPrevInstance

说 明

对 应 于 W indow s传 递 给 W in M ain 的 hPrevInstance 参 数 。

在 W in32 应 用 程 序 中 , m_hPrevInstance 数 据 成 员 总 是 被 设 为 NULL 。 如 果 要 找 到应 用 程 序 的 先 前 实 例 , 则 应 使 用 CWnd::FindWindow 。

C W inApp::m_lpCmdLine

说 明

对 应 于 W indows 传 递 给 W inMain 的 lpCmdLine 参 数 。 指 向 一 个 以 null 结 尾 的 字 符串 , 指 定 了 应 用 程 序 的 命 令 行 。 用 m_lpCmdLine 可 以 访 问 当 应 用 程 序 启 动 时 用户 输 入 的 命 令 行 参 数 。 m_lpCmdLine 是 LPSTR 类 型 的 公 有 变 量 。

示 例

BOOL CMyApp::InitInstance()

{

// ...

if (m_lpCmdLine[0] == '\0')

{

// 创 建 一 个 新 ( 空 的 ) 文 档

OnFileNew();

}

else

{

// 打 开 作 为 第 一 个 命 令 行 参 数 传 递 的 文 件

OpenDocumentFile(m_lpCmdLine);

}

// ...

}

C W inApp::m_nCmdShow

说 明

对 应 于 W indow s传 递 给 W in M ain 的 nCmdShow 参 数 。 当 你 为 应 用 程 序 的 主 窗 口 调用 CWnd::ShowWindow 函 数 的 时 候 , 可 以 将 m_nCmdShow 作 为 参 数 传 递 。

m_nCmdShow 是 in t类 型 的 公 有 变 量 。

示 例

BOOL CMyApp::InitInstance()

{

// ...

// 创建 M D I 主 框 架 窗 口

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE;

// 保 存 主 框 架 窗 口 的 指 针 。 这 是 框 架 识 别 主 框 架 窗 口 的 唯 一 途 径 。

m_pMainWnd = pMainFrame;

// 根据 nCmdShow 参 数 显 示 主 窗 口 , 这 个 参 数 是 当 应 用

// 程 序 第 一 次 启 动 的 时 候 传 递 给 它 的 。pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow();

// ...

}

C W inApp::m_pActive W nd

说 明

利 用 这 个 数 据 成 员 来 保 存 OLE 容 器 应 用 程 序 的 主 窗 口 指 针 , 它 使 你 的 OLE 服 务器 应 用 程 序 能 够 现 场 激 活 。 如 果 这 个 数 据 成 员 为 NULL , 则 应 用 程 序 不 能 被 现场 激 活 。

当 框 架 窗 口 被 OLE 容 器 应 用 程 序 现 场 激 活 时 , 框 架 就 设 置 这 个 成 员 变 量 。

请 参 阅 AfxGetMainWnd, C W inThread::m_pMainWnd

C W inApp::m_pszAppName

说 明

指 定 应 用 程 序 的 名 字 。 应 用 程 序 可 以 从 传 递 给 C W inApp 的 构 造 函 数 的 参 数 中 得到 , 如 果 其 中 没 有 指 定 名 字 , 则 是 ID 为 AFX_IDS_APP_TITLE 的 资 源 字 符 串 。如 果 在 资 源 中 找 不 到 应 用 程 序 的 名 字 , 那 么 它 来 自 程 序 的 可 执 行 文 件 名 。

全 局 函 数 AfxGetAppNam e返 回 该 值 。 m_pszAppNam e是 const char* 类 型 的 公 有变 量 。

注 意 如 果 你 为 m_pszAppName 分 配 了 一 个 值 , 它 必 须 是 在 堆 中 动 态 分 配

的 。 CWinApp 的 析 构 函 数 利 用 这 个 指 针 调 用 free( ) 。 你 可 以 使 用 运 行 库函 数 _tcsdup( ) 来 分 配 内 存 。 同 时 , 在 为 它 分 配 一 个 新 值 之 前 , 先 释 放与 当 前 指 针 相 关 的 内 存 。 例 如 :

// 首 先 释 放 在 CWinApp 启 动 的 时 候 MFC 分 配 的 字 符 串

// 字 符 串 是 在 调 用 InitInstance 之 前 分 配 的free((void*)m_pszAppName);

// 改 变 应 用 程 序 文 件 的 名 字

// CWinApp 的 析 构 函 数 将 释 放 内 存m_pszAppName=_tcsdup(_T("d:\\somedir\\myapp.exe"));

示 例

CWnd* pWnd;

// 将 pWnd 设 为 某 个 CWnd 对 象 的 指 针 , 它 的 窗 口 已 经 创 建 了 。

// 后 面 对 CWnd::MessageBox 的 调 用 使 用 应 用

// 程 序 的 名 字 作 为 消 息 框 的 标 题 。

pWnd->MessageBox("Some message", AfxGetApp()->m_pszAppName);

// 获 得 应 用 程 序 名 字 的 更 直 接 的 方 式 是 调 用 AfxGetAppName pWnd->MessageBox("Some message", AfxGetAppName());

// 用 应 用 程 序 的 名 字 作 为 消 息 框 标 题 来 显 示 消 息 框

// 的 更 简 单 的 方 式 是 调 用 AfxMessageBox 。AfxMessageBox("Some message");

说 明

该 变 量 包 含 了 应 用 程 序 的 可 执 行 文 件 名 , 不 包 括 扩 展 名 。 与 m_pszAppNam e不同 , 这 个 名 字 中 不 包 含 空 白 。 m_pszExeNam e是 const char* 类 型 的 公 有 变 量 。

注 意 如 果 你 为 m_pszExeName 分 配 了 一 个 值 , 它 必 须 是 在 堆 中 动 态 分 配的 。 CWinApp 的 析 构 函 数 利 用 这 个 指 针 调 用 free( ) 。 你 可 以 使 用 运 行 库函 数 _tcsDup( ) 来 分 配 内 存 。 同 时 , 在 为 它 分 配 一 个 新 值 之 前 , 先 释 放与 当 前 指 针 相 关 的 内 存 。 例 如 :

// 首 先 释 放 在 CWinApp 启 动 的 时 候 MFC 分 配 的 字 符 串

// 字 符 串 是 在 调 用 InitInstance 之 前 分 配 的free((void*)m_psz Exe Name);

// 改 变 .EXE 文 件 的 名 字

// CWinApp 的 析 构 函 数 将 释 放 内 存m_pszExeName=_tcsdup(_T("d:\\somedir\\myapp"));

说 明

包 含 了 应 用 程 序 的 帮 助 文 件 的 路 径 。 在 缺 省 情 况 下 , 框 架 将 m_pszHelpFilePath 初 始 化 为 应 用 程 序 的 名 字 , 并 加 上 “ .HLP ” 。 如 果 要 改 变 帮 助 文 件 的 名 字 , 则应 将 m_pszHelpFilePath 设 为 包 含 所 需 的 帮 助 文 件 的 完 整 名 字 的 字 符 串 。 完 成 这个 操 作 的 合 适 的 位 置 是 在 应 用 程 序 的 InitInstance 函 数 中 。 m_pszHelpFilePath 是const char* 类 型 的 公 有 变 量 。

注意 如 果 你 为 m_pszHelpFilePath 分 配 了 一 个 值 , 它 必 须 是 在 堆 中 动态 分 配 的 。 CWinApp 的 析 构 函 数 利 用 这 个 指 针 调 用 free( ) 。 你 可 以 使 用运 行 库 函 数 _tcsDup( ) 来 分 配 内 存 。 同 时 , 在 为 它 分 配 一 个 新 值 之 前 , 先 释 放 与 当 前 指 针 相 关 的 内 存 。 例 如 :

// 首 先 释 放 在 CWinApp 启 动 的 时 候 MFC 分 配 的 字 符 串

// 字 符 串 是 在 调 用 InitInstance 之 前 分 配 的free((void*)m_psz HelpFilePath );

// 改 变 .HLP 文 件 的 名 字

// CWinApp 的 析 构 函 数 将 释 放 内 存

m_psz HelpFilePath =_tcsdup(_T("d:\\somedir\\myapp .hlp "));

说 明

包 含 了 应 用 程 序 的 .INI文 件 的 名 字 。 m_pszProfileNam e是 const char* 类 型 的 公有 变 量 。

注 意 如 果 你 为 m_pszProfileName 分 配 了 一 个 值 , 它 必 须 是 在 堆 中 动 态分 配 的 。 CWinApp 的 析 构 函 数 利 用 这 个 指 针 调 用 free( ) 。 你 可 以 使 用 运行 库 函 数 _tcsDup( ) 来 分 配 内 存 。 同 时 , 在 为 它 分 配 一 个 新 值 之 前 , 先释 放 与 当 前 指 针 相 关 的 内 存 。 例 如 :

// 首 先 释 放 在 CWinApp 启 动 的 时 候 MFC 分 配 的 字 符 串

// 字 符 串 是 在 调 用 InitInstance 之 前 分 配 的free((void*)m_psz ProfileName );

// 改 变 .INI 文 件 的 名 字

// CWinApp 的 析 构 函 数 将 释 放 内 存

m_psz ProfileName =_tcsdup(_T("d:\\somedir\\myini .ini "));

请 参 阅 C W inApp::GetProfileString, C W inApp::GetRofileInt, C W inApp::WriteProfileInt, C W inApp::WriteProfileString 。

LPCTSTR m_pszRegistryKey;

说 明

用 于 确 定 应 用 程 序 的 配 置 信 息 保 存 在 注 册 表 或 IN I文 件 的 什 么 位 置 。 通 常 , 这 个数 据 成 员 被 当 作 是 只 读 的 。

注 册 表 入 口 按 如 下 方 式 保 存 :

  • 在 W indows NT 中 , 该 值 被 保 存 在 注 册 表 中 。 应 用 程 序 配

    置 的 名 字 被 加 在下 述 注 册 表 键 的 后 面 : HKEY_CURRENT_USER/SoftWare/LocalAppWizard-Generated/

  • 在 W indows 3. x 中 , 该 值 被 保 存 在 IN I文 件 中 。

  • 在 W indows 95 中 , 该 值 被 保 存 在 IN I文 件 的 缓 存 版 本 。

如 果 你 为 m_pszRegistryKey 分 配 了 一 个 值 , 它 必 须 是 在 堆 中 动 态 分 配 的 。C W inApp 的 析 构 函 数 利 用 这 个 指 针 调 用 free( ) 。你 可 以 使 用 运 行 库 函 数 _tcsDup( ) 来 分 配 内 存 。 同 时 , 在 为 它 分 配 一 个 新 值 之 前 , 先 释 放 与 当 前 指 针 相 关 的 内 存 。例 如 :

// 首 先 释 放 在 C W inApp 启 动 的 时 候 MFC 分 配 的 字 符 串

// 字 符 串 是 在 调 用 InitInstance 之 前 分 配 的

free((void*)m_psz RegistryKey);

// 改 变 注 册 表 键 的 名 字

// C W inApp 的 析 构 函 数 将 释 放 内 存

m_pszRegistryKey=_tcsdup(_T (“ HKEY_CURRENT_USER\\SoftWare\\mycompan y\\
myapp\\thissection\\this - value” ));

请 参 阅 C W inApp::SetRegistryKey