CEdit 控制键盘操作

写在前面的话:在工作中要实现这样一个功能,在一个树形控件中选择要发送消息的客户,添加到一个列表控件中,点击确定跳到一个信息发送页面如下图,在发送人编辑框中显示选择的客户,要实现的就是即允许用户删除用户列表中的用户,但是又不能让用户只删除一个用户标识的一部分,所以要对键盘操作进行控制。

实现对键盘的控制,在网上搜了一下有两种方法,重载PreTranslateMessage()函数,或者添加OnKeddown事件处理函数,我选择的是第一种。代码如下:


 1 // 控制编辑框删除用户
2 BOOL SendMsgDlg::PreTranslateMessage(MSG* pMsg)
3 {
4 // TODO: 在此添加专用代码和/或调用基类
5 if(WM_KEYDOWN == pMsg->message && m_editClients.m_hWnd == pMsg->hwnd)
6 {
7 if(8 == pMsg->wParam)
8 {
9 POINT cp = m_editClients.GetCaretPos();
10 int xy = m_editClients.CharFromPos(cp);
11 int charIndex = LOWORD(xy);
12 if(charIndex <= 0)
13 {
14 return true;
15 }
16
17 CString strOld, strTemp;
18 m_editClients.GetWindowTextW(strOld);
19
20 if(strOld.GetAt(charIndex - 1) == _T(‘;‘))
21 {
22 strTemp = strOld.Left(charIndex - 1);
23 strTemp = strTemp.Right(strTemp.GetLength() - strTemp.ReverseFind(_T(‘;‘)) - 1);
24
25 char *pszIp = UnicodeToAscii(strTemp);
26 SendMessage(WM_DELETE, (WPARAM)pszIp, 0);
27
28 strTemp.Append(_T(";"));
29 int iSel = strOld.Find(strTemp);
30 strOld.Replace(strTemp, _T(""));
31 m_editClients.SetWindowTextW(strOld);
32 m_editClients.SetSel(iSel, iSel);
33 return true;
34 }
35 else
36 {
37 return true;
38 }
39 }
40 }
41
42 return CDialogEx::PreTranslateMessage(pMsg);
43 }

对代码稍微解释一下:

第5行代码是判断事件是否是发生在CEdit控件中的按键事件

第7行代码是判断按下的键是否是删除键,如果不是则返回true,表示这个按键消息不做处理。

其中9-11行代码是获取光标所在处的字符在CEdit控件值字符串中位置。

第17-32行代码是对字符串做处理,我的做法是寻找到‘;’号之间的字符串,并将之替换为空字符串,相当于删除它。

第25-26行代码是发送一个消息,告诉系统删除了一个用户,需要同步内存中的用户列表。

第33行代码是设置光标的位置。使用CEdit控件的SetSel()函数。

这样这个小功能就实现了,即如果在CEdit控件中删除字符,只有遇到的是分号时才能删除,并且删除从当前分号到前面一个分号之间所有的字符,如果删除的不是分号,则不能删除。

时间: 2024-08-28 06:30:49

CEdit 控制键盘操作的相关文章

实现javascript控制键盘同时按某些键时执行操作。

前言:之前知乎上看到过一个介绍国外炫酷网站的,其中一个敏感网站用同时按住"q.a.p.l" 才能观看视频 放手则立即强制停止 (手动斜眼).这个功能的实际用处,我认为是可以在做一些小系统的权限控制时可以采用,这样就免去做登录和权限相关的功能了. 例子1:同时按住"~.L.J.W." 时增加权限 1.1 js部分: //按键权限验证 var isCrawler = false;//爬虫权限 var keybuf = {}; function keydown(e) {

MFC List Control控件添加单元格编辑和单元格下拉列表项以适用于数据库相关操作

