From: 11x22 on 24 Feb 2007 07:31 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 2 Mar 2007 00:50 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
|
Pages: 1 Prev: CToolTipCtrl and HitTest Next: Horizontal Scroll Bar Problem in CTreeCtrl |