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
- c++ builder 实现表情和文字的混合发送
- 完整实例实现QQ表情的发送和接收
- 完整实例实现QQ表情的发送和接收
- 运用spinner和正则表达式pattern来实现文字中表情文字的替换
- Android学习笔记:完整实例实现QQ表情的发送和接收
- Android学习笔记:完整实例实现QQ表情的发送和接收
- flex现实表情文字发送功能
- Flash builder邮件发送的实现
- 图片和文字的混合显示
- 文字和上传混合的表单提交
- Android开发笔记之发送小表情的实现
- ARM Bootloader 的实现-------C 和ASM 混合编程
- 使用#ifdef _cplusplus 实现c 和 c++的混合编程
- 利用C++Builder中的IdSMTP和IdMessage控件发送电子邮件
- C++、VC++和C++Builder的区别
- android textview 显示表情和文字 表情带超链接
- iOS推送:Java服务器端发送表情(绘文字)
- iOS推送:Java服务器端发送表情(绘文字)
- C++ primer plus(sixth edition) 编程练习答案(answers for programing exercises)第七章(chapter 7) 6-10
- 数据结构实验之二叉树的建立与遍历
- NYOJ 119 士兵杀敌(三)
- Opencv 多通道矩阵的访问
- 2 4 8位BMP转24位BMP(代码)
- c++ builder 实现表情和文字的混合发送
- 一台空调倒要看看
- 嵌入式开发中的常见问题
- 趣谈软件产品的一生
- 坚持写博客的人都有一颗执着的心
- canvas像素级操作实现滤镜之反色滤镜、黑白滤镜
- linux源代码(一)
- postgres创建用户,修改用户密码,创建数据库
- J2EE——Jsp的学习