TN022:标准命令实现
注意
以下技术说明在首次包括在联机文档中后未更新。 因此,某些过程和主题可能已过时或不正确。 要获得最新信息,建议你在联机文档索引中搜索热点话题。
此说明描述的是 MFC 2.0 提供的标准命令实现。 首先阅读技术说明 21,因为它描述了用于实现大多数标准命令的机制。
本说明假设读者了解 MFC 体系结构、API 和常见的编程做法。 介绍了已记录和未记录的“仅实现”API。 不适合从本说明开始学习 MFC 的功能以及如何在其中编程。 请参阅 Visual C++,了解更广泛的信息以及关于记录的 API 的详细信息。
问题
MFC 在头文件 AFXRES.H 中定义许多标准命令 ID。 这些命令的框架支持各不相同。 了解框架类处理这些命令的位置和方式不仅会向你展示框架在内部的工作原理,还会提供有关如何自定义标准实现的有用信息,并教你一些实现自己的命令处理程序的技术。
本技术说明的内容
用两个部分描述每个命令 ID:
标题:命令 ID 的符号名称(例如 ID_FILE_SAVE)后跟命令的用途(例如“保存当前文档”),用冒号隔开。
一个或多个段落:描述由哪些类实现该命令以及默认实现执行什么操作
框架的基类消息映射中预置了大多数默认命令实现。 有一些命令实现需要在派生类中进行显式连接。 在“备注”下对这些实现进行了介绍。 如果在 AppWizard 中选择了正确的选项,系统会在生成的骨架应用程序中为你连接这些默认处理程序。
命名约定
标准命令遵循简单的命名约定(建议你尽可能使用该约定)。 大多数标准命令都位于应用程序菜单栏中的标准位置。 命令的符号名称开头为“ID_”,后跟标准弹出菜单名,最后是菜单项的名称。 符号名称采用大写形式,用下划线来分词。 对于没有标准菜单项名称的命令,我们将逻辑命令名称定义为以“ID_”开头(例如 ID_NEXT_PANE)。
我们使用前缀“ID_”来指示设计为要绑定到菜单项、工具栏按钮或其他命令用户界面对象的命令。 处理“ID_”命令的命令处理程序应使用 MFC 命令体系结构的 ON_COMMAND 和 ON_UPDATE_COMMAND_UI 机制。
对于不遵循命令体系结构并且需要特定于菜单的代码来启用和禁用菜单项的菜单项,建议使用标准“IDM_”前缀。 当然,特定于菜单的命令的数量应该很少,理由是遵循 MFC 命令体系结构不仅使命令处理程序功能更强大(因为它们将适用于工具栏),还使命令处理程序代码可重用。
ID 范围
有关在 MFC 中使用 ID 范围的详细信息,请参阅 技术说明 20。
MFC 标准命令所属的范围为 0xE000 到 0xEFFF。 请勿依赖这些特定的 ID 值,因为它们在未来的库版本中可能会更改。
应用程序应在范围 0x8000 到 0xDFFF 内定义其命令。
标准命令 ID
每个命令 ID 都有一个标准消息行提示字符串,可以在 PROMPTS.RC 文件中找到。 该菜单提示的字符串 ID 必须与命令 ID 相同。
ID_FILE_NEW - 创建新文档/空文档。
注意
必须将此命令连接到
CWinApp
派生类的消息映射,才能启用此功能。CWinApp::OnFileNew
根据应用程序中文档模板的数量,以不同方式实现此命令。 如果只有一个CDocTemplate
,CWinApp::OnFileNew
将创建该类型的新文档以及适当的框架和视图类。如果有多个
CDocTemplate
,CWinApp::OnFileNew
系统会使用对话 (AFX_IDD_NEWTYPEDLG) 提示用户,让他们选择要使用的文档类型。 选定的CDocTemplate
用于创建文档。ID_FILE_NEW 的一项常见自定义是提供一个不同的、更图形化的文档类型选择。 在这种情况下,你可以实现自己的
CMyApp::OnFileNew
并将它放在邮件映射中,而不是实现CWinApp::OnFileNew
。 不需要调用基类实现。ID_FILE_NEW 的另一项常见自定义是提供一个单独的命令,用于创建每种类型的文档。 在这种情况下,应定义新的命令 ID,例如 ID_FILE_NEW_CHART 和 ID_FILE_NEW_SHEET。
ID_FILE_OPEN - 打开现有文档。
注意
必须将此命令连接到
CWinApp
派生类的消息映射,才能启用此功能。CWinApp::OnFileOpen
具有非常简单实现:调用CWinApp::DoPromptFileName
,然后使用要打开的文件的文件名或路径名来调用CWinApp::OpenDocumentFile
。CWinApp
实现例程DoPromptFileName
显示出标准 FileOpen 对话框,并用从当前文档模板获取的文件扩展名来填充它。ID_FILE_OPEN 的一项常见自定义是自定义 FileOpen 对话框或添加其他文件筛选器。 建议的自定义方法是将默认实现替换为你自己的 FileOpen 对话框,然后使用文档的文件或路径名称调用
CWinApp::OpenDocumentFile
。 不需要调用基类。ID_FILE_CLOSE - 关闭当前打开的文档。
CDocument::OnFileClose
调用CDocument::SaveModified
来提示用户保存文档(如果已修改文档),然后调用OnCloseDocument
。 所有结束逻辑(包括销毁文档)均在OnCloseDocument
例程中完成。注意
ID_FILE_CLOSE 的行为与发送到文档框架窗口的 WM_CLOSE 消息或 SC_CLOSE 系统命令不同。 仅当窗口是显示文档的最后一个框架窗口时,关闭窗口才会关闭文档。 使用 ID_FILE_CLOSE 关闭文档不仅会关闭文档,还会关闭显示文档的所有框架窗口。
ID_FILE_SAVE - 保存当前文档。
实现使用帮助程序例程
CDocument::DoSave
,该例程用于OnFileSave
和OnFileSaveAs
二者。 如果保存之前未保存过的文档(也就是说,它没有路径名,就像 FileNew 一样)或从只读文档读取的文档,OnFileSave
逻辑将表现出和 ID_FILE_SAVE_AS 命令一样的行为,并要求用户提供新文件名。 打开文件并进行保存的实际过程是通过虚函数OnSaveDocument
完成的。自定义 ID_FILE_SAVE 有两个常见的原因。 对于不保存的文档,只需从用户界面中删除 ID_FILE_SAVE 菜单项和工具栏按钮。 也请确保你从不将文档标记为已更新(即从不调用
CDocument::SetModifiedFlag
)并且框架永远不会使文档被保存起来。 对于保存到磁盘文件以外的某个位置的文档,请为该操作定义一个新的命令。就
COleServerDoc
而言,ID_FILE_SAVE 用于保存文件(对于普通文档)和更新文件(对于嵌入文档)。如果文档数据存储在单独的磁盘文件中,但你不想使用默认的
CDocument
来序列化实现,则应替代CDocument::OnSaveDocument
(而不是OnFileSave
)。ID_FILE_SAVE_AS - 用其他文件名保存当前文档。
CDocument::OnFileSaveAs
实现使用和OnFileSave
相同的CDocument::DoSave
帮助程序例程。 如果文档在保存前没有文件名,OnFileSaveAs
命令的处理方式和 ID_FILE_SAVE 一样。COleServerDoc::OnFileSaveAs
实现用于保存普通文档数据文件的逻辑,或用于将表示一些其他应用程序中嵌入的 OLE 对象的服务器文档作为单独的文件进行保存的逻辑。如果自定义 ID_FILE_SAVE 的逻辑,你可能希望以类似的方式自定义ID_FILE_SAVE_AS,否则“另存为”操作可能不适用于你的文档。 如果不需要菜单项,可以将它从菜单栏中删除。
ID_FILE_SAVE_COPY_AS - 用新名称保存当前文档的副本。
COleServerDoc::OnFileSaveCopyAs
实现非常类似于CDocument::OnFileSaveAs
,但在保存后,文档对象未“附加”到基础文件。 也就是说,如果在保存前修改了内存中文档,它现在依然为“已修改”状态。 此外,此命令不影响存储在文档中的路径名或标题。ID_FILE_UPDATE - 通知容器保存嵌入的文档。
COleServerDoc::OnUpdateDocument
实现只通知应保存嵌入的容器。 然后,为了保存嵌入的对象,容器调用相应的 OLE API。ID_FILE_PAGE_SETUP - 调用特定于应用程序的页面设置/布局对话。
目前,没有适用于此对话的标准,框架没有此命令的默认实现。
如果你选择实现此命令,我们建议你使用此命令 ID。
ID_FILE_PRINT_SETUP 调用标准的“打印设置”对话。
注意
必须将此命令连接到
CWinApp
派生类的消息映射,才能启用此功能。此命令调用标准打印设置对话,该对话使用户能最少为此文档,最多为此应用程序中的所有文档自定义打印机和打印设置。 你必须使用控制面板更改整个系统的默认打印机设置。
CWinApp::OnFilePrintSetup
具有非常简单的实现,该实现创建CPrintDialog
对象并调用CWinApp::DoPrintDialog
实现函数。 这会设置应用程序的默认打印机设置。自定义此命令的常见需求是考虑到每个文档的打印机设置,应在保存时将这些设置随文档一起存储。 为此,应在创建
CPrintDialog
对象并使用相应打印机属性(通常为 hDevMode 和 hDevNames)初始化它的CDocument
类中添加消息映射处理程序,调用CPrintDialog::DoModal
,并保存更改后的打印机设置。 对于可靠的实现,应查看CWinApp::DoPrintDialog
(用于检测错误)以及CWinApp::UpdatePrinterSelection
(用于处理合理的默认值和跟踪系统范围的打印机更改)的实现。ID_FILE_PRINT - 当前文档的标准打印
注意
必须将此命令连接到
CView
派生类的消息映射,才能启用此功能。此命令打印当前文档,或更确切地说,它启动打印过程,该过程涉及调用标准打印对话并运行打印引擎。
CView::OnFilePrint
实现此命令和主打印循环。 它调用虚拟CView::OnPreparePrinting
,通过打印对话提示用户。 然后,它准备用于转到打印机的输出 DC,启动打印进度对话 (AFX_IDD_PRINTDLG),并将StartDoc
转义发送到打印机。CView::OnFilePrint
还包含面向主页的打印循环。 对于每个页面,它都会调用虚拟CView::OnPrepareDC
,后跟StartPage
转义,并调用该页的虚拟CView::OnPrint
。 完成后,调用虚拟CView::OnEndPrinting
,并且打印进度对话框处于关闭状态。MFC 打印体系结构设计为支持采用多种不同的方式进行打印和打印预览。 你通常会发现各种
CView
可替代函数,足以用于任何面向页面的打印任务。 仅当应用程序使用打印机进行面向非页面的输出时,你才需要替换 ID_FILE_PRINT 实现。ID_FILE_PRINT_PREVIEW - 进入当前文档的打印预览模式。
注意
必须将此命令连接到
CView
派生类的消息映射,才能启用此功能。CView::OnFilePrintPreview
通过调用记录的帮助程序函数CView::DoPrintPreview
来启动打印预览模式。CView::DoPrintPreview
是打印预览循环的主引擎,就像OnFilePrint
是打印循环的主引擎一样。将不同的参数传递给
DoPrintPreview
,即可通过多种方式自定义打印预览操作。 请参阅 技术说明 30,其中讨论了打印预览的一些详细信息以及对其进行自定义的方式。ID_FILE_MRU_FILE1...FILE16 - “最近使用的文件”列表(MRU 列表)中的一系列命令 ID。
CWinApp::OnUpdateRecentFileMenu
是更新命令 UI 处理程序,该处理程序是 ON_UPDATE_COMMAND_UI 机制的更高级用法之一。 在菜单资源中,只需要定义一个 ID 为 ID_FILE_MRU_FILE1 的菜单项。 该菜单项最初为禁用的状态。随着 MRU 列表的增加,向该列表中添加了更多菜单项。 标准
CWinApp
实现默认使用标准限制,即四个最近使用的文件。 调用CWinApp::LoadStdProfileSettings
可将默认值更改为一个更大或更小的值。 MRU 列表存储在应用程序的 .INI 文件中。 如果调用LoadStdProfileSettings
,系统会在应用程序的InitInstance
函数中加载该列表,并在应用程序退出时保存它。 MRU 更新命令 UI 处理程序还会将绝对路径转换为相对路径,以供在文件菜单上显示。CWinApp::OnOpenRecentFile
是执行实际命令的 ON_COMMAND 处理程序。 它只从 MRU 列表获取文件名并调用CWinApp::OpenDocumentFile
,这会执行打开文件并更新 MRU 列表的所有工作。建议不要自定义此命令处理程序。
ID_EDIT_CLEAR - 清除当前的选择
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
使用CEdit::Clear
实现此命令。 如果当前未做出任何选择,则此命令是禁用的。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_CLEAR_ALL - 清除整个文档。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。如果你选择实现此命令,我们建议你使用此命令 ID。 有关示例实现,请参阅 MFC 教程示例 SCRIBBLE。
ID_EDIT_COPY - 将当前选定内容复制到剪贴板。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
提供此命令的实现,该命令使用CEdit::Copy
将当前选定的文本以 CF_TEXT 格式复制到剪贴板。 如果当前未做出任何选择,则此命令是禁用的。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_CUT - 将当前选定内容剪切到剪贴板。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
提供此命令的实现,该命令使用CEdit::Cut
将当前选定的文本以 CF_TEXT 格式剪切到剪贴板。 如果当前未做出任何选择,则此命令是禁用的。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_FIND - 开始查找操作,显示出非模式的查找对话框。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
提供此命令的实现,该命令调用实现帮助程序函数OnEditFindReplace
,在专用实现变量中使用和存储以前的查找/替换设置。CFindReplaceDialog
类用于管理提示用户的非模式对话框。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_PASTE - 插入当前的剪贴板内容。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
提供此命令的实现,该命令使用CEdit::Paste
复制当前的剪贴板数据来替换选定的内容。 如果剪贴板中没有 CF_TEXT,则禁用该命令。COleClientDoc
只为此命令提供更新命令 UI 处理程序。 如果剪贴板不包含可嵌入的 OLE 项/对象,则将禁用该命令。 你负责编写要执行实际粘贴的实际命令的处理程序。 如果 OLE 应用程序还可以粘贴其他格式,你应在视图或文档中(即命令目标路由中COleClientDoc
之前的某个位置)提供自己的更新命令 UI 处理程序。如果你选择实现此命令,我们建议你使用此命令 ID。
要替换标准 OLE 实现,请使用
COleClientItem::CanPaste
。ID_EDIT_PASTE_LINK - 根据当前剪贴板内容插入链接。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。COleDocument
只为此命令提供更新命令 UI 处理程序。 如果剪贴板不包含可链接的 OLE 项/对象,则将禁用该命令。 你负责编写要执行实际粘贴的实际命令的处理程序。 如果 OLE 应用程序还可以粘贴其他格式,你应在视图或文档中(即命令目标路由中COleDocument
之前的某个位置)提供自己的更新命令 UI 处理程序。如果你选择实现此命令,我们建议你使用此命令 ID。
要替换标准 OLE 实现,请使用
COleClientItem::CanPasteLink
。ID_EDIT_PASTE_SPECIAL - 插入包含选项的当前剪贴板内容。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。 MFC 不提供此对话。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_REPEAT - 重复最后一个操作。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
提供此命令的实现以重复最后一次查找操作。 使用的是最后一次查找的专用实现变量。 如果无法尝试执行查找,则禁用该命令。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_REPLACE - 开始替换操作,显示出非模式的替换对话框。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
提供此命令的实现,该命令调用实现帮助程序函数OnEditFindReplace
,在专用实现变量中使用和存储以前的查找/替换设置。CFindReplaceDialog
类用于管理提示用户的非模式对话框。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_SELECT_ALL - 选择整个文档。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
提供此命令的实现,该命令选择文档中的所有文本。 如果没有要选择的文本,此命令是禁用的。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_UNDO - 撤消最后一个操作。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。CEditView
使用CEdit::Undo
来提供此命令的实现。 如果CEdit::CanUndo
返回 FALSE,此命令处于禁用状态。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_EDIT_REDO - 恢复最后一个操作。
目前没有此命令的标准实现。 你必须为每个
CView
派生类实现此命令。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_WINDOW_NEW - 在活动的文档上打开另一个窗口。
CMDIFrameWnd::OnWindowNew
通过以下方式实现此功能:使用当前文档的文档模板来创建包含当前文档的另一个视图的另一个框架。与大多数多文档界面 (MDI) 的“窗口”菜单命令一样,如果没有活动的 MDI 子窗口,此命令处于禁用状态。
建议不要自定义此命令处理程序。 如果希望提供创建额外的视图或创建框架窗口的命令,最好是发明自己的命令。 你可以从
CMDIFrameWnd::OnWindowNew
克隆代码,并将其修改为你喜欢的特定框架和视图类。ID_WINDOW_ARRANGE - 排列 MDI 窗口底部的图标。
CMDIFrameWnd
在实现帮助程序函数OnMDIWindowCmd
中实现此标准 MDI 命令。 此帮助程序将命令 ID 映射到 MDI 窗口消息,因此可以共享大量代码。与大多数 MDI 窗口菜单命令一样,如果没有活动的 MDI 子窗口,此命令处于禁用状态。
建议不要自定义此命令处理程序。
ID_WINDOW_CASCADE - 将窗口级联起来,使它们重叠。
CMDIFrameWnd
在实现帮助程序函数OnMDIWindowCmd
中实现此标准 MDI 命令。 此帮助程序将命令 ID 映射到 MDI 窗口消息,因此可以共享大量代码。与大多数 MDI 窗口菜单命令一样,如果没有活动的 MDI 子窗口,此命令处于禁用状态。
建议不要自定义此命令处理程序。
ID_WINDOW_TILE_HORZ - 水平地平铺窗口。
就像 ID_WINDOW_CASCADE 一样,此命令是在
CMDIFrameWnd
中实现的,但为操作使用了一个不同的 MDI 窗口消息。你应为应用程序选取默认的平铺方向。 为此,可将窗口“平铺”菜单项的 ID 更改为 ID_WINDOW_TILE_HORZ 或 ID_WINDOW_TILE_VERT。
ID_WINDOW_TILE_VERT - 垂直地平铺窗口。
就像 ID_WINDOW_CASCADE 一样,此命令是在
CMDIFrameWnd
中实现的,但为操作使用了一个不同的 MDI 窗口消息。你应为应用程序选取默认的平铺方向。 为此,可将窗口“平铺”菜单项的 ID 更改为 ID_WINDOW_TILE_HORZ 或 ID_WINDOW_TILE_VERT。
ID_WINDOW_SPLIT - 拆分器的键盘接口。
CView
为CSplitterWnd
实现处理此命令。 如果视图为拆分器窗口的一部分,此命令将委托给实现函数CSplitterWnd::DoKeyboardSplit
。 这会使拆分器处于允许键盘用户对拆分器窗口进行拆分或取消拆分的模式下。如果视图不在拆分器中,则此命令处于禁用状态。
建议不要自定义此命令处理程序。
ID_APP_ABOUT - 调用“关于”对话框。
应用程序的“关于”框没有标准实现。 AppWizard 创建的默认应用程序将为应用程序创建一个自定义对话框类,并将其用作“关于”框。 AppWizard 还将编写处理此命令并调用对话框的普通命令处理程序。
你几乎将始终实现此命令。
ID_APP_EXIT - 退出应用程序。
CWinApp::OnAppExit
通过向应用程序的主窗口发送 WM_CLOSE 消息来处理此命令。 应用程序的标准关闭(提示需要脏文件等)是由CFrameWnd
实现处理的。建议不要自定义此命令处理程序。 建议替代
CWinApp::SaveAllModified
或CFrameWnd
结束逻辑。如果你选择实现此命令,我们建议你使用此命令 ID。
ID_HELP_INDEX - 列出 .HLP 文件中的帮助主题。
注意
必须将此命令连接到
CWinApp
派生类的消息映射,才能启用此功能。CWinApp::OnHelpIndex
通过轻松地调用CWinApp::WinHelp
来处理此命令。建议不要自定义此命令处理程序。
ID_HELP_USING - 显示有关如何使用“帮助”的帮助。
注意
必须将此命令连接到
CWinApp
派生类的消息映射,才能启用此功能。CWinApp::OnHelpUsing
通过轻松地调用CWinApp::WinHelp
来处理此命令。建议不要自定义此命令处理程序。
ID_CONTEXT_HELP - 进入 SHIFT-F1 帮助模式。
注意
必须将此命令连接到
CWinApp
派生类的消息映射,才能启用此功能。CWinApp::OnContextHelp
通过以下方式处理此命令:设置帮助模式游标,进入模式循环并等待用户选择一个提供帮助的窗口。 有关 MFC 帮助实现的更多详细信息,请参阅技术说明 28。建议不要自定义此命令处理程序。
ID_HELP - 提供关于当前上下文的帮助
注意
必须将此命令连接到
CWinApp
派生类的消息映射,才能启用此功能。CWinApp::OnHelp
通过获取当前应用程序上下文的正确帮助上下文来处理此命令。 这处理的是简单的 F1 帮助和关于消息框的帮助等。 有关 MFC 帮助实现的更多详细信息,请参阅技术说明 28。建议不要自定义此命令处理程序。
ID_DEFAULT_HELP - 显示上下文的默认帮助
注意
必须将此命令连接到
CWinApp
派生类的消息映射,才能启用此功能。此命令通常映射到
CWinApp::OnHelpIndex
。如果需要区分默认帮助和帮助索引,可以提供一个不同的命令处理程序。
ID_NEXT_PANE - 转到下一个窗格
CView
为CSplitterWnd
实现处理此命令。 如果视图为拆分器窗口的一部分,此命令将委托给实现函数CSplitterWnd::OnNextPaneCmd
。 这会将活动视图移动到拆分器中的下一个窗格。如果视图不在拆分器中或者没有要转到的下一个窗格,则此命令处于禁用状态。
建议不要自定义此命令处理程序。
ID_PREV_PANE - 转到上一个窗格
CView
为CSplitterWnd
实现处理此命令。 如果视图为拆分器窗口的一部分,此命令将委托给实现函数CSplitterWnd::OnNextPaneCmd
。 这会将活动视图移动到拆分器中的上一个窗格。如果视图不在拆分器中或者没有要转到的上一个窗格,则此命令处于禁用状态。
建议不要自定义此命令处理程序。
ID_OLE_INSERT_NEW - 插入新的 OLE 对象
目前没有此命令的标准实现。 你必须为
CView
派生类实现此命令,以便在当前选定内容中插入新的 OLE 项/对象。所有 OLE 客户端应用程序都应实现此命令。 AppWizard(带有 OLE 选项)将在你必须完成的视图类中创建
OnInsertObject
的框架实现。有关此命令的完整实现,请参阅 MFC OLE 示例 - OCLIENT 示例。
ID_OLE_EDIT_LINKS - 编辑 OLE 链接
COleDocument
通过使用 MFC 提供的标准 OLE 链接对话框的实现来处理此命令。 通过COleLinksDialog
类访问此对话框的实现。 如果当前文档不包含任何链接,则该命令处于禁用状态。建议不要自定义此命令处理程序。
ID_OLE_VERB_FIRST...LAST - OLE 谓词的 ID 范围
COleDocument
为当前选定的 OLE 项/对象支持的谓词使用此命令 ID 范围。 这必须是一个范围,因为给定的 OLE 项/对象类型可支持零个或零个以上的自定义谓词。 在应用程序菜单中,应有一个 ID 为 ID_OLE_VERB_FIRST 的菜单项。 运行程序时,系统将用相应的菜单谓词说明(或具有许多谓词的弹出菜单)更新该菜单。 OLE 菜单的管理由AfxOleSetEditMenu
处理,这是在此命令的更新命令 UI 处理程序中完成的。没有用于处理此范围中的每个命令 ID 的显式命令处理程序。 重写了
COleDocument::OnCmdMsg
以捕获此范围中的所有命令 ID,将它们转换为从零开始的谓词编号,并为该谓词启动服务器(使用COleClientItem::DoVerb
)。不建议自定义此命令 ID 范围或将其用于其他用途
ID_VIEW_TOOLBAR - 打开和关闭工具栏
CFrameWnd
处理此命令和更新命令 UI 处理程序来切换工具栏的可见状态。 工具栏必须是框架的子窗口,且子窗口 ID 为 AFX_IDW_TOOLBAR。 命令处理程序实际上会切换工具栏窗口的可见性。CFrameWnd::RecalcLayout
用于重新绘制框架窗口,工具栏处于新状态。 更新命令 UI 处理程序在工具栏可见时检查菜单项。建议不要自定义此命令处理程序。 如果要添加其他工具栏,你需要克隆并修改此命令的命令处理程序和更新命令 UI 处理程序。
ID_VIEW_STATUS_BAR - 打开和关闭状态栏
就像 ID_VIEW_TOOLBAR 一样,此命令是在
CFrameWnd
中实现的,但使用了不同的子窗口 ID (AFX_IDW_STATUS_BAR)。
仅更新的命令处理程序
一些标准命令 ID 用作状态栏中的指示器。 它们使用相同的更新命令 UI 处理机制,在应用程序空闲期间显示其当前的视觉状态。 由于它们不可由用户无法(也就是说你不能推送状态栏窗格),因此使这些命令 ID 拥有 ON_COMMAND 处理程序并无意义。
ID_INDICATOR_CAPS:大写锁定指示器。
ID_INDICATOR_NUM:数字锁定指示器。
ID_INDICATOR_SCRL:滚动锁定指示器。
ID_INDICATOR_KANA:假名锁定指示器(仅适用于日语系统)。
上面提到的前三个都是在 CFrameWnd::OnUpdateKeyIndicator
中实现的,其中后者是一个实现帮助程序,它使用命令 ID 来映射到相应的虚拟键。 常见实现根据当前是否锁定了相应的虚拟键来启用或禁用 CCmdUI
对象(对于已禁用的状态窗格,即无文本)。
建议不要自定义此命令处理程序。
ID_INDICATOR_EXT:扩展选择指示器。
ID_INDICATOR_OVR:重叠指示器。
ID_INDICATOR_REC:录制指示起。
目前没有这些命令的标准实现。
如果选择实现这些指示器,我们建议使用这些指示器 ID,并在状态栏中使指示器排序(即按以下顺序:EXT、CAP、NUM、SCRL、OVR、REC)。