注释
自联机文档中首次包含此说明以来,尚未更新以下技术说明。 因此,某些过程和主题可能过期或不正确。 有关最新信息,建议在在线文档索引中搜索您感兴趣的主题。
此说明介绍 MFC 2.0 提供的标准命令实现。 首先阅读 Technical Note 21 ,因为它描述了用于实现许多标准命令的机制。
此说明假定了解 MFC 体系结构、API 和常见编程实践。 介绍了记录和未记录的“仅实现”API。 这不是开始了解 MFC 中的功能或如何编程的地方。 有关记录的 API 的详细信息和详细信息,请参阅 Visual C++。
问题
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 中找到一个标准消息行提示字符串。钢筋混凝土。 该菜单提示的字符串 ID 必须与命令 ID 的字符串 ID 相同。
ID_FILE_NEW创建新/空文档。
注释
必须将此项连接到
CWinApp
-derived 类的消息映射,才能启用此功能。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
-derived 类的消息映射,才能启用此功能。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保存当前文档。
实现使用同时用于这
OnFileSaveAs
两OnFileSave
者的帮助程序例程CDocument::DoSave
。 如果保存之前未保存的文档(也就是说,它没有路径名称(如 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
使用相同的CDocument::DoSave
帮助程序例程OnFileSave
。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
-derived 类的消息映射,才能启用此功能。此命令调用标准打印设置对话框,允许用户自定义至少此文档或此应用程序中所有文档的打印机和打印设置。 必须使用控制面板来更改整个系统的默认打印机设置。
CWinApp::OnFilePrintSetup
具有创建对象并调用CWinApp::DoPrintDialog
实现函数的非常简单的实现CPrintDialog
。 这会设置应用程序默认打印机设置。自定义此命令的常见需求是允许使用每文档打印机设置,该设置应在保存时与文档一起存储。 为此,应在类中添加
CDocument
一个创建CPrintDialog
对象的消息映射处理程序,使用相应的打印机属性(通常是 hDevMode 和 hDevNames)初始化它,调用CPrintDialog::DoModal
并保存更改的打印机设置。 对于可靠的实现,应查看检测错误的实现CWinApp::DoPrintDialog
以及CWinApp::UpdatePrinterSelection
处理合理的默认值和跟踪系统范围的打印机更改。ID_FILE_PRINT当前文档的标准打印
注释
必须将此项连接到
CView
-derived 类的消息映射,才能启用此功能。此命令会正确打印当前文档,或者更正确地启动打印过程,该过程涉及调用标准打印对话框并运行打印引擎。
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
-derived 类的消息映射,才能启用此功能。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
提供此命令的实现,它将当前选定的文本作为CF_TEXTCEdit::Copy
复制到剪贴板。 如果没有当前选择,则禁用该命令。如果选择实现此命令,建议使用此命令 ID。
ID_EDIT_CUT将当前所选内容剪切到剪贴板。
目前此命令没有标准实现。 必须为每个
CView
派生类实现此作。CEditView
提供此命令的实现,该命令将当前选定的文本剪切到剪贴板,CF_TEXT使用CEdit::Cut
。 如果没有当前选择,则禁用该命令。如果选择实现此命令,建议使用此命令 ID。
ID_EDIT_FIND开始查找作,打开无模式查找对话框。
目前此命令没有标准实现。 必须为每个
CView
派生类实现此作。CEditView
提供此命令的实现,它调用实现帮助程序函数OnEditFindReplace
,以在专用实现变量中使用和存储以前的查找/替换设置。 该CFindReplaceDialog
类用于管理无模式对话框以提示用户。如果选择实现此命令,建议使用此命令 ID。
ID_EDIT_PASTE插入当前剪贴板内容。
目前此命令没有标准实现。 必须为每个
CView
派生类实现此作。CEditView
提供此命令的实现,该命令复制替换所选文本CEdit::Paste
的当前剪贴板数据。 如果剪贴板中没有 CF_TEXT ,则禁用该命令。COleClientDoc
只需为此命令提供更新命令 UI 处理程序。 如果剪贴板不包含可嵌入的 OLE 项/对象,该命令将被禁用。 你负责编写实际命令的处理程序以执行实际粘贴。 如果 OLE 应用程序还可以粘贴其他格式,则应在视图或文档中提供自己的更新命令 UI 处理程序(即命令目标路由中的COleClientDoc
某个位置)。如果选择实现此命令,建议使用此命令 ID。
若要替换标准 OLE 实现,请使用
COleClientItem::CanPaste
。ID_EDIT_PASTE_LINK插入当前剪贴板内容中的链接。
目前此命令没有标准实现。 必须为每个
CView
派生类实现此作。COleDocument
只需为此命令提供更新命令 UI 处理程序。 如果剪贴板不包含可链接的 OLE 项/对象,该命令将被禁用。 你负责编写实际命令的处理程序以执行实际粘贴。 如果 OLE 应用程序还可以粘贴其他格式,则应在视图或文档中提供自己的更新命令 UI 处理程序(即命令目标路由中的COleDocument
某个位置)。如果选择实现此命令,建议使用此命令 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 Windows 消息,因此可以共享大量代码。与大多数 MDI 窗口菜单命令一样,如果没有活动的 MDI 子窗口,则会禁用该命令。
不建议自定义此命令处理程序。
ID_WINDOW_CASCADE级联窗口,以便它们重叠。
CMDIFrameWnd
在实现帮助程序函数OnMDIWindowCmd
中实现此标准 MDI 命令。 此帮助程序将命令 ID 映射到 MDI Windows 消息,因此可以共享大量代码。与大多数 MDI 窗口菜单命令一样,如果没有活动的 MDI 子窗口,则会禁用该命令。
不建议自定义此命令处理程序。
水平ID_WINDOW_TILE_HORZ平铺窗口。
此命令与ID_WINDOW_CASCADE一样实现
CMDIFrameWnd
,但用于作的不同 MDI Windows 消息除外。应为应用程序选择默认磁贴方向。 为此,可以将窗口“磁贴”菜单项的 ID 更改为ID_WINDOW_TILE_HORZ或ID_WINDOW_TILE_VERT。
垂直ID_WINDOW_TILE_VERT平铺窗口。
此命令与ID_WINDOW_CASCADE一样实现
CMDIFrameWnd
,但用于作的不同 MDI Windows 消息除外。应为应用程序选择默认磁贴方向。 为此,可以将窗口“磁贴”菜单项的 ID 更改为ID_WINDOW_TILE_HORZ或ID_WINDOW_TILE_VERT。
ID_WINDOW_SPLIT用于拆分的键盘接口。
CView
处理实现的CSplitterWnd
此命令。 如果视图是拆分器窗口的一部分,此命令将委托给实现函数CSplitterWnd::DoKeyboardSplit
。 这将将拆分器置于允许键盘用户拆分或取消拆分拆分窗口的模式下。如果视图不在拆分器中,则禁用此命令。
不建议自定义此命令处理程序。
ID_APP_ABOUT调用“关于”对话框。
应用程序的 About box 没有标准实现。 默认的 AppWizard 创建的应用程序将为应用程序创建自定义对话框类,并将其用作“关于”框。 AppWizard 还将编写处理此命令并调用对话框的普通命令处理程序。
几乎总是实现此命令。
ID_APP_EXIT退出应用程序。
CWinApp::OnAppExit
通过将WM_CLOSE消息发送到应用程序的主窗口来处理此命令。 应用程序的标准关闭(提示脏文件等)由CFrameWnd
实现处理。不建议自定义此命令处理程序。 建议重写
CWinApp::SaveAllModified
或CFrameWnd
结束逻辑。如果选择实现此命令,建议使用此命令 ID。
ID_HELP_INDEX列出来自 . 的帮助主题。HLP 文件。
注释
必须将此项连接到
CWinApp
-derived 类的消息映射,才能启用此功能。CWinApp::OnHelpIndex
通过简单调用CWinApp::WinHelp
处理此命令。不建议自定义此命令处理程序。
ID_HELP_USING显示有关如何使用帮助的帮助。
注释
必须将此项连接到
CWinApp
-derived 类的消息映射,才能启用此功能。CWinApp::OnHelpUsing
通过简单调用CWinApp::WinHelp
处理此命令。不建议自定义此命令处理程序。
ID_CONTEXT_HELP进入 SHIFT-F1 帮助模式。
注释
必须将此项连接到
CWinApp
-derived 类的消息映射,才能启用此功能。CWinApp::OnContextHelp
通过设置帮助模式游标、输入模式循环并等待用户选择一个窗口来获取帮助来处理此命令。 有关 MFC 帮助实现的更多详细信息,请参阅 技术说明 28 。不建议自定义此命令处理程序。
ID_HELP在当前上下文中提供帮助
注释
必须将此项连接到
CWinApp
-derived 类的消息映射,才能启用此功能。CWinApp::OnHelp
通过获取当前应用程序上下文的正确帮助上下文来处理此命令。 这将处理简单的 F1 帮助、消息框上的帮助等。 有关 MFC 帮助实现的更多详细信息,请参阅 技术说明 28 。不建议自定义此命令处理程序。
ID_DEFAULT_HELP显示上下文的默认帮助
注释
必须将此项连接到
CWinApp
-derived 类的消息映射,才能启用此功能。此命令通常映射到
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
使用标准 OLE 链接对话框的 MFC 提供的实现来处理此命令。 通过类访问COleLinksDialog
此对话框的实现。 如果当前文档不包含任何链接,则会禁用该命令。不建议自定义此命令处理程序。
ID_OLE_VERB_FIRST...最后一个 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
处理此命令和 update-command UI 处理程序以切换工具栏的可见状态。 工具栏必须是框架的子窗口,其子窗口 ID 为 AFX_IDW_TOOLBAR。 命令处理程序实际上切换工具栏窗口的可见性。CFrameWnd::RecalcLayout
用于重新绘制框架窗口,其工具栏处于新状态。 更新命令 UI 处理程序在工具栏可见时检查菜单项。不建议自定义此命令处理程序。 如果要添加其他工具栏,则需要克隆和修改此命令的命令处理程序和 update-command UI 处理程序。
ID_VIEW_STATUS_BAR打开和关闭状态栏
此命令与ID_VIEW_TOOLBAR一样实现
CFrameWnd
,但使用不同的子窗口 ID(AFX_IDW_STATUS_BAR)。
Update-Only 命令处理程序
多个标准命令 ID 用作状态栏中的指示器。 它们使用相同的更新命令 UI 处理机制在应用程序空闲期间显示其当前视觉状态。 由于用户无法选择它们(即无法推送状态栏窗格),因此对于这些命令 ID 具有ON_COMMAND处理程序是没有意义的。
ID_INDICATOR_CAPS:CAP 锁指示器。
ID_INDICATOR_NUM:NUM 锁指示器。
ID_INDICATOR_SCRL:SCRL 锁指示器。
ID_INDICATOR_KANA:KANA 锁指示器(仅适用于日本系统)。
这三项均在实现中 CFrameWnd::OnUpdateKeyIndicator
,这是一个实现帮助程序,它使用命令 ID 映射到相应的虚拟密钥。 通用实现启用或禁用(对于状态窗格已禁用 = 无文本), CCmdUI
具体取决于当前是否锁定了相应的虚拟密钥。
不建议自定义此命令处理程序。
ID_INDICATOR_EXT:EXTended 选择指示器。
ID_INDICATOR_OVR:OVeRstrike 指示器。
ID_INDICATOR_REC:RECording 指示器。
目前,这些指标没有标准实现。
如果选择实现这些指示器,建议使用这些指示器 ID 并在状态栏中维护指示器的排序(即,按以下顺序:EXT、CAP、NUM、SCRL、OVR、REC)。