功能区xml显示图标
xml文件的属性和方法
属性或方法 | 返回值 | 描述 |
---|---|---|
xmlns | String | 必须使用 “http://schemas.microsoft.com/office/2006/01/customui” |
onLoad | callback | 再功能区加载的时候,将功能区参数传递给回调函数 |
loadImage | callback | 实现loadImage函数可以使用用户自定义的图片 |
xml示例
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad">
<ribbon>
<tabs>
<tab idMso="TabAddIns">
<group id="MyGroup"
label="My Group">
</group>
</tab>
</tabs>
</ribbon>
</customUI>
元素 | 描述 |
---|---|
customUi | 表示自定义的功能区 |
ribbon | 表示功能区 |
tabs | 表示功能区选项卡组 |
tab | 表示单个功能区选项卡 |
group | 表述功能区选项卡上的控件组 |
特性 | 父元素 | 描述 |
---|---|---|
onLoad | customUi | 标识应用程序加载功能区时调用的方法 |
idMso | tab | 表示显示在功能区中的内置选项卡 |
id | group | 表示组的id |
label | group | 指定在组上显示的名字(wps现在不显示下方的id名字) |
功能区类引用
方法 | 描述 |
---|---|
GetCustomUi | 返回功能区xml文件的内容。wps调用这个方法用与获取用户界面的XML字符串。 |
OnLoad | 将IRibbonControl参数分配给Ribbon字段,此字段可以用来更新自定义功能区 |
使用xml布局的流程
编写xml文件
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
<ribbon startFromScratch="false">
<tabs>
<tab id="DocumentAssistant" label="公文助手">
<group id="SampleGroup1" label="def1">
<button id="DBCToSBCBtn" label="半角转全角" onAction="DBCToSBC" imageMso="HappyFace"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
对xml文件的解释
tab一行中,label代表选项卡在整个选项卡组中的名字,使用id标签对选项卡进行标识。如果使用idMso则代表是默认选项卡,像文章开始的xml那样表示的是加载项选项卡。每个group代表的是一组控件,一组控件的分割在wps现实中使用|
标识。在每一个group中可以添加按钮,按钮的id由用户设定,label代表按钮在选项卡中显示的文字,onAction代表触发的方法,imageMso代表使用系统自带的图标,上文中的xml文件中的HappyFace就是系统图标。
第一步:实现GetCustomUi接口
GetCustomUi接口定义
virtual /* [helpcontext][id] */ HRESULT GetCustomUI(
/* [in] */ BSTR RibbonID,
/* [retval][out] */ BSTR *RibbonXml);
实现GetCustomUI接口
HRESULT CWpsComPlugins::GetCustomUI(
/* [in] */ BSTR RibbonID,
/* [retval][out] */ BSTR *RibbonXml)
{
if (!RibbonXml)
return E_INVALIDARG;
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QString xmlPath = QString::fromLocal8Bit("/root/下载/qt-project/InProcessComPlugin/ribbon.xml");
QFile file(xmlPath);
file.open(QIODevice::ReadOnly|QIODevice::Text);
QString str("");
while (!file.atEnd()) {
str += file.readLine();
}
file.close();
const WCHAR* const cszXml = str.utf16();
*RibbonXml = ::SysAllocString(cszXml);
return S_OK;
}
编译运行项目,将生成的动态链接库放入到wps中的wpsplugins文件夹中,会显示如下图所示
第二部:使用用户自定义的图片
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
loadImage="GetImage">
<!-- Later in the markup -->
<button id="myButton" image="mypic.jpg" />
在customUI一行中填写loadImage标签,并实现GetImage函数,之后再button中添加image标签,写入图片地址即可使用自定义图片。
注意:自定义图片大小要1616,large图标为3232
GetImage回调方法必须返回stdole.IPictureDisp类型
RECT& rc = *(RECT*)di.prcBounds;
CComPtr<IPictureDisp> m_picdisp = NULL;//IPictureDisp对象指针
_bstr_t m_bstrImgUrl = "C:\\桌面\\1.bmp";//bmp图片格式的路径
HRESULT hr = NOERROR;
PICTDESC pictDesc;
pictDesc.picType = PICTYPE_BITMAP;
pictDesc.bmp.hbitmap = (HBITMAP)::LoadImage(NULL, m_bstrImgUrl, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);//加载bmp格式的图片
pictDesc.bmp.hpal = nullptr;
pictDesc.cbSizeofstruct = sizeof(PICTDESC);
return m_picdisp