WEB开发网
开发学院软件开发VC 类似MSN信息发送框的制作(上) 阅读

类似MSN信息发送框的制作(上)

 2007-10-07 20:23:21 来源:WEB开发网   
核心提示:(1)从文件创建OLE对象OleCreateFromFile();void CRichEditCtrlEx::InsertBitmap(CString szFileName){ USES_CONVERSION; SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &m_

(1)从文件创建OLE对象OleCreateFromFile();

void CRichEditCtrlEx::InsertBitmap(CString szFileName)
{
   USES_CONVERSION;
   SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &m_lpLockBytes);
   if (sc != S_OK)
     AfxThrowOleException(sc);
   ASSERT(m_lpLockBytes != NULL);
  
   sc = ::StgCreateDocfileOnILockBytes(m_lpLockBytes,
     STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &m_lpStorage);
   if (sc != S_OK)
   {
     VERIFY(m_lpLockBytes->Release() == 0);
     m_lpLockBytes = NULL;
     AfxThrowOleException(sc);
   }
  
   // attempt to create the object
   sc = ::OleCreateFromFile(CLSID_NULL, T2COLE(szFileName),
     IID_IUnknown, OLERENDER_DRAW, NULL, NULL,
     m_lpStorage, (void **)&m_lpObject);
   if ( sc != S_OK )
   {
     TCHAR * lpMsgBuf;
     ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
       FORMAT_MESSAGE_FROM_SYSTEM, NULL,
       ::GetLastError(),
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
       (LPTSTR) &lpMsgBuf, 0, NULL );
     CString msg( lpMsgBuf );
     msg += _T("\n\n\nThe following file, created in\n"
       "Simulation->Plot, may be missing due\n"
       "to not doing a File->Save Workspace:\n\n" );
     msg += szFileName;
     AfxMessageBox( msg, MB_OK );
     ::LocalFree( lpMsgBuf );
     return;
   }
  
   // m_lpObject is currently an IUnknown, convert to IOleObject
   if (m_lpObject != NULL)
   {
     LPUNKNOWN lpUnk = m_lpObject;
     m_lpObject = QUERYINTERFACE(lpUnk, IOleObject);
     lpUnk->Release();
     if (m_lpObject == NULL)
       AfxThrowOleException(E_OUTOFMEMORY);
   }
  
   // cache the IViewObject interface
   m_lpViewObject = QUERYINTERFACE(m_lpObject, IViewObject2);
   if (m_lpViewObject == NULL)
     return;
  
   // setup for advises; we assume that OLE cleans them up properly
   LPADVISESINK lpAdviseSink =
     (LPADVISESINK)GetInterface(&IID_IAdviseSink);
  
   // set up view advise
   VERIFY(m_lpViewObject->SetAdvise(DVASPECT_CONTENT, 0, lpAdviseSink)
     == S_OK);
  
   // the server shows these in its user-interface
   // (as document title and in File Exit menu)
   m_lpObject->SetHostNames(T2COLE(AfxGetAppName()),
     T2COLE(_T("Test")));
  
   // all items are "contained" -- this makes our reference to this object
   // weak -- which is needed for links to embedding silent update.
   OleSetContainedObject(m_lpObject, TRUE);
  
   CHARRANGE cr;
   this->GetSel( cr );
   cr.cpMin = cr.cpMax -1;
   this->SetSel( cr );
  
   REOBJECT reo;
   memset( &reo, 0, sizeof( reo ) );
   reo.cbStruct = sizeof( reo );
   CLSID classID;
   if ( m_lpObject->GetUserClassID( &classID ) != S_OK)
     classID = CLSID_NULL;
   reo.clsid = classID;
   reo.cp = REO_CP_SELECTION;
   reo.poleobj = m_lpObject;
   reo.pstg = m_lpStorage;
   LPOLECLIENTSITE lpClientSite;
   this->GetIRichEditOle()->GetClientSite( &lpClientSite );
   reo.polesite = lpClientSite;
   SIZEL sizel;
   sizel.cx = sizel.cy = 0; // let richedit determine initial size
   reo.sizel = sizel;
   reo.dvaspect = DVASPECT_CONTENT;
   reo.dwFlags = REO_RESIZABLE;
   reo.dwUser = 0;
   HRESULT hr = this->GetIRichEditOle()->InsertObject( &reo );
  
}

(2)根据位图句柄创建OleCreateStaticFromData();用这个函数可以把资源中的图片插入到文本框中

Tags:类似 MSN 信息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接