Excel Office Ribbon大小图像

Excel Office Ribbon大小图像,excel,vba,office365,ribbon,Excel,Vba,Office365,Ribbon,office ribbon中的图像可以是大的(32x32)或小的(16x16)。如果将它们指定为“大”,但窗口太窄,无法容纳它们,则它们将自动变小。默认情况下,这些只是较大图像的压缩版本 有一份office设计文档(自从消失后)建议人们应该正确设计小图标,而不仅仅是大图标的小版本,因为压缩到16x16并不总是很好。非常明智 但人们真的在XML中这样做吗?像Button这样的元素似乎只有一个图像属性。我希望有两个,大图像和小图像 这真的需要可怕的回电吗?在这种情况下,如何捕捉功能区决定调整图像大小

office ribbon中的图像可以是大的(32x32)或小的(16x16)。如果将它们指定为“大”,但窗口太窄,无法容纳它们,则它们将自动变小。默认情况下,这些只是较大图像的压缩版本

有一份office设计文档(自从消失后)建议人们应该正确设计小图标,而不仅仅是大图标的小版本,因为压缩到16x16并不总是很好。非常明智

但人们真的在XML中这样做吗?像Button这样的元素似乎只有一个图像属性。我希望有两个,大图像和小图像


这真的需要可怕的回电吗?在这种情况下,如何捕捉功能区决定调整图像大小的事件?(由于几个原因,功能区回调与VBA很不协调。)

功能区XML没有一个选项来指定大图标和小图标作为其定义的一部分。如果使用
图像
属性,则只能提供一张图片

也无法确定Office是否/何时缩小了功能区的大小。您必须做一些研究,检查哪个窗口宽度触发调整大小,然后您可以使用应用程序对象的
WindowResize
事件使控件无效,更改图片(可能还有控件大小)

为了提供多个图标,您需要使用回调属性
getImage
告诉功能区要使用哪个图片。这不像传递存储在Office文档中的文件的字符串值那样简单,因为回调函数需要一个
ipituredisp
对象;图像需要作为文件存储在Office文档之外

使用
getImage
的复杂之处在文章末尾的部分进行了描述,但是这里提供的代码是针对.NET Framework的

实际上,使用VBA编写代码要容易一些,因为提供
IPictureDisp
stdOle
库是一个office库。您需要设置对库的引用-在VBA编辑器的工具/引用中,它被标记为
OLE Automation
。请注意,这不适用于图形png文件格式-库有点旧

Public Sub GetIconImage(control As IRibbonControl, ByRef image)     
  Dim sPicPath As String
  Dim stdPic As StdPicture

  sPicPath = "C:\Users\[userName]\Pictures\test.jpg"  'Schweiz.png"
  Set stdPic = stdole.StdFunctions.LoadPicture(sPicPath)
  Set image = stdPic
End Sub

功能区XML没有指定大图标和小图标作为其定义的一部分的选项。如果使用
图像
属性,则只能提供一张图片

也无法确定Office是否/何时缩小了功能区的大小。您必须做一些研究,检查哪个窗口宽度触发调整大小,然后您可以使用应用程序对象的
WindowResize
事件使控件无效,更改图片(可能还有控件大小)

为了提供多个图标,您需要使用回调属性
getImage
告诉功能区要使用哪个图片。这不像传递存储在Office文档中的文件的字符串值那样简单,因为回调函数需要一个
ipituredisp
对象;图像需要作为文件存储在Office文档之外

使用
getImage
的复杂之处在文章末尾的部分进行了描述,但是这里提供的代码是针对.NET Framework的

实际上,使用VBA编写代码要容易一些,因为提供
IPictureDisp
stdOle
库是一个office库。您需要设置对库的引用-在VBA编辑器的工具/引用中,它被标记为
OLE Automation
。请注意,这不适用于图形png文件格式-库有点旧

Public Sub GetIconImage(control As IRibbonControl, ByRef image)     
  Dim sPicPath As String
  Dim stdPic As StdPicture

  sPicPath = "C:\Users\[userName]\Pictures\test.jpg"  'Schweiz.png"
  Set stdPic = stdole.StdFunctions.LoadPicture(sPicPath)
  Set image = stdPic
End Sub

是的,正如我所担心的。他们在自己的色带中使用不同的图像,在样式指南中推荐,但不支持。白痴。最好避免回调到VBA。如果调试器处于活动状态,它们将无法工作,从而产生令人讨厌的消息。如果出现VBA错误,则需要使用肮脏的技巧来保存句柄。在上有一些合理的文章,但是使用名为range的xl4应用程序来存储它。@Turntable好吧,调试器通常不会在“生产”中处于活动状态,所以我不认为这是不使用回调的有效原因。现在,我不再使用命名范围来存储代码所需的内容。取而代之的是,我将它们写入一个定制的XML部分……这里曾经有一个最终用户计算的概念。高级Excel用户可以自己编写简单的代码,而无需处理可怕的部署复杂性。VBA仍然会发生这种情况,因此削弱调试器很重要,即使是在“生产”中,因为其他人可能正在编写代码。有一点是肯定的,没有最终用户会处理新的JavaScript界面!我可能会补充说,我发现开发带有大图标的色带相当困难,因为它们在压缩时看起来也应该合理,而且收缩算法不是很聪明。但是谢谢你的确认,没有简单的方法。是的,就像我担心的那样。他们在自己的色带中使用不同的图像,在样式指南中推荐,但不支持。白痴。最好避免回调到VBA。如果调试器处于活动状态,它们将无法工作,从而产生令人讨厌的消息。如果出现VBA错误,则需要使用肮脏的技巧来保存句柄。在上有一些合理的文章,但是使用名为range的xl4应用程序来存储它。@Turntable好吧,调试器通常不会在“生产”中处于活动状态,所以我不认为这是不使用回调的有效原因。现在,我不再使用命名范围来存储代码所需的内容。取而代之的是,我将它们写入一个定制的XML部分……这里曾经有一个最终用户计算的概念。高级Excel用户可以自己编写简单的代码,而无需处理可怕的部署复杂性。VBA仍然会发生这种情况,因此削弱了调试器