WinForms 的 Windows 功能区,第 3 部分 - 第一个 WinForms 功能区应用程序






4.29/5 (18投票s)
在本篇文章中,我将介绍如何创建一个支持 Windows 7 功能区的空白 WinForms 应用程序。
引言
这系列 CodeProject 文章基于我首先在我的 博客上发表的一系列帖子。
那么,让我们看看如何使用 Ribbon 类为空白 WinForms 应用程序添加功能区支持。
第 0 步 - 下载 WinForms 的 Windows 功能区
正如我在之前的帖子中提到的,您可以在 windowsribbon.codeplex.com 下载我的功能区包装器库的代码以及大量的示例(目前只有一个)。另外,我提醒您下载辅助库,Windows API Code Pack。 更新(2009/11/18):该项目不再依赖于 Windows API Code Pack。
在这篇文章中,我将回顾如何创建第一个支持功能区的 WinForms 应用程序。结果是站点上包含的示例应用程序“01-AddingRibbonSupport”。
第 1 步 - 引用 WinForms 的 Windows 功能区
创建一个新的 C# WinForms 应用程序,并添加对我们开发的库 *Ribbon.dll* 的引用。
另外,在主窗体 (form1.cs) 中添加以下几行
using RibbonLib;
using RibbonLib.Interop;
public partial class Form1 : Form, IRibbonForm
{
private Ribbon _ribbon = new Ribbon();
...
第 2 步 - 添加功能区标记 XML 文件
向项目中添加一个名为 *RibbonMarkup.xml* 的空文件。将文件内容设置为以下内容
<?xml version='1.0' encoding='utf-8'?>
<Application xmlns='http://schemas.microsoft.com/windows/2009/Ribbon'>
<Application.Commands>
</Application.Commands>
<Application.Views>
<Ribbon>
</Ribbon>
</Application.Views>
</Application>
右键单击打开 *RibbonMarkup.xml* 的编辑器,然后单击“属性”。现在,将“架构”属性设置为:*C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\UICC.xsd*。这将有助于您将来编辑功能区标记文件(尝试在 XML 编辑器中按 Ctrl+Space 查看功能区标记语法)。
注意:这是某些人会发现他们没有安装 Windows 7 SDK 的时刻,所以请继续并修复它,我等着。
第 3 步 - 设置 UI 编译器在生成时编译标记
第 3.1 步 - 设置生成前事件
转到:项目属性 -> 生成事件 -> 生成前事件命令行。添加以下三行
"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.0\Bin\UICC.exe" "$(ProjectDir)RibbonMarkup.xml" "$(ProjectDir)RibbonMarkup.bml" /res:"$(ProjectDir)RibbonMarkup.rc" "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.0\Bin\rc.exe" /v "$(ProjectDir)RibbonMarkup.rc" cmd /c "("$(DevEnvDir)..\..\VC\bin\vcvars32.bat") && ("$(DevEnvDir)..\..\VC\bin\link.exe" /VERBOSE /NOENTRY /DLL /OUT:"$(ProjectDir)$(OutDir)$(TargetName).ribbon.dll" "$(ProjectDir)RibbonMarkup.res")"
说明:第一行将功能区标记文件编译为二进制压缩格式,以及一个描述它的小型 RC 文件。第二行创建一个本地 Win32 资源文件以附加到项目的本地资源。第三行从本地 Win32 资源文件创建一个资源 DLL。
第 3.2 步 - 编译
编译,以调用生成前事件。
更新(2009/11/18):第 3.3 步不再需要,因为资源是从资源 DLL 加载的。
第 3.3 步 - 添加本地资源
转到:项目属性 -> 应用程序 -> 资源 -> 资源文件。将“资源文件”设置为指向:*RibbonMarkup.res*。当它说找不到文件时,无论如何关闭“属性”窗口。它会保存并找到文件。如果您想确保安全,只需将“资源文件”设置为文件的完整路径(这取决于您的项目位置)。
第 4 步 - 实现 IRibbonForm
让您的主窗体实现 *Ribbon.dll* 中定义的 IRibbonForm
接口,您可以遵循以下指南
- 功能区框架需要主窗体窗口句柄进行初始化,因此
public IntPtr WindowHandle
{
get
{
return this.Handle;
}
}
SplitContainer
控件,并设置以下属性(您应该使用 GUI 属性更改它们,而不是通过代码)this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer1.IsSplitterFixed = true;
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.splitContainer1.SplitterWidth = 1;
现在,您所要做的就是将您的窗体控件放在 SplitContainer
的 Panel2
中,并在功能区高度更改时更新 Panel1
的高度(Panel1
作为功能区的占位符)。SplitContainer
会自动相应地重新定位您的控件。实际更新在 IRibbonForm
实现中完成
public void RibbonHeightUpdated(int newHeight)
{
this.splitContainer1.SplitterDistance = newHeight;
}
Ribbon
类现在提供了通用实现,从而简化了库的使用。public HRESULT Execute(uint commandId, ExecutionVerb verb,
PropertyKeyRef key, PropVariantRef currentValue,
IUISimplePropertySet commandExecutionProperties)
{
return HRESULT.S_OK;
}
public HRESULT UpdateProperty(uint commandId, ref PropertyKey key,
PropVariantRef currentValue, ref PropVariant newValue)
{
return HRESULT.S_OK;
}
第 5 步 - 在应用程序加载时初始化功能区框架
要初始化和销毁功能区框架,分别处理窗体的 Load
和 FormClosed
事件
private void Form1_Load(object sender, EventArgs e)
{
_ribbon.InitFramework(this);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
_ribbon.DestroyFramework();
}
享受您的第一个功能区 WinForms 应用程序
注意:如果您运行应用程序但看不到功能区,请尝试放大窗口。Windows 功能区有一个特性,如果窗口尺寸太小,它就不会显示。不幸的是,Visual Studio 的默认窗体尺寸太小了。
目前就到这里为止。