Excel Addin包含一些控件,将资源bmp加载到控件。 [英] Excel Addin with some controls,load resource bmp to the controls.

查看:127
本文介绍了Excel Addin包含一些控件,将资源bmp加载到控件。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在,我构建了一个Excel 2007 Addin-in,它有一些控件。现在我想为控件添加bmp资源。

Office 2007 Addin使用XML添加控件,如下所示。菜单控件使用 image =camera.bmp添加bmp。根据MSDN

http://msdn.microsoft.com/en- us / library / office / bb462634%28v = office.12%29.aspx?cs-save-lang = 1& cs-lang = csharp#code-snippet-4 [ ^ ]

,这个方法只适用于C#和VBA,所以如果有任何方法可以使用C ++实现向控件添加bmp资源,那就全部了谢谢。

< customui xmlns =http://schemas.microsoft.com/office/2006/01/customuiloadimage =LoadImage>

< ribbon startfromscratch =false>

< tabs>

< tab id =tab1label =Menu Demokeytip =x>

< group id =group1label =演示组>

< menu id =menu1>

label = 文字处理程序

itemSize =大

getScreentip =GetScreenTip

supertip =这是菜单的超级提示。

image =camera.bmp>

< button id =button1

imageMso = HappyFace

getDescription =GetDescription

label =我的按钮
$ b $bönAction=OnAction/>











Now ,I build an Excel 2007 Addin-in which has some controls.Now I want add bmp resource to the controls.
Office 2007 Addin add controls using XML,such as following. The menu control add bmp using image="camera.bmp" .According the MSDN
http://msdn.microsoft.com/en-us/library/office/bb462634%28v=office.12%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-4[^]
,the method just for C# and VBA,So if there any method can achieve adding bmp resource to the controls using C++,That's all thank you.
<customui xmlns="http://schemas.microsoft.com/office/2006/01/customui" loadimage="LoadImage">
<ribbon startfromscratch="false">
<tabs>
<tab id="tab1" label="Menu Demo" keytip="x">
<group id="group1" label="Demo Group">
<menu id="menu1">
label="Text Handler"
itemSize="large"
getScreentip="GetScreenTip"
supertip="This is a super tip for the menu."
image="camera.bmp" >
<button id="button1"
imageMso="HappyFace"
getDescription="GetDescription"
label="My Button"
önAction="OnAction" />





"

推荐答案

STDMETHOD(OnGetImage)(BSTR * pbstrImageId,IPictureDisp * * ppdispImage)

{

// MessageBox(NULL, OnGetImage,AA,MB_OK);

CComBSTR bImageName(* pbstrImageId);

HRESULT hr = S_OK;

PICTDESC pd;

pd.cbSizeofstruct = sizeof(PICTDESC);

pd.picType = PICTYPE_BITMAP;

Gdiplus :: GdiplusStartupInput gdiplusStartupInput;

ULONG_PTR gdiplusToken;

gdiplusStartupInput.DebugEventCallback = NULL;

gdiplusStartupInput.SuppressBackgroundThread = FALSE;

gdiplusStartupInput.SuppressExternalCodecs = FALSE;

gdiplusStartupInput .GdiplusVersion = 1;

GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);

int idPNG;



/ / if(lstrcmp(bstrID,TEXT(iJoinBtn))== 0)

if(wcscmp(bImageName.m_str,Lcrhs1.bmp)== 0)

idPNG = IDR_PNG1;



if(wcscmp(bImageName.m_str,Lcrhs2.bmp)== 0)

idPNG = IDR_PNGBJHS;



if(wcscmp(bImageName.m_str,Ldwsj.bmp)== 0)

idPNG = IDR_PNGDWSJ ;



if(wcscmp(bImageName.m_str,Lsjj.bmp)== 0)

idPNG = IDR_PNGSJJ;



if(wcscmp(bImageName.m_str,Lcrdm.bmp)== 0)

idPNG = IDR_PNGCRDM;



if(wcscmp(bImageName.m_str,Lcrrq.bmp)== 0)

idPNG = IDR_PNGCRRQ;

if(wcscmp(bImageName) .m_str,Lcssz.bmp)== 0)

idPNG = IDR_PNGCSSZ;

if(wcscmp(bImageName.m_str,Lxtsz.bmp)= = 0)

idPNG = IDR_PNGXTSZ;



if(wcscmp(bImageName.m_str,Lshuaxin.bmp)== 0)

idPNG = IDR_SHUAXIN;

//if(wcscmp(bImageName.m_str,L\"wdl.bmp\")==0)

/ / idPNG = IDR_PNGWDL;

HRSRC hResource = FindResource(_Module.GetModuleInstance(),

MAKEINTRESOURCE(idPNG),TEXT(PNG));

if(!hResource)

return hr;

DWORD dwImageSize = SizeofResource(_Module.GetModuleInstance(),hResource);

const void * pResourceData = LockResource(LoadResource

(_Module.GetModuleInstance(),hResource));

if(!pResourceData)

return hr;

HGLOBAL hBuffer = GlobalAlloc(GMEM_MOVEABLE,dwImageSize);

if(hBuffer)

{

void * pBuffer = GlobalLock(hBuffer) ;

if(pBuffer)

{

CopyMemory(pBuffer,pResourceData,dwImageSize);

IStream * pStream = NULL;

if(:: CreateStreamOnHGlobal(hBuffer,FALSE,&pStream)== S_OK)

{

Gdiplus :: Bitmap * pBitmap = Gdiplus :: Bitmap :: FromStream(pStream);

pStream-> Release();

if(pBitmap)

{

pBitmap-> GetHBITMAP(0,&pd.bmp.hbitmap);

hr = OleCreatePictureIndirect(&pd,I ID_IDispatch,FALSE,(LPVOID *)ppdispImage);

删除pBitmap;



}

}

GlobalUnlock(pBuffer);

}

GlobalFree(hBuffer);

}

Gdiplus :: GdiplusShutdown(gdiplusToken);

返回小时;



}
STDMETHOD(OnGetImage)(BSTR * pbstrImageId, IPictureDisp * * ppdispImage)
{
// MessageBox(NULL,"OnGetImage","AA",MB_OK);
CComBSTR bImageName(*pbstrImageId);
HRESULT hr = S_OK;
PICTDESC pd;
pd.cbSizeofstruct = sizeof (PICTDESC);
pd.picType = PICTYPE_BITMAP;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
gdiplusStartupInput.DebugEventCallback = NULL;
gdiplusStartupInput.SuppressBackgroundThread = FALSE;
gdiplusStartupInput.SuppressExternalCodecs = FALSE;
gdiplusStartupInput.GdiplusVersion = 1;
GdiplusStartup (&gdiplusToken, &gdiplusStartupInput, NULL);
int idPNG;

//if (lstrcmp (bstrID, TEXT("iJoinBtn")) == 0)
if(wcscmp(bImageName.m_str,L"crhs1.bmp")==0)
idPNG = IDR_PNG1;

if(wcscmp(bImageName.m_str,L"crhs2.bmp")==0)
idPNG = IDR_PNGBJHS;

if(wcscmp(bImageName.m_str,L"dwsj.bmp")==0)
idPNG = IDR_PNGDWSJ;

if(wcscmp(bImageName.m_str,L"sjj.bmp")==0)
idPNG = IDR_PNGSJJ;

if(wcscmp(bImageName.m_str,L"crdm.bmp")==0)
idPNG = IDR_PNGCRDM;

if(wcscmp(bImageName.m_str,L"crrq.bmp")==0)
idPNG = IDR_PNGCRRQ;
if(wcscmp(bImageName.m_str,L"cssz.bmp")==0)
idPNG = IDR_PNGCSSZ;
if(wcscmp(bImageName.m_str,L"xtsz.bmp")==0)
idPNG = IDR_PNGXTSZ;

if(wcscmp(bImageName.m_str,L"shuaxin.bmp")==0)
idPNG = IDR_SHUAXIN;
//if(wcscmp(bImageName.m_str,L"wdl.bmp")==0)
// idPNG = IDR_PNGWDL;
HRSRC hResource = FindResource (_Module.GetModuleInstance(),
MAKEINTRESOURCE(idPNG), TEXT("PNG"));
if (!hResource)
return hr;
DWORD dwImageSize = SizeofResource (_Module.GetModuleInstance(), hResource);
const void* pResourceData = LockResource (LoadResource
(_Module.GetModuleInstance(), hResource));
if (!pResourceData)
return hr;
HGLOBAL hBuffer = GlobalAlloc (GMEM_MOVEABLE, dwImageSize);
if (hBuffer)
{
void* pBuffer = GlobalLock (hBuffer);
if (pBuffer)
{
CopyMemory (pBuffer, pResourceData, dwImageSize);
IStream* pStream = NULL;
if (::CreateStreamOnHGlobal (hBuffer, FALSE, &pStream) == S_OK)
{
Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromStream (pStream);
pStream->Release();
if (pBitmap)
{
pBitmap->GetHBITMAP (0, &pd.bmp.hbitmap);
hr = OleCreatePictureIndirect (&pd, IID_IDispatch, FALSE, (LPVOID*)ppdispImage);
delete pBitmap;

}
}
GlobalUnlock (pBuffer);
}
GlobalFree (hBuffer);
}
Gdiplus::GdiplusShutdown(gdiplusToken);
return hr;

}


这篇关于Excel Addin包含一些控件,将资源bmp加载到控件。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