Edit Control响应全选(Ctrl+A)
MFC中的Edit控件用于输入数据,当输入的数据为大段数字的时候,全选功能就显得非常重要了,可偏偏在MFC中Edit控件就不 支持全选。Ctrl+A不行,双击也不行。
Ctrl+C和Ctrl+V都是默认支持的。因此为了使用方便,我们仅仅能自己让Edit去支持Ctrl+A全选 功能了。
实现的方式也比較简单,自己处理消息就是!
Ctrl+A是一个组合消息,在检測到A或者a按键按下的时候。推断Ctrl键的状态,假设Ctrl键有效则说明用户按下了Ctrl+A按键,这时候我们将Edit中内容设置为全选就可以。
在类定义中加入:
BOOL PreTranslateMessage(MSG* pMsg);
实现例如以下:
<span style="color:#444444;">BOOL C***Dlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
BOOL bCtrl = ::GetKeyState(VK_CONTROL) & 0x80;
//BOOL bShift = ::GetKeyState(VK_SHIFT) & 0x80;
//BOOL bAlt = ::GetKeyState(VK_MENU) & 0x80; switch (pMsg->wParam)
{
case 'a':
case 'A':
if (bCtrl)
{
</span><span style="color:#ff0000;">m_ctrLog.SetSel(0, -1); //或 SendDlgItemMessage(IDC_Log, EM_SETSEL, 0, -1);</span><span style="color:#444444;">
}
break;
}
} return CWnd::PreTranslateMessage(pMsg);
}</span>
或:
BOOL C***Dlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
BOOL b = GetKeyState(VK_CONTROL) & 0×80;
if(b && (pMsg->wParam==’a'||pMsg->wParam==’A'))
{
<span style="color:#ff0000;">SetSel(0,-1); //或 SendDlgItemMessage(IDC_Log, EM_SETSEL, 0, -1);</span>
return TRUE;
}
} return CWnd::PreTranslateMessage(pMsg);
}
备注:
为了避免对使用的Edit一个个的进行处理,能够通过从CEdit类派生一个新类CEditEx类让Edit支持Ctrl+A全选功能。
另外:
Ctrl + A 实现循环 全选/取消全选。尽管取消全选非常easy,一句话SetSel(-1),但难点在于怎样推断取消全选的条件。代码例如以下:
对于一个编辑框。实现它的全选和取消全选(前提:该编辑框获得焦点)
新建一个dialog based MFC application, 命名为“d1”。界面例如以下:

为对话框类加入一个成员变量:bool m_bSelectAll;用于控制全选状态。
另外重载对话框类的PreTranslateMessage事件,加入例如以下代码:
BOOL CD1Dlg::PreTranslateMessage(MSG*{ if((GetAsyncKeyState(VK_CONTROL)'A') { if(m_bSelectAll) { m_pEdit->SetSel(-1); // } else { m_pEdit->SetSel(0,// } m_bSelectAll return TRUE; } return CDialog::PreTranslateMessage(pMsg);} |
这样。当编辑框获得焦点时,假设再按下Ctrl+A,编辑框的内容就会被“全选”或“取消全选”。
可是上面以m_bSelectAll来作为推断是否“已经处于全选”状态有个问题,那就是当全选时,用户点击编辑框而取消了全选,但这时,m_bSelectAll却还处于全选状态,也就是说这个标志(m_bSelectAll)与实际的全选状态不一致。
所以採用了另外的方法来验证是否处于全选状态(就是选中内容的长度与编辑框内容长度是否一致)。代码例如以下:
BOOL CD1Dlg::PreTranslateMessage(MSG*{ if(pMsg->hwnd'A')) { CString int start, m_pEdit->GetWindowText(txt); m_pEdit->GetSel(start, if(txt.GetLength()// { m_pEdit->SetSel(-1); // } else { m_pEdit->SetSel(0,// } return TRUE; } return CDialog::PreTranslateMessage(pMsg);} |
说明:GetAsyncKeyState()仅仅检查一个键是否被按下,而不区分大写和小写!
Edit Control响应全选(Ctrl+A)的更多相关文章
- 【VB.NET】类绑定控件,实现文本框快捷键全选
Public Class KeyBinder Public Sub BindControl(ByRef CControl As TextBox) AddHandler CControl.KeyDown ...
- 【转】MFC 自定义edit 限制输入十六进制内容 响应复制粘贴全选剪切的功能
参考地址:MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能 Ctrl组合键ASCII码 ^Z代表Ctrl+z ASCII值 控制字符 AS ...
- VC++6.0/MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能
Ctrl组合键ASCII码 ^Z代表Ctrl+z ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符0(00) ...
- Java Swing 如何实现记事本中“编辑”菜单下的 剪切,复制,粘贴,删除,全选 功能
这篇文字将要学习以下知识点: 1.如何给JButton按钮添加鼠标点击事件监听器 #1.addMouseListener(MouseListener l) 给JButton添加一个鼠标点击监听器l ...
- WPF: 实现带全选复选框的列表控件
本文将说明如何创建一个带全选复选框的列表控件.其效果如下图: 这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成.它的操作逻辑: 当选中“全选”时,列表中所有的项目都 ...
- C#文本框中默认是不允许使用全选的
C#文本框中默认是不允许使用全选的.可以通过以下事件完成: private void textBox1_KeyDown(object sender, KeyEventArgs e) { i ...
- Creating Dialogbased Windows Application (4) / 创建基于对话框的Windows应用程序(四)Edit Control、Combo Box的应用、Unicode转ANSI、Open File Dialog、文件读取、可变参数、文本框自动滚动 / VC++, Windows
创建基于对话框的Windows应用程序(四)—— Edit Control.Combo Box的应用.Unicode转ANSI.Open File Dialog.文件读取.可变参数.自动滚动 之前的介 ...
- WPF实现带全选复选框的列表控件
本文将说明如何创建一个带全选复选框的列表控件.其效果如下图: 这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成.它的操作逻辑: 当选中“全选”时,列表中所有的项目都会被选中 ...
- Ctrl-A全选这点事(C#,WinForm)
所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...
随机推荐
- 高并发编程之ReentrantLock
上文学习jvm提供的同步方法synchronized的用法,一些常见的业务类型以及一道以前阿里的面试题,从中学习到了一些并发编程的一些规则以及建议,本文主要学习jdk提供的同步方法reentrantL ...
- Hibernate 对象的生命周期及CRUD操作
对象状态及生命周期 1.Transient(瞬时状态):new的对象为瞬时态 session中没有数据,数据库中没有数据. 2.Persistent(持久状态):被session管理的对象为持久状态, ...
- SPOJDRUIDEOI - Fata7y Ya Warda!【单调栈】
题目链接[http://www.spoj.com/problems/DRUIDEOI/en/] 题意:给出n个数,从1到n围城一个环(1和n相连),求每个数左边第一个比他大的第一个下标,右边第一个比他 ...
- Tomcat+Apache集群方案
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha # environment slash for Windows(反斜杠代表Windows ...
- [转][Android]Android数据的四种存储方式
android.database.sqlite类 SQLiteQueryBuilder java.lang.Object android.database.sqlite.SQLiteQueryBuil ...
- 如何监控ActiveMQ
如何监控ActiveMQ在ActiveMQ 4.x中你可以监控代理并查看使用了哪些目标,和连接一起的活动和订阅使用下面的工具进行查看: JMX和JMX控制台,如jConsole http://java ...
- 让ios项目同时支持ARC和非ARC
ttp://code4app.com/snippets/one/禁止某几个文件用ARC模式编译/502344256803fa246d000000#s0 如果你的绝大部分代码需要ARC,那么就设置项目支 ...
- POJ 3384 Feng Shui (半平面交)
Feng Shui Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3743 Accepted: 1150 Speci ...
- hadoop招聘需求每天都在添加,短短半个月时间,需求量差点儿翻了一番,这是大数据要爆发的节奏么?
近期常常关注企业hadoop招聘需求的动态变化,多说无益,直接上几张百度的截图: 4月20日: 4月22日: 4月27日: 5月8日:
- FastStone Capture 8.4 注册码
原文:https://blog.csdn.net/mlin_123/article/details/51557079 name:bluman serial/序列号/注册码:VPISCJULXUFGDD ...