ATLでのIPictureDispとIPictureの相互変換とIPictureの描画
1291 ワード
ATLのアイテムのコントロールクラスのOnDraw関数で描画を行い、次のコードをOnDraw関数で実行します.
RECT& rc = *(RECT*)di.prcBounds;
CComPtr m_picdisp = NULL;//IPictureDisp
_bstr_t m_bstrImgUrl = "C:\\ \\1.bmp";//bmp
HRESULT hr = NOERROR;
PICTDESC pictDesc;
pictDesc.picType = PICTYPE_BITMAP;
pictDesc.bmp.hbitmap = (HBITMAP)::LoadImage(NULL, m_bstrImgUrl, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);// bmp
pictDesc.bmp.hpal = nullptr;
pictDesc.cbSizeofstruct = sizeof(PICTDESC);
if(!SUCCEEDED(hr = OleCreatePictureIndirect(&pictDesc, IID_IPictureDisp, TRUE, (LPVOID*)&m_picdisp)))// IPictureDisp
{
return S_FALSE;
}
CComPtr pIPic = NULL;
DWORD dwAttr;
if (SUCCEEDED(hr = m_picdisp->QueryInterface(IID_IPicture, (LPVOID*)&pIPic)))// IPictureDisp IPicture
{
pIPic->get_Attributes(&dwAttr);
if (dwAttr == S_OK)
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_XSIZE_HIMETRIC hmHeight;
pIPic->get_Width(&hmWidth);//
pIPic->get_Height(&hmHeight);//
// IPicture
pIPic->Render(di.hdcDraw,
rc.left,
rc.top,
rc.right - rc.left,
rc.bottom - rc.top,
0,
hmHeight,
hmWidth,
-hmHeight,
&rc);
}
}
return S_OK;