65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (18投票s)

2010年3月2日

Ms-PL

4分钟阅读

viewsIcon

54818

downloadIcon

3856

在本篇文章中,我将介绍如何创建一个支持 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")"

image

说明:第一行将功能区标记文件编译为二进制压缩格式,以及一个描述它的小型 RC 文件。第二行创建一个本地 Win32 资源文件以附加到项目的本地资源。第三行从本地 Win32 资源文件创建一个资源 DLL。

第 3.2 步 - 编译

编译,以调用生成前事件。

更新(2009/11/18):第 3.3 步不再需要,因为资源是从资源 DLL 加载的。

第 3.3 步 - 添加本地资源

转到:项目属性 -> 应用程序 -> 资源 -> 资源文件。将“资源文件”设置为指向:*RibbonMarkup.res*。当它说找不到文件时,无论如何关闭“属性”窗口。它会保存并找到文件。如果您想确保安全,只需将“资源文件”设置为文件的完整路径(这取决于您的项目位置)。

image

第 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;

    现在,您所要做的就是将您的窗体控件放在 SplitContainerPanel2 中,并在功能区高度更改时更新 Panel1 的高度(Panel1 作为功能区的占位符)。SplitContainer 会自动相应地重新定位您的控件。实际更新在 IRibbonForm 实现中完成

    public void RibbonHeightUpdated(int newHeight)
    {
        this.splitContainer1.SplitterDistance = newHeight;
    }
  • 功能区框架和您的应用程序之间的主要通信是通过实现以下两个方法来完成的我们将首先提供一个默认实现。更新(2009/11/18):用户不再需要实现这些函数,因为 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 步 - 在应用程序加载时初始化功能区框架

要初始化和销毁功能区框架,分别处理窗体的 LoadFormClosed 事件

private void Form1_Load(object sender, EventArgs e)
{
    _ribbon.InitFramework(this);
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    _ribbon.DestroyFramework();
}

享受您的第一个功能区 WinForms 应用程序

image

注意:如果您运行应用程序但看不到功能区,请尝试放大窗口。Windows 功能区有一个特性,如果窗口尺寸太小,它就不会显示。不幸的是,Visual Studio 的默认窗体尺寸太小了。

目前就到这里为止。

© . All rights reserved.