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;