类似 MSN 带转义字符的信息发送框的制作(下)

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

类似 MSN 带转义字符的信息发送框的制作(下),类似 MSN 带转义字符的信息发送框的制作(下)

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

类似 MSN 带转义字符的信息发送框的制作(下)


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

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


下载源代码

一、实现了上回说到的多功能文本框之后,接下去的任务就是做一个表情符号选择器。CIconPicker。

说明:本来是想实现图标选择的,但是后来有需要改成了位图选择器,但是类名没有改过来,还是叫 CIconPicker。附带工程中有图标选择器。

二、图标/位图选择器(以下简称选择器)的实现原理

  当用户按下选择器的时候,应该把所有的图像用一个图片列表显示出来;如果用户选择了其中一个图片,则记录该图片的编号,并把图片列表关闭。如果用户没有选择图片 ,那么直接把图片列表关闭 ( 响应 WM_KILLFOCUS 消息 )。
  首先,从 CButton 派生一个类 CIconPicker 。给它增加一些成员用来实现"选择器"的功能。如下所述:

1、图片列表:CArray 存放所有下拉图片,每个图片都有一个编号,即它在图片数组中的序号 2、GetBitmapAt():顾名思义,按序号获取图片 3、AddBitmap():添加一张图片 4、GetCurrentBitmapIndex():返回选中图片的序号

当 CIconPicker 收到 WM_LBUTTONDOWN 消息时先不忙给父窗体发送 WM_COMMAND消息 ,而是创建一个图片列表CIconContainer(容器),然后在容器上面创建和图片数量一样多的按钮,每个按钮显示一张图片。当然,为了
实现这个功能还得从CButton再派生一个类CInnerButton用来显示图片,感应鼠标事件。

三、源代码说明

1、创建容器

void CIconPicker::OnLButtonDown(UINT nFlags, CPoint point) {if(m_bState) return ;m_bState=TRUE;this->SetState(TRUE);RECT rect;this->GetWindowRect(&rect);POINT pt;pt。x=rect。left;pt。y=rect。bottom;//创建一个图片列表容器m_pIconContainer=new CIconContainer;///把图片数组当作参数传过去if(m_pIconContainer->Create(pt,this,&m_BitmapArray)){m_pIconContainer->ShowWindow(SW_SHOW);m_pIconContainer->UpdateWindow();m_pIconContainer->SetFocus();}}
2、为每一张图片在容器内创建一个按钮CInnerButton。我把这个工作交给容器来完成。重载容器(CIconContainer)的Create()函数,如下:
BOOL CIconContainer::Create(POINT pt,CButton* pParentButton,CArray *pBitmapArray) {if(pBitmapArray->GetSize()<=0)return FALSE;m_pParentButton=pParentButton;///根据每张图片的大小创建IconContainerm_nCol=int(sqrt(pBitmapArray->GetSize()))+1;    //计算列数BITMAP bm;pBitmapArray->GetAt(0)->GetBitmap(&bm);   //以图片列表中的第0号图片的大小为基准m_nCellWidth=bm。bmWidth+4;      //内部单元的宽度m_nCellHeight=bm。bmHeight+4;     //内部单元的高度CRect rect;rect。left=pt。x,rect。top=pt。y;rect。right=pt。x+m_nCellWidth*m_nCol;   //容器的宽度if(pBitmapArray->GetSize()%m_nCol==0)   //计算行数{m_nRow=pBitmapArray->GetSize()/m_nCol;}else{m_nRow=pBitmapArray->GetSize()/m_nCol+1;}rect。bottom=pt。y+m_nCellHeight*m_nRow+2+46;  ///容器的高度=(行数+2)*单元宽度//pParentButton->GetParent()->ScreenToClient(&rect);///创建容器//CWnd::Create(NULL, NULL, WS_VISIBLE | WS_CHILD,//rect,pParentButton->GetParent(),IDC_ICONCONTAINER, NULL);CWnd::CreateEx(WS_EX_LEFT,AfxRegisterWndClass(0),NULL,WS_VISIBLE|WS_POPUP,rect,NULL,NULL );///创建图片张数+2个按钮for(int i=0;i<m_nRow;i++){for(int j=0;j<m_nCol&& i*m_nCol+j<pBitmapArray->GetSize();j++){///计算按钮的位置CRect innerrect;innerrect。left=j*m_nCellWidth;innerrect。top=i*m_nCellHeight;innerrect。right=innerrect。left+m_nCellWidth;innerrect。bottom=innerrect。top+m_nCellHeight;innerrect。DeflateRect(2,2);///新建按钮CInnerButton *pInnerButton;pInnerButton=new CInnerButton;pInnerButton->Create(NULL,WS_CHILD |WS_VISIBLE,innerrect,this,IDC_INNERBUTTON+i*m_nCol+j);///设置按钮的图标pInnerButton->SetBitmap(pBitm
                        

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

延伸阅读
随着网络应用的不断推广,电子邮件越来越多的被大家使用。 !-- frame contents -- !-- /frame contents -- 虽然我们往往将电子邮件与 FoxMail、Outlook 这样的电子邮件客户端联系起来,但是往往我们也需要自己编程实现发送接收邮件,例如在一个网站注册用户后网站发出的回执mail,或者在网络购物的时候,在完成订单后的几分钟...
标签: 办公软件
在使用Word编写文档的时候,如果发现有些数字序号不够用(如带圈的数字序号等);还有经常向上级单位、出口管理等部门或行业填报固定格式(一般是提供样表,不允许用手写填报,只能使用微机按照样表打印填报)的报表中要求输入带有方块的身份证号码。碰到这些特殊字符和符号,在Word中采用...
标签: Web开发
.tableBorder7{width:800;solid; background-color: #000000;} TD{font-family: 宋体;font-size: 12px;line-height : 15px ;} th{background-color: #f7f7f7;color: #000000;font-size: 12px;font-weight:bold;} th.th1{background-color: #333333;} td.TableBody7{background-color: #B1EA45;} 蝶恋花 [Ctrl+A 全选 注:如需引...
标签: PHP
  参考了一下网上的文章。俗话说,天下文章一大抄,看你会抄不会抄。关键是能为我所用,这是最重要的。废话不多讲,let‘s go。 其实发mail很简单,php有现成的函数,可以参考php 的 manual,特别是第四个例子,讲的很详细。 关键是怎么把上传附件跟邮件发送结合起来。关于文件的上传,可以参考http://blog.csdn.net/slamdunk3/archive...
标签: 服务器
Linux Shell 通配符、元字符、转义符使用实例介绍   下面是一个实例: 代码如下: [chengmo@localhost ~/shell]$ ls a.txt b.txt c.old #2 [chengmo@localhost ~/shell]$ ls *.txt a.txt b.txt #3 [chengmo@localhost ~/shell]$ ls d*.txt ls: 无法访问 d*.txt: 没有那个文件或目录 ...

经验教程

263

收藏

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