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

2016-01-29 12:07 10 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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


作者:北方工业大学 阙荣文 (querw)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)


下载源代码

一、引言
  用 MSN 和 QQ 等聊天的时候,当用户输入特定意义的字符串时,系统回自动用一张小图片替代.比如输入" : ) "系统
会用一个小笑脸代替。我要实现的就是这样一个信息输入框 。这个信息输入框由两部分组成:图案选择器和多功能文本框。本篇介绍多功能文本框。

二、原理简介

1、主要功能用CRichEditCtrl实现,像设置字体,设置字体颜色,字号等等CRichEditCtrl都提供了很完善的支持,我就不一一赘述了。

CRichEditCtrl 主要的不足在于以下几个方面:

(1).没有右键菜单 (2).不能插入图片(这是实现转义字符显示的关键) (3).RTF格式输入输出不够方便(涉及到回调函数的递归调用)

  我扩展了CRichEditCtrl类CRichEditCtrlEx实现了上述功能.参考了很多网上的文章,对所有公开源码的开发人员表示崇高的敬意!!

2、实现右键菜单:

///生成右键菜单

void CRichEditCtrlEx::OnRButtonUp(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call default//设置为焦点SetFocus();//创建一个弹出式菜单CMenu popmenu;popmenu.CreatePopupMenu();//添加菜单项目popmenu.AppendMenu(0, ID_RICH_UNDO, "&Undo");popmenu.AppendMenu(0, MF_SEPARATOR);popmenu.AppendMenu(0, ID_RICH_CUT, "&Cut");popmenu.AppendMenu(0, ID_RICH_COPY, "C&opy");popmenu.AppendMenu(0, ID_RICH_PASTE, "&Paste");popmenu.AppendMenu(0, ID_RICH_CLEAR, "C&lear");popmenu.AppendMenu(0, MF_SEPARATOR);popmenu.AppendMenu(0, ID_RICH_SELECTALL, "Select &All");popmenu.AppendMenu(0, MF_SEPARATOR);popmenu.AppendMenu(0, ID_RICH_SETFONT, "Select &Font");//初始化菜单项UINT nUndo=(CanUndo() ? 0 : MF_GRAYED );popmenu.EnableMenuItem(ID_RICH_UNDO, MF_BYCOMMAND|nUndo);UINT nSel=((GetSelectionType()!=SEL_EMPTY) ? 0 : MF_GRAYED) ;popmenu.EnableMenuItem(ID_RICH_CUT, MF_BYCOMMAND|nSel);popmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND|nSel);popmenu.EnableMenuItem(ID_RICH_CLEAR, MF_BYCOMMAND|nSel);UINT nPaste=(CanPaste() ? 0 : MF_GRAYED) ;popmenu.EnableMenuItem(ID_RICH_PASTE, MF_BYCOMMAND|nPaste);//显示菜单CPoint pt;GetCursorPos(&pt);popmenu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);popmenu.DestroyMenu();CRichEditCtrl::OnRButtonDown(nFlags, point);CRichEditCtrl::OnRButtonUp(nFlags, point);}
3、关于如何把图片插入到RichEdit中,国外由很多文章介绍,都是(我看到的都是)通过插入OLE对象来实现.主要用两个函数,还涉及到了和多接口的调用。

(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 objectsc = ::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("nnnThe following file, created inn""Simulation->Plot, may be missing duen""to not doing a File->Save Workspace:nn" );msg += szFileName;AfxMessageBox( msg, MB_OK );::LocalFree( lpMsgBuf );return;}// m_lpObject is currently an IUnknown, convert to IOleObjectif (m_lpObject != NULL){LPUNKNOWN lpUnk = m_lpObject;m_lpObject = QUERYI
                        

来源:https://www.tulaoshi.com/n/20160129/1484721.html

延伸阅读
手机QQ语音信息取消发送方法   1)打开手机QQ选择一位好友,点击右下角的。   2)按住不要开始说话,左右两边会出现两个小图标,拉到右边的图标,这时就可以松开手啦,语音信息就成功取消发送了。  
最终效果图 一、新建130x130文档,72px。 二、新建画一个圆制作头部,填充颜色#78B00A;如下图 三、复制第一部的层,ctrl+t 自由变换,高度和宽度设为95%;设置渐变颜色,如下图: 再设置图层样式;如下图: 拉个径向渐变,如下图: 四、新建一层,用钢笔勾画出如下图: 设置渐变颜色, ...
标签: PHP
在照彭武兴先生的《PHP BIBLE》中所述,header可以送出Status标头,如 <?php header("Status: 404 Not Found"); ? 就可以让用户浏览器出现文件找不到的404错误,但是我试了这样是不行的。 后来我到w3.org上查了http的相关资料,终于试出来了如何Header出状态代码(Status),与大家分享。 其实应该是这样的...
iPhone 6无法发送iMessage信息怎么办   在iPhone手机中,用户可想同样适用iPhone手机的用户发送iMessage信息,但在一些用户却出现无法发送iMessage信息的问题,对于该问题我们可通过下方图老师小编为您提供的方法来解决。 操作方法 打开设www.tulaoshi.com置-信息-发送与接收-开始新对话-选择apple id账户,完成。 ...
最终效果图 1、打开素材图片,新建一层,填充白色,在加黑色蒙板。 2、点击蒙板,滤镜-像素化-点状化,(值设为3)效果如图。 3、图像-调整-阈值调整,阈值色阶185。 4、击活蒙板,执行滤镜-模糊-动感模糊,(角度-45,距离:20) 5、按Ctrl+L 调出色阶,调整值如下图设置: 6、...

经验教程

767

收藏

74
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部