converting icon to bitmap in memory
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.