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饱受诟病,要改 ...
随机推荐
- jni java C/C++ 相互调用
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha java 中 声明 一个 native 方法 用javah命令 生成 包含 nativ ...
- codevs 1392 合并傻子
1392 合并傻子 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个园形操场的四周站着N个傻子,现要将傻子有 ...
- bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序
最大半联通子图对应缩点后的$DAG$上的最长链 复杂度$O(n + m)$ #include <cstdio> #include <cstring> #include < ...
- Tagging Problems & Hidden Markov Models---NLP学习笔记(原创)
本栏目来源于对Coursera 在线课程 NLP(by Michael Collins)的理解.课程链接为:https://class.coursera.org/nlangp-001 1. Taggi ...
- Java类实例化原理
Java对象的创建过程包括 类初始化(JVM类加载机制)和类实例化两个阶段. 一.Java对象创建时机 (1)使用new关键字创建对象 (2)反射创建对象 使用Class类的newInstance方法 ...
- 几种OutOfMemoryError
JAVA虚拟机OutOfMemoryError主要包括以下四类:java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryErro ...
- ExtJS ComboBox同时加载远程和本地数据
ExtJS ComboBox同时加载远程和本地数据 原文:http://gblog.hbcf.net/index.php/archives/233 ComboBox比较特殊需求,将远程数据和本地数据同 ...
- 解决Visual Studio 2015创建工程时的“DNX SDK version 'dnx-clr-win-x86.1.0.0-beta5' failed to install.”错误
前段时间发布了Visual Studio2015,在后,发现创建Asp.Net工程和时,出现了"DNX SDK version 'dnx-clr-win-x86.1.0.0-beta5' f ...
- Git 中文件的状态和流转区
Git的文件主要处于三种状态,分别是 staged, modified, committed. Git文件流转有三个区域,分别是 工作区域. 索引区域. 本地数据区域. 要修改对一个文件进行操作,首先 ...
- Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...