演练:更新MFC scribble应用程序(第2部分)
显示了如何添加 Office fluent 功能区到传统的 scribble 应用程序。本演练第 1 部分此部分演示如何添加用户可以使用而不是菜单和命令的功能区面板和控件。
系统必备
各节内容
此演练部分包含以下部分:
添加新的面板到功能区
添加帮助面板到功能区
添加钢笔面板到功能区
添加颜色按钮添加到功能区
添加颜色成员添加到文档类
初始化的笔和保存的喜好
添加新的面板到功能区
这些步骤演示如何添加包含两个复选框控件工具栏和状态栏可见性的 查看 面板,并且包含一个垂直针对的拆分按钮控件创建和排列) 的 窗口 面板多文档界面 (mdi) (MDI) 窗口。
若要添加视图面板中以及对功能区栏的窗口面板
创建一个名为的 查看,有两个复选框切换状态栏和工具栏。一个面板
从 工具箱,将 面板 到 开始 类别。然后拖动两到面板的 复选框 。
单击面板修改其属性。更改 标题 到 查看。
单击第一个复选框修改其属性。更改 ID 到 ID_VIEW_TOOLBAR 和 标题 到 工具栏。
单击第二个复选框修改其属性。更改 ID 到 ID_VIEW_STATUS_BAR 和 标题 到 状态栏。
创建具有拆分按钮名为的 窗口 。当用户单击拆分按钮时,快捷菜单显示在 scribble 应用程序已定义的三个命令。
从 工具箱,将 面板 到 开始 类别。然后将 按钮 到面板。
单击面板修改其属性。更改 标题 到 窗口。
单击按钮。更改 标题 到 窗口, 键 到 w, 大图像索引 到 1和 拆分模式 到 False。然后在 菜单项 旁边的省略号 (…) 打开 项编辑器 对话框。
单击 添加 三次以添加三个按钮。
单击第一个按钮然后将 标题 到 新建窗口和 ID 到 ID_WINDOW_NEW。
单击第二个按钮然后将 标题 到 层叠和 ID 到 ID_WINDOW_CASCADE。
单击第三个按钮将更改 标题 到 平铺和 ID 到 ID_WINDOW_TILE_HORZ。
保存更改,然后生成并运行应用程序。应显示 查看 和 窗口 面板。单击按钮以确认它们正常工作。
[各节内容]
添加帮助面板到功能区
现在,可以将在功能区按钮的 scribble 应用程序定义名为 帮助主题 和 有关 scribble的两个菜单项。按钮添加到名为 帮助的新面板。
添加帮助面板
从 工具箱,将 面板 到 开始 类别。然后拖动两到面板的 按钮 。
单击面板修改其属性。更改 标题 到 帮助。
单击第一个按钮。更改 标题 到 帮助主题和 ID 到 ID_HELP_FINDER。
单击第二个按钮。更改 标题 到 有关 scribble…和 ID 到 ID_APP_ABOUT。
保存更改,然后生成并运行应用程序。包含两个功能区按钮的 帮助 面板中显示。
重要事项 当您单击 帮助主题 按钮时, scribble 应用程序打开压缩 HTML (.chm) 帮助文件名为 your_project_name.chm。结果,因此,如果您的项目未命名组,必须将帮助文件重命名为项目名称。
[各节内容]
添加钢笔面板到功能区
现在,添加一个面板到控件粗细和钢笔的颜色显示按钮。此面板包含切换之间粗和瘦的 pen 一个复选框。其功能类似于 scribble 应用程序的 粗线 菜单项。
原始 scribble 应用程序允许从出现的对话框中的用户选择的钢笔的宽度当用户在菜单上单击 钢笔的宽度 。由于功能区条具有新控件的足够的空间,使用在功能区中,的两个组合框可以替换 " 对话框。组合框调整梯度瘦的钢笔的宽度,另一个组合框调整梯度粗向上钢笔的宽度。
若要添加钢笔面板中和组合框到功能区
从 工具箱,将 面板 到 开始 类别。然后将 复选框 和两 组合框 到面板。
单击面板修改其属性。更改 标题 到 笔。
单击复选框。更改 标题 到 浓厚使用和 ID 到 ID_PEN_THICK_OR_THIN。
单击第一个组合框。更改 标题 到 瘦的笔, ID 到 ID_PEN_THIN_WIDTH, 文本 到 2, 类型 到 下拉列表和 数据 到 1; 2; 3; 4; 5; 6; 7; 8; 9;。
单击第二个组合框。更改 标题 到 粗的笔, ID 到 ID_PEN_THICK_WIDTH, 文本 到 5, 类型 到 下拉列表和 数据 到 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20;。
新的组合框不对应任何现有菜单项。因此,必须创建每个钢笔选项的菜单项。
在 资源视图 窗口中,打开 IDR_SCRIBBTYPE 菜单资源。
单击打开 pen 菜单的 笔 。然后单击在此处输入并键入 Thi&n 钢笔。
右击您键入打开 属性 窗口的文本,然后将 ID 属性设置为 ID_PEN_THIN_WIDTH。
还必须创建每篇菜单项的事件处理程序。右击创建的 Thi&n 钢笔菜单项然后单击添加事件处理程序。事件处理程序向导 显示。
在向导的 类列表 框中,选择 " CScribbleDoc 然后单击 添加和编辑。这将创建一个名为的事件处理程序 CScribbleDoc::OnPenThinWidth。
将下列代码添加到 CScribbleDoc::OnPenThinWidth。
// Get a pointer to the ribbon bar CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); // Get a pointer to the Thin Width combo box CMFCRibbonComboBox* pThinComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THIN_WIDTH)); //Get the selected value int nCurSel = pThinComboBox->GetCurSel(); if (nCurSel >= 0) { m_nThinWidth = atoi(pThinComboBox->GetItem(nCurSel)); } // Create a new pen using the selected width ReplacePen();
接下来,创建菜单项和事件处理程序粗的 pen。
在 资源视图 窗口中,打开 IDR_SCRIBBTYPE 菜单资源。
单击打开钢笔菜单的 笔 。然后单击在此处输入并键入 Thic&k 钢笔。
右击您键入 " 显示 属性 窗口的文本。更改 ID 属性设置为 ID_PEN_THICK_WIDTH。
右击创建的 粗的笔 菜单项然后单击 添加事件处理程序。事件处理程序向导 显示。
在向导的 类列表 框中,选择 " CScribbleDoc 然后单击 添加和编辑。这将创建一个名为的事件处理程序 CScribbleDoc::OnPenThickWidth。
将下列代码添加到 CScribbleDoc::OnPenThickWidth。
// Get a pointer to the ribbon bar CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx *) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonComboBox* pThickComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THICK_WIDTH)); // Get the selected value int nCurSel = pThickComboBox->GetCurSel(); if (nCurSel >= 0) { m_nThickWidth = atoi(pThickComboBox->GetItem(nCurSel)); } // Create a new pen using the selected width ReplacePen();
保存更改,然后生成并运行应用程序。应显示新按钮和组合框。使用 scribble 不同的钢笔的宽度的尝试。
[各节内容]
添加颜色按钮添加到笔面板
接下来,添加对于颜色让用户 scribble 的一 CMFCRibbonColorButton 对象。
若要添加颜色按到笔面板
在添加颜色按钮之前,请创建它的菜单项。在 资源视图 窗口中,打开 IDR_SCRIBBTYPE 菜单资源。单击 笔 菜单项打开钢笔菜单。然后单击在此处输入并键入 &Color。右击您键入 " 显示 属性 窗口的文本。更改 ID 到 ID_PEN_COLOR。
现在添加颜色按钮。从 工具箱,将 颜色按钮 到 笔 面板。
单击颜色按钮。更改 标题 到 颜色,对 ID_PEN_COLOR,对 true的 简单查找 , 大图像索引 到 1和 拆分模式 的 ID 到 False。
保存更改,然后生成并运行应用程序。在 笔 面板中显示新颜色按钮。但是,它,因为它没有一个事件处理程序,无法使用。以下步骤演示如何添加颜色按钮的事件处理程序。
[各节内容]
添加颜色成员添加到文档类
由于原始 scribble 应用程序没有颜色钢笔,您必须编写自己的实现。若要将文档存储的钢笔颜色,请添加新成员添加到文档类, CscribbleDoc.
若要添加颜色成员添加到文档类中
在 scribdoc.h,在 CScribbleDoc 类,找到 // Attributes 部分。在 m_nThickWidth 数据成员的定义之后添加以下代码行。
// Current pen color COLORREF m_penColor;
每个文档包含列表升火用户已绘制了。每个笔画由 CStroke 对象定义。CStroke 类不包含有关钢笔颜色的信息。因此,必须修改类。在 scribdoc.h,在 CStroke 类,请在 m_nPenWidth 数据成员的定义之后添加以下代码行。
// Pen color for the stroke COLORREF m_penColor;
在 scribdoc.h,添加参数指定宽度和颜色的新 CStroke 构造函数。在 CStroke(UINT nPenWidth); 语句后添加以下代码行。
CStroke(UINT nPenWidth, COLORREF penColor);
在 scribdoc.cpp,添加新的 CStroke 构造函数的实现。在 CStroke::CStroke(UINT nPenWidth) 构造函数的实现后面添加以下代码。
// Constructor that uses the document's current width and color CStroke::CStroke(UINT nPenWidth, COLORREF penColor) { m_nPenWidth = nPenWidth; m_penColor = penColor; m_rectBounding.SetRectEmpty(); }
如下所述更改 CStroke::DrawStroke 方法的第二行。
if (!penStroke.CreatePen(PS_SOLID, m_nPenWidth, m_penColor))
设置文档类的默认钢笔颜色。在 scribdoc.cpp,将下面一行添加到 CScribbleDoc::InitDocument,在 m_nThickWidth = 5; 语句之后。
// default pen color is black m_penColor = RGB(0,0,0);
在 scribdoc.cpp,请更改 CScribbleDoc::NewStroke 方法的第一行。下面。
CStroke* pStrokeItem = new CStroke(m_nPenWidth, m_penColor);
更改 CScribbleDoc::ReplacePen 方法中的最后一行以下程。
m_penCur.CreatePen(PS_SOLID, m_nPenWidth, m_penColor);
已添加一步中的 m_penColor 成员。现在,创建设置该成员的颜色按钮的事件处理程序。
在 资源视图 窗口中,打开 IDR_SCRIBBTYPE 菜单资源。
右击 颜色 菜单项并单击 添加事件处理程序…。事件处理程序向导 显示。
在向导的 类列表 框中,选择 " CScribbleDoc 然后单击 添加和编辑 按钮。这将创建 CScribbleDoc::OnPenColor 事件处理程序存根。
用下面的代码替换 CScribbleDoc::OnPenColor 事件处理程序的存根。
void CScribbleDoc::OnPenColor() { // Change pen color to reflect color button's current selection CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonColorButton* pColorBtn = DYNAMIC_DOWNCAST( CMFCRibbonColorButton, pRibbon->FindByID(ID_PEN_COLOR)); m_penColor = pColorBtn->GetColor(); // Create new pen using the selected color ReplacePen(); }
保存更改然后生成并运行应用程序。您应当能够按颜色按钮和更改钢笔的颜色。
[各节内容]
初始化的笔和保存的喜好
接下来,将初始化钢笔的颜色和宽度。最后,保存并从文件加载一个颜色绘制。
初始化在功能区上的控件
初始化在功能区栏的钢笔。
将以下代码添加到 scribdoc.cpp,在 CScribbleDoc::InitDocument 方法,在 m_sizeDoc = CSize(200,200) 语句之后。
// Reset the ribbon UI to its initial values CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); ASSERT_VALID(pRibbon); CMFCRibbonColorButton* pColorBtn = DYNAMIC_DOWNCAST( CMFCRibbonColorButton, pRibbon->FindByID(ID_PEN_COLOR)); // Set ColorButton to black pColorBtn->SetColor(RGB(0,0,0)); CMFCRibbonComboBox* pThinComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THIN_WIDTH)); // Set Thin pen combobox to 2 pThinComboBox->SelectItem(1); CMFCRibbonComboBox* pThickComboBox = DYNAMIC_DOWNCAST( CMFCRibbonComboBox, pRibbon->FindByID(ID_PEN_THICK_WIDTH)); // Set Thick pen combobox to 5 pThickComboBox->SelectItem(0);
保存绘制到文件的颜色。将以下语句添加到 scribdoc.cpp,在 CStroke::Serialize 方法,在 ar << (WORD)m_nPenWidth; 语句之后。
ar << (COLORREF)m_penColor;
最后,将从文件加载一个颜色绘制。在 m_nPenWidth = w; 语句后添加以下代码行,以 CStroke::Serialize 方法,。
ar >> m_penColor;
现在即可 scribble 在颜色并保存您的绘制到文件。
[各节内容]
结束语
您更新的 MFC scribble 应用程序。,当您修改现有应用程序时,请使用本演练作为参考。