c++ builder 实现表情和文字的混合发送

来源:互联网 发布:dns端口 编辑:程序博客网 时间:2024/05/08 19:42

1 imageole.dll  导入imageole.dll

2 插入图片方法

void TForm5::InsertPicture(WideString strFilePath,TRichEdit *edit,int i){ //WideString strFilePath = ExtractFilePath(Application->ExeName)+"1.png";   //ShowMessage(strFilePath);HWND hwndRichEdit = edit->Handle;LPLOCKBYTES  lpLockBytes  =  NULL;SCODE  sc;HRESULT  hr;//print  to  RichEdit'  s  IClientSiteLPOLECLIENTSITE  lpClientSite;//A  smart  point  to  IAnimatorIGifAnimatorPtr lpAnimator;//ptr  2  storageLPSTORAGE  lpStorage;//the  object  2  b  insert  2LPOLEOBJECT lpObject;//Create  lockbytessc = ::CreateILockBytesOnHGlobal(NULL,  TRUE,  &lpLockBytes);if  (sc != S_OK) RaiseLastOSError();assert(lpLockBytes != NULL);//use  lockbytes  to  create  storagesc = ::StgCreateDocfileOnILockBytes(lpLockBytes,STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);if(sc != S_OK){lpLockBytes->Release();lpLockBytes = NULL;RaiseLastOSError();}assert(lpStorage != NULL);//get  the  ClientSite  of  the  very  RichEditCtrlTComInterface<IRichEditOle> pRichEditOle;SendMessage(hwndRichEdit,EM_GETOLEINTERFACE,0,(LPARAM)&pRichEditOle);if(!pRichEditOle) RaiseLastOSError();pRichEditOle->GetClientSite(&lpClientSite);assert(lpClientSite != NULL);//Initlize  COM  interfacehr = ::CoInitialize(NULL);if( FAILED(hr) ) RaiseLastOSError();//Get  GifAnimator  object//here,  I  used  a  smart  point,  so  I  do  not  need  to  free  ithr  =  lpAnimator.CreateInstance(CLSID_GifAnimator);if( FAILED(hr) ) RaiseLastOSError();//Load  the  gifhr  = lpAnimator->LoadFromFile(strFilePath.c_bstr());if( FAILED(hr) ) RaiseLastOSError();//get  the  IOleObjecthr = lpAnimator->QueryInterface(IID_IOleObject, (void**)&lpObject);if( FAILED(hr) ) RaiseLastOSError();//Set  it  2  b  insertedOleSetContainedObject(lpObject, TRUE);//2  insert  in  2  richedit,  you  need  a  struct  of  REOBJECTREOBJECT reobject;ZeroMemory(&reobject, sizeof(REOBJECT));reobject.cbStruct = sizeof(REOBJECT);CLSID  clsid;sc = lpObject->GetUserClassID(&clsid);if (sc != S_OK) RaiseLastOSError();//set  clsidreobject.clsid  =  clsid;//can  be  selectedreobject.cp  =  REO_CP_SELECTION;//content,  but  not  staticreobject.dvaspect  =  DVASPECT_CONTENT;//goes  in  the  same  line  of  text  linereobject.dwFlags  =  REO_BELOWBASELINE;  //REO_RESIZABLE    |reobject.dwUser  =  i;//the  very  objectreobject.poleobj  =  lpObject;//client  site  contain  the  objectreobject.polesite  =  lpClientSite;//the  storagereobject.pstg = lpStorage;SIZEL  sizel;sizel.cx  =  sizel.cy  =  0;reobject.sizel  =  sizel;pRichEditOle->InsertObject(&reobject);::SendMessage(hwndRichEdit, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);VARIANT_BOOL  ret;//do  frame  changingret = lpAnimator->TriggerFrameChange();//show  itlpObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, lpClientSite, 0, hwndRichEdit,  NULL);lpObject->DoVerb(OLEIVERB_SHOW,  NULL,  lpClientSite,  0,  hwndRichEdit,  NULL);//redraw  the  window  to  show  animationRedrawWindow(hwndRichEdit,NULL,NULL,RDW_INVALIDATE|RDW_ERASE);if (lpClientSite){lpClientSite->Release();lpClientSite  =  NULL;}if  (lpObject){lpObject->Release();lpObject  =  NULL;}if  (lpStorage){lpStorage->Release();lpStorage  =  NULL;}::CoUninitialize();}
3 获取插入图片的位置和信息

TComInterface<IRichEditOle> pRichEditOle;SendMessage(RichEdit1->Handle,EM_GETOLEINTERFACE,0,(LPARAM)&pRichEditOle);int c = pRichEditOle->GetObjectCount();for(int i=0;i<c;i++){REOBJECT object;object.cbStruct = sizeof(REOBJECT);TComInterface<IRichEditOle> pRichEditOle1;SendMessage(RichEdit1->Handle,EM_GETOLEINTERFACE,0,(LPARAM)&pRichEditOle1); pRichEditOle1->GetObject(i,&object,REO_GETOBJ_ALL_INTERFACES) ; int pos = object.cp; DWORD dwuser = object.dwUser;}

4 根据位置信息进行字符串编码

TComInterface<IRichEditOle> pRichEditOle;SendMessage(RichEdit1->Handle,EM_GETOLEINTERFACE,0,(LPARAM)&pRichEditOle);int c = pRichEditOle->GetObjectCount();int pos,dwuser;for(int i=0;i<c;i++){REOBJECT object;object.cbStruct = sizeof(REOBJECT);TComInterface<IRichEditOle> pRichEditOle1;SendMessage(RichEdit1->Handle,EM_GETOLEINTERFACE,0,(LPARAM)&pRichEditOle1); pRichEditOle1->GetObject(i,&object,REO_GETOBJ_ALL_INTERFACES) ; pos = object.cp; dwuser = object.dwUser; String name = "%"+IntToStr(dwuser); str.Insert(name,pos+1+i*2);}ShowMessage(str);Show(str);
5 str即为最后的字符串
接收端:
void TForm5::Show(String str){   list_picture = new TList; String result = "";char   *m = str.c_str();   for(int i=0;i < str.Length();i++)   {   if( m[i] != '%')   {   result += m[i];   }   else//相等   {   result += " ";   NumPos *pos = new NumPos;   pos->position = i;   pos->num  = m[++i] ;   list_picture->Add(pos);   }   }RichEdit2->Text = result; RichEdit2->SetFocus(); int col; for(int i=0;i<list_picture->Count;i++) {              AnsiString str3="F:\\ico\\";NumPos *nps = (NumPos*)list_picture->Items[i]; SendMessage(RichEdit2->Handle,EM_SETSEL,nps->position+i,nps->position+i); String str4(nps->num); str3 += str4 +".bmp"; //ShowMessage(str3); InsertPicture(WideString(str3),RichEdit2,nps->num); }/*for(int i=0;i<list->Count;i++){delete (TPictureInfo*)list->Items[i];}delete list;*/for(int i=0;i<list_picture->Count;i++){delete (NumPos*)list_picture->Items[i];}  delete list_picture;  list_picture = NULL;  SendMessage(RichEdit2->Handle,EM_SETSEL,str.Length(),str.Length());


二 mfc版的
http://www.myexception.cn/vc-mfc/153340.html



0 0
原创粉丝点击