Excel Addin包含一些控件,将资源bmp加载到控件。 [英] Excel Addin with some controls,load resource bmp to the controls.
问题描述
现在,我构建了一个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屋!