作为现代的软件,往往是连着数据库的,而连着和用户方便地操作之间,还有着界面这道坎.MFC是Windows上比较好开发用户界面的框架,然而其自带的控件中没有对于数据库表格支持较好的控件,而使用网上提到的 DataGrid 等控件在本人的win8.1+VS2013平台上老出现找不到控件或者头文件的问题,搞的烦死人.最后想到 List Control 控件只要稍作修改,加上单元格编辑和单元格下拉列表,其实就能和数据库进行良好的对接,一百度,果然有人已经做了这件事,实在是太让人感动了!       

对话框控件绑定变量及操作

对话框控件绑定变量 右键单击控件,添加变量. 复选框:添加变量为控件变量.可以操作控件. 列表框:选择添加变量的控件的ID. 列表框:选择添加的变量的类别,Control为控件控制类型.Value为关联值变量,可以设置数据验证 编辑框:添加的控件变量名. 复选框:不选中,则为控件关联一个变量.不可以操作控件. 列表框:选择关联变量类型. 编辑框:添加的控件变量名.  头文件中添加的变量 // CMFCTestDlg dialog class CMFCTestDlg : public CDialo

CEdit

CEdit类提供了Windows编辑控件中的功能.编辑控件是一个子窗口矩形,用户可以向其中输入文本. 可以通过对话模板或直接从代码中创建一个编辑控件.在两种情形下,首先调用CEdit构造程序构造CEdit对象,再调用Create成员函数创建Windows编辑控件并将其与CEdit对象连接. 构造在CEdit的派生类中可以单步实现.为派生类编写构造程序并从构造程序中调用Create. CEdit从CWnd继承了重要的功能,要在CEdit对象中设置或获取文本,使用CWnd成员函数SetWindowT

MFC常用的字符串、文件、目录操作(双11版本)

修改日志: 1.增加了list容器存储: 2.修改了IsFile 和 IsDir的实现,使区别于IfExistFile和IfExistDir; 3.修改了部分函数的名称: 4.其他细节修改: 首先是头文件: /* ******* StrDirFile.h ********** ********* 字符串.文件.目录操作函数声明 ********** */ /* author: autumoon */ #ifndef _STR_DIR_FILE_ #define _STR_DIR_FILE_ #p

CEdit控件[转]

1.CEdit.CButton等从CWnd继承了重要的功能,使用CWnd::SetWindowText和CWnd::GetWindowText可以设置和获得其上的文本, CWnd::SetFont可以设置文本字体.为了让编辑框控件接受换行符,必须设置该控件支持多行输入这一属性.若在对话框的OnInitDialog ()中设置焦点到编辑框控件上,OnInitDialog需返回FALSE. 2.CEdit::Create()用来初始化编辑控件.virtual BOOL Create( DWORD d

MATLAB命令大全和矩阵操作大全

转载自: http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在"[ ]"内: b.矩阵的同行元素之间用空格(或",")隔开: c.矩阵的行与行之间用";"(或回车符)隔开: d.矩阵的元素可以是数值.变量.表达式或函数: e.矩阵的尺寸不必预先定义. 二,矩阵的创建: 1.直接输

ExCEL通过添加些类操作

参考网站:http://www.cnblogs.com/yaowen/archive/2013/01/22/2870762.html 运用COM组件时,需要初始化: if (!AfxOleInit()) { AfxMessageBox("COM组件初始化失败!"); return FALSE; } VC2010对Excel的操作 1. 创建新的C++工程 创建基于对话框的MFC程序 2. 添加库.添加Excel类库 在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->

数据库的创建和操作

创建和操作数据库 1.创建数据库的基本要求 [1]主数据文件:一个数据库有,且只能有一个.扩展名是.mdf. [2]次要数据文件:可以根据需要添加多个,并且可以分布在不同的磁盘上.扩展名.ndf. [3]日志文件:有且至少有一个日志文件,也可以多个.扩展名是.ldf. 2.数据库创建要思考的问题 [1]数据容量:根据需要预估. [2]文件分布:根据容量大小,创建不同次要数据文件.分布存储. 3.基于T-SQL脚本创建数据库实例 1 use master--表示当前我们要在master数据库中操作