在 视 中 的 oninitialupdate 函 数 中 调 用 getparentframe 函 数。getparentframe 会 返 回 一 指 向 一 保 存 有 该 视 的 框 架 窗 口 的 指 针。然 后 调 用 在 框 架 窗 口 上 调 用 movewindow。
(78) 在我的程序的某些部分,我可以调用 messagebox 函数来建立一个信息对话框,例如在视类中。但是,在其它部分我却不能,如文档类中。为什么?我怎样才能在我的应用程序类中建立一个信息对话框?
messagebox 函 数 来 自 cwnd 类,所 以 你 只 能 在 从 cwnd 继 承 的 类 ( 如 cview ) 中 调 用 它。但 是,mfc 也 提 供 了 afxmessagebox 函 数,你 可 以 在 任 何 地 方 调 用 它。
(79) 我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该吧它放到哪儿?
把 该 变 量 放 到 该 应 用 程 序 类 的 头 文 件 中 的 attribute 处。然 后,在 程 序 的 任 何 地 方,你 都 可 以 用 下 面 的 方 法 来 访 问 该 变 量:
cmyapp *app = (cmyapp *)afxgetapp();
app->myglobalvariable = ...
(80) 我听说mfc可以发现内存漏洞,我怎样使用该特性?
如 果 你 在 debug 菜 单 中 的 go 选 项 ( 不 是 project 菜 单 中 的 execute 选 项 ) 来 运 行 你 的 应 用 程 序,mfc 应 该 在 程 序 终 止 时 报 告 内 存 漏 洞。如 果 没 有,那 么 试 试 运 行 mfc tracer 工 具 程 序 ( 在 vc++ 程 序 组 中 ),并 启 动 跟 踪。然 后 返 回 应 用 程 序。
(81) 我怎样才能在我的应用程序中循环浏览已经打开的文档?
使用cdoctemplate中未公开的getfirstdocposition()和getnextdoc()函数。
(82)才能在我的应用程序中循环浏览已经打开的视?
使 用 cdocument 中 未 公 开 的 getfirstviewposition() 和 getnextview() 函 数。
(83)数precreatewindow是干什么用的?
precreatewindow 允 许 你 在 调 用 createwindow 之 前 来 改 变 窗 口 属 性。
(84)该怎样防止mfc在窗口标题栏上把文档名预置成应用程序名?
在 precreatewindow 函 数 中 删 除 fws_prefixtitle 标 志 的 窗 口 样 式:
cs.style &= ~fws_prefixtitle;
(85) 我应该怎样防止mfc在窗口标题栏上添加文档名?
在 precreatewindow 函 数 中 删 除 fws_addtotitle 标 志 的 窗 口 样 式:
cs.style &= ~fws_addtotitle ;
(86) 我应该如何改变视窗口的大小?
因 为 视 窗 口 实 际 上 是 框 架 窗 口 的 子 窗 口,所 以 你 必 须 改 变 框 架 窗 口 的 大 小,而 不 是 改 变 视 窗 口。使 用 cview 类 中 的 getparentframe() 函 数 获 得 指 向 框 架 窗 口 的 指 针,然 后 调 用 movewindow() 函 数 来 改 变 框 架 的 大 小。这 会 使 变 尺 寸 的 视 充 满 框 架 窗 口。
(87) 我有一无模式对话框。我怎样才能在窗口退出时删除cdialog对象?
把“delete this”加 到 postncdestroy 中。这 主 要 用 在 需 要 自 动 删 除 对 象 的 场 合。
(88) 为什么把“delete this”放在postncdestroy中而不是onncdestroy?
onncdestroy 只 被 已 建 立 的 窗 口 调 用。如 果 建 立 窗 口 失 败 ( 如 precreatewindow ),则 没 有 窗 口 处 来 发 送 wm_ncdestroy 消 息。postncdestroy 是 在 对 象 窗 口 被 完 全 删 除,在 onncdestroy 后,甚 至 在 窗 口 建 立 失 败 之 后 调 用 的。
(89) file菜单中的mru列表是从哪儿来的?列表中的名字放在哪儿了?我怎样才能改变列表中项目的最大值?
在 应 用 程 序 类 的 initinstance 函 数 中 对 loadstdprofilesettings 的 调 用 中。该 调 用 接 受 一 个 参 数 ( 在 缺 省 情 况 下 如 果 没 有 传 递 值 则 为 4 )。mru 文 件 名 是 从 ini 文 件 中 调 用 的。如 果 你 有 带 有 id_file_mru_file1 的 id 的 菜 单 选 项,它 会 为 调 入 的 mru 列 表 所 替 换。如 果 你 改 变 传 递 给 loadstdprofilesettings 的 数 值 ( 最 大 为 16 ),则 你 就 改 变 了 所 装 如 文 件 名 的 最 大 值。
(90) 我在菜单中添加了新的项。但是,当我选该项时,在状态栏上没有出现任何提示信息。为什么?
打 开 资 源 文 件 中 的 菜 单 模 板。打 开 新 菜 单 选 项 的 属 性 对 话 框。在 对 话 框 的 底 部 的 prompt 编 辑 框 中 ,你 可 以 如 下 指 定 状 态 栏 上 的 提 示 信 息 和 工 具 栏 上 的 提 示 信 息 ( 如 果 你 已 经 建 立 的 工 具 栏 按 钮 ):
status bar string\nflying tag
(91) 我怎样才能在应用程序的缺省系统菜单中加上一些东西?
系 统 菜 单 与 其 它 菜 单 类 似,你 可 以 添 加 或 删 除 项 目,这 需 要 使 用 cmenu 类 的 成 员 函 数。下 面 的 代 码 在 你 的 系 统 菜 单 后 面 添 加 一 个 新 菜 单 项:
cmenu *sysmenu;
sysmenu = m_pmainwnd->getsystemmenu(false);
sysmenu->appendmenu(mf_string, 1000, "xxx");
参 见 mfc 帮 助 文 件 中 的 cmenu 类。
(92) 我建立了一个对话框。但是当我显示该对话框时,第一个编辑框总是不能获得焦点,我必须单击它来使它获得焦点。我怎样才能使第一个编辑框在对话框打开时就获得焦点?
打 开 资 源 编 辑 器 中 的 对 话 框 模 板。在 layout 菜单 中 选 择 tab order 选 项。按 你 的 需 求 单 击 对 话 框 中 的 控 制 来 重 新 排 列 这 些 控 制 的 tab 顺 序。
(93) 我怎样才能使一个窗口具有“always on top”特性?
在 调 用 onfilenew 后,在 你 的 initinstance 函 数 中 加 上 下 面 的 代 码:
m_pmainwnd->setwindowpos(&cwnd::wndtopmost,0,0,0,0, swp_nomove | swp_nosize);
(94) 我要为我的form view添加文档模板。我先建立了对话框模板,然后使用classwizard建立了基于cformview的新类,它也是从cdocument继承来的。我还建立了相应的资源并在initinstance中添加了新的文档模板。但是,当我试图运行该程序时,出现了assertion信息。为什么?
form 的 对 话 框 模 板 需 要 些 特 殊 设 置 以 便 可 用 于 cfromview。确 保 这 些 设 置 的 最 简 单 方 法 是 使 用 appwizard 来 建 立 cformview 应 用 程 序,并 查 看 appwizard 所 建 立 的 对 话 框 模 板 所 选 择 的styles properties。你 会 发 现 该 对 话 框 模 板 具 有 下 列 样 式:没 有 标 题 栏、不 可 见 和“child”。把 你 的 form view 的 对 话 框 属 性 变 成 这 样 就 可 以 了。
(95) 我在一对话框中有一列表框,我需要tabbed列表框中的项目。但是,当我处理含有tab字符(用addstring添加的)的列表项时,tab被显示成小黑块而没有展开。哪儿出错了?
在 对 话 框 模 版 中,打 开 列 表 框 的 属 性。确 保 选 择 了“use tabstops” 样 式。然 后,确 保 在 对 话 框 类 中 oninitdialog 函 数 中 调 用 settabstops。
(96) 我建立了一个应用程序,并使用了crecordset类。但是,当我运行该程序时,它试图要访问数据库,并给出“internal application error”对话框。我应该怎样做?
通 常 情 况 下,当 你 的 程 序 中 向 数 据 库 发 送 信 息 的 sql 语 句 出 现 问 题 时 才 出 现 该 对 话 框。例 如,参 见 下 面 的 例 子:
set.m_strfilter = "(zipcode = '27111')";