//接口函数 STDMETHODIMP CObj::init() { // TODO: Add your implementation code here initPic(m_pPicture,"F:\\obj.bmp"); return S_OK; } //初始化m_pPicture的函数 void CObj::initPic(CComPtr<IPictureDisp> &pPicture,LPCTSTR path) { using namespace std; long cb; fstream file(path, ios_base::in); file.seekg(0, ios::end); cb = file.tellg(); CComPtr<IStream> pStm; HGLOBAL hGlob = GlobalAlloc(GHND, cb); LPVOID pvData = NULL; if (hGlob ) { if ((pvData = GlobalLock(hGlob )) != NULL) { file.seekg(0,ios::beg); file.read((char*)pvData,cb); GlobalUnlock(hGlob ); CreateStreamOnHGlobal(hGlob , TRUE, &pStm); } } m_pPicture = NULL; OleLoadPicture(pStm,cb,FALSE,IID_IPictureDisp,(LPVOID*)&m_pPicture); pStm.Release(); GlobalFree(hGlob ); file.close(); this->m_bRequiresSave = TRUE; this->FireOnChanged(DISPID_PICTURE); this->FireViewChange(); } //绘制图片的函数 void CObj::drawPic(ATL_DRAWINFO& di) { RECT& rc = *(RECT*)di.prcBounds; LPPICTURE pPict ; DWORD dwAttr ; OLE_XSIZE_HIMETRIC cxSrc; OLE_YSIZE_HIMETRIC cySrc; if ((m_pPicture != NULL) &&SUCCEEDED(m_pPicture->QueryInterface(IID_IPicture, (LPVOID*)&pPict))) { pPict->get_Attributes(&dwAttr); if(dwAttr==S_OK) { pPict->get_Width(&cxSrc); pPict->get_Height(&cySrc); pPict->Render(di.hdcDraw,rc.left, rc.top, rc.right, rc.bottom,0,0,cxSrc,cySrc,&rc); } } } // HRESULT OnDraw(ATL_DRAWINFO& di) { RECT& rc = *(RECT*)di.prcBounds; Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE); LPCTSTR pszText = _T("ATL 3.0 : Obj"); TextOut(di.hdcDraw, (rc.left + rc.right) / 2, (rc.top + rc.bottom) / 2, pszText, lstrlen(pszText)); drawPic(di); //通过这句绘制 return S_OK; }

|