为Ribbon界面的按钮添加自定义图像

上一节我们介绍了在Ribbon界面上添加按钮并响应按钮事件的过程,我们也看到了没有图像按钮看上去不是那么美观,因此添加上我们自己喜欢的图案成要当务之急。在为按钮添加图案,就要用到我们上节添加的另一个回调函数GetImage,它的声明如下:

function GetImage(const ctrl: IDispatch): IDispatch; safecall;

根据微软的定义,Ctrl是要获取图像的按钮的IRibbonControl接口,我们要根据它的ID来判断谁要获取图片,返回值是图片对象的IPictureDisp接口,要想正确返回这个接口,我们就要对常规图像进行转换,获取IPictureDisp接口后返回。

关于GetImage这个回调函数的定义在这里要多说两句,我当初在这里费了不少时间才找到正确的定义方法。详见下图:

一定要选中图中的 [out, retval]才行,我也是试了很多次才发现的。

本节我们决定从资源文件中载入图片,然后转换后返回给Office,关于资源文件编辑与添加在这里我就不多说的,网上有很多相关的教程。我们在资源文件中添加了两个BMP文件,资源名称同前面定义的按钮的ID一样,分别为“btn1”、“btn2”,然后写一个函数进行图片转换并获得IPictureDisp接口,函数内容如下:

function GetPictureFromRes(const Name: WideString): IPictureDisp;
var pic: TPicture;
  Ipic: IPictureDisp;
begin
  try
    pic := TPicture.Create;
    pic.Bitmap.LoadFromResourceName(HInstance, name);
    GetOlePicture(pic, Ipic);
    Result := Ipic;
  except
    Result := nil;
  end;
end;
{要添加对Graphics和AxCtrls单元的引用才行}

这个函数负责根据提供的资源名称name载入相应的资源图片,然后通过GetOlePicture函数获得IPictureDisp接口,如果失败会返回空指针。

我们的GetImage函数的实现如下:

function TTestRibbon.GetImage(const ctrl: IDispatch): IDispatch;
begin
  Result:=GetPictureFromRes((ctrl as IRibbonControl).Id) as IDispatch;
end;

根据按钮ID获取资源图片接口,然后转换成IDispatch接口返回。

到此处再编译我们的工程,然后打开Word或WPS就可以看到我们定义了图片的按钮。

除了添加自定义图像,我们也可以给按钮添加Office系统自带的图片,这只需在XML中定义就可以了,具体来说是定义button的imageMso属性。比如以下语句就可以添加一个拥有系统“复制”按钮图标的按钮“我的复制”:

<button id="btn3" label="我的复制" screentip="我的复制" onAction="OnAction" imageMso="Copy"/>

Screentip属性就是当我们的鼠标移到按钮上时显示的提示信息。

我们也可以添加一个拥有系统功能的按钮,只需定义button的idMso属性就可以了,如下语句可以直接添加系统的“剪切”、“复制”、“粘贴”功能:

                    <button idMso="Cut"/>
                    <button idMso="Copy"/>
                    <button idMso="Paste"/> 

至于怎么知道这个功能或图片的名称,可以参考下图的提示,打开word的选项——自定义,鼠标放到我们需要的功能上,提示信息的英文部分就是我们要的名称。

我们修改后的CustomUI.XML文件内容如下:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
    <ribbon startFromScratch="false">
        <tabs>
            <tab id="DemoTab" label="育林软件">
                <group id="loadFormsGroup" label="测试分组">
                    <button id="btn1" label="测试功能" screentip="测试功能" onAction="OnAction" getImage="GetImage"/>
                    <button id="btn2" label="关于我们" screentip="关于我们" onAction="OnAction" getImage="GetImage"/>
                    <button id="btn3" label="我的复制" screentip="我的复制" onAction="OnAction" imageMso="Copy"/>
                    <button idMso="Cut"/>
                    <button idMso="Copy"/>
                    <button idMso="Paste"/>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>

运行Word和WPS就可以看到如下的界面。

【原创文章,转载请注明出处】

本教程全部代码与资源文件下载:

http://pan.baidu.com/s/1eQrSOSE

时间: 2024-11-25 08:25:45

为Ribbon界面的按钮添加自定义图像的相关文章

(转载)VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Ribbon界面就是微软从Office2007开始引入的一种为了使应用程序的功能更加易于发现和使用.减少了点击鼠标的次数的新型界面,从实际效果来看,不仅外观漂亮,而且功能直观,用户操作简洁方便. 鸡啄米将以图文结合的方式来说明利用MFC向导创建Ribbon样式的单文档应用程序框架的过程,其实Ribbon应

VS2010-MFC(Ribbon界面开发:创建Ribbon样式的应用程序框架)

转自:http://www.jizhuomi.com/software/251.html 上一节讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Ribbon界面就是微软从Office2007开始引入的一种为了使应用程序的功能更加易于发现和使用.减少了点击鼠标的次数的新型界面,从实际效果来看,不仅外观漂亮,而且功能直观,用户操作简洁方便. 下面将以图文结合的方式来说明利用M

VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Ribbon界面就是微软从Office2007开始引入的一种为了使应用程序的功能更加易于发现和使用.减少了点击鼠标的次数的新型界面,从实际效果来看,不仅外观漂亮,而且功能直观,用户操作简洁方便. 鸡啄米将以图文结合的方式来说明利用MFC向导创建Ribbon样式的单文档应用程序框架的过程,其实Ribbon应

Winform开发框架之Office Ribbon界面

在前面几篇文章介绍我的Winform框架随笔文章,包括有<Winform开发框架之字典数据管理>.<Winform开发框架之权限管理系统>.<Winform开发框架之终极应用>,其中Winform开发框架之终极应用是集众多功能与一身,提供综合一站式.整体性的传统应用系统的开发框架,在此基础上开发新的业务系统,开发工作则是事半功倍,而且提供了高效.统一的界面布局以及支持多种数据库的数据访问层支持,提供了基于大量数据的数据分页解决方案,提供了传统Excel报表以及自定义模板

(转载)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)

前面一节中鸡啄米为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar添加Ribbon控件. VS2010为Ribbon界面开发提供了Ribbon Designer,通过它我们可以为Ribbon Bar添加各种Ribbon控件.设置控件属性和进行界面布局. Ribbon的界面元素可以分为类别.面板和基本控件(按钮.文本编辑框等),类别由面板组成,面板又由按钮.文本编辑框等基本控件组成. 鸡啄米以实例的方式讲解Ribbon控件的添加方法和属性,这样比

VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)

http://www.jizhuomi.com/software/255.html 上一节中鸡啄米讲了为Ribbon Bar添加控件的方法.本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数. 一.为Ribbon Bar添加更多Ribbon控件 鸡啄米将在上一节实例的基础上,继续添加下拉菜单.Check Box.Combo Box等Ribbon控件. 1.首先把“Small Button”面板上的“Click”按钮改造成一个下拉菜单.“Click”按

VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)[转]

http://www.jizhuomi.com/software/253.html 前面一节中鸡啄米为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar添加Ribbon控件. VS2010为Ribbon界面开发提供了Ribbon Designer,通过它我们可以为Ribbon Bar添加各种Ribbon控件.设置控件属性和进行界面布局. Ribbon的界面元素可以分为类别.面板和基本控件(按钮.文本编辑框等),类别由面板组成,面板又由按钮.文本编

关于界面的按钮的显隐 还有jsp页面数据的传递 把页面的标签变成只读

//界面按钮的显示隐藏 界面input的锁定    function change(){       document.getElementById('first1').style.display="inline";       document.getElementById('first2').style.display="inline";       document.getElementById('first3').style.display="in

为早期项目添加Ribbon界面

本文由 代码助手软件 整理发布 内容与本软件无关 更惬意的读.更舒心的写.更轻松的发布 如果新建一个Ribbon项目,然后将老项目一一拷贝过去,那未免也太麻烦了. 因此,要是能将老项目直接修改成Ribbon界面,那自然是更好的选择咯. 通过对比测试,给出以下解决方案: 首先,添加一个Ribbon资源 第一步:所有的CFrameWnd --->CFrameWndEx 第二步:CWinApp----> CWinAppEx 第三步:APP中添加     // 实现     UINT  m_nAppL