From: 11x22 on
I am not sure whether this one is an apopriate group for such a question,
if not please be kind to point me the right one.

I am wondering if anyone can help me with trying to convert an image from
an icon to a bitmap. I am writing an MS Office plugin were I want to use
_CommandBarButton::PutPicture(IPictureDisp*) method but it seems that it
works only if IPictureDisp is an interface of a bitmap. But what I have is
an icon obtained from some stream and I really want it to stay that way.

So that is what I have:

IStream *pPict;

This pointer holds a stream with an icon image. I load it to the
IPictureDisp pointer:

CComPtr<IPictureDisp> pPictureDisp;
OleLoadPicture(pPict,0,TRUE,__uuidof(IPictureDisp),(LPVOID*)&pPictureDisp);
CComQIPtr<IPicture> pPicture = pPictureDisp;

Now I have a picture which is an icon (if I check the get_Type() method in
IPicture interface it states that it is an icon.

Okay so now I try to add this picture to a MS Office toolbar button. That
is what I have from somewhere:

_CommandBarButtonPtr pBtn

So I just do:

pBtn->PutPicture(pPictureDisp);

And that just won't work. PutPicture method will throw an ilegal argument
exception.

So I try to render my icon to a bitmap by something like that. I create a
DC, a bitmap, select the bitmap and then renders my icon to the DC. U

I create a DC:

HDC hScreenDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
HDC hMemDC = CreateCompatibleDC(hScreenDC);
HBITMAP hBMP = CreateCompatibleBitmap(hScreenDC, 16, 16);
HGDIOBJ hOldBMP = SelectObject(hMemDC, hBMP);

And render my image there
OLE_XSIZE_HIMETRIC xsWidth;
OLE_YSIZE_HIMETRIC ysHeight;
pPicture->get_Width(&xsWidth);
pPicture->get_Height(&ysHeight);
RECT rcBounds={0,0,16,16};
pPicture->Render(hMemDC,0,0,16,16,0,ysHeight,xsWidth,-ysHeight,&rcBounds);

Now I try to use it with a PutPicture() method:

PICTDESC pdBmp;
pdBmp.cbSizeofstruct = sizeof(PICTDESC);
pdBmp.picType = PICTYPE_BITMAP;
pdBmp.bmp.hbitmap = hBMP;
pdBmp.bmp.hpal = 0

IPictureDispPtr pRenderedPicture;
OleCreatePictureIndirect(&pdBmp, IID_IPictureDisp, TRUE, (LPVOID*)&pRenderedPicture);

And ufff.. Finally I can use it with PutPicture():

pBtn->PutPicture(pRenderedPicture);

But all I see know is black squre. I think that is because I can't render
from an icon to a bitmap because what I get there are an incompatible DCs.
Or maybe I am wrong?

I really don't want to load a bmp image from a file (which works) for some
reasons. I want to use this stream which I have. But how can I convert it
to bitmap to be able to use it with the PutPicture() method?

I've been trying to do something with that issue for some hours and I just
can't find a simple solution.
From: Joseph M. Newcomer on
GetIconInfo. What you do with the bitmap after that is up to you.
joe

On Sat, 24 Feb 2007 12:31:12 +0000 (UTC), 11x22 <hello(a)world.com> wrote:

>I am not sure whether this one is an apopriate group for such a question,
>if not please be kind to point me the right one.
>
>I am wondering if anyone can help me with trying to convert an image from
>an icon to a bitmap. I am writing an MS Office plugin were I want to use
>_CommandBarButton::PutPicture(IPictureDisp*) method but it seems that it
>works only if IPictureDisp is an interface of a bitmap. But what I have is
>an icon obtained from some stream and I really want it to stay that way.
>
>So that is what I have:
>
>IStream *pPict;
>
>This pointer holds a stream with an icon image. I load it to the
>IPictureDisp pointer:
>
>CComPtr<IPictureDisp> pPictureDisp;
>OleLoadPicture(pPict,0,TRUE,__uuidof(IPictureDisp),(LPVOID*)&pPictureDisp);
>CComQIPtr<IPicture> pPicture = pPictureDisp;
>
>Now I have a picture which is an icon (if I check the get_Type() method in
>IPicture interface it states that it is an icon.
>
>Okay so now I try to add this picture to a MS Office toolbar button. That
>is what I have from somewhere:
>
>_CommandBarButtonPtr pBtn
>
>So I just do:
>
>pBtn->PutPicture(pPictureDisp);
>
>And that just won't work. PutPicture method will throw an ilegal argument
>exception.
>
>So I try to render my icon to a bitmap by something like that. I create a
>DC, a bitmap, select the bitmap and then renders my icon to the DC. U
>
>I create a DC:
>
>HDC hScreenDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
>HDC hMemDC = CreateCompatibleDC(hScreenDC);
>HBITMAP hBMP = CreateCompatibleBitmap(hScreenDC, 16, 16);
>HGDIOBJ hOldBMP = SelectObject(hMemDC, hBMP);
>
>And render my image there
>OLE_XSIZE_HIMETRIC xsWidth;
>OLE_YSIZE_HIMETRIC ysHeight;
>pPicture->get_Width(&xsWidth);
>pPicture->get_Height(&ysHeight);
>RECT rcBounds={0,0,16,16};
>pPicture->Render(hMemDC,0,0,16,16,0,ysHeight,xsWidth,-ysHeight,&rcBounds);
>
>Now I try to use it with a PutPicture() method:
>
>PICTDESC pdBmp;
>pdBmp.cbSizeofstruct = sizeof(PICTDESC);
>pdBmp.picType = PICTYPE_BITMAP;
>pdBmp.bmp.hbitmap = hBMP;
>pdBmp.bmp.hpal = 0
>
>IPictureDispPtr pRenderedPicture;
>OleCreatePictureIndirect(&pdBmp, IID_IPictureDisp, TRUE, (LPVOID*)&pRenderedPicture);
>
>And ufff.. Finally I can use it with PutPicture():
>
>pBtn->PutPicture(pRenderedPicture);
>
>But all I see know is black squre. I think that is because I can't render
>from an icon to a bitmap because what I get there are an incompatible DCs.
>Or maybe I am wrong?
>
>I really don't want to load a bmp image from a file (which works) for some
>reasons. I want to use this stream which I have. But how can I convert it
>to bitmap to be able to use it with the PutPicture() method?
>
>I've been trying to do something with that issue for some hours and I just
>can't find a simple solution.
Joseph M. Newcomer [MVP]
email: newcomer(a)flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm