Edit Control响应全选(Ctrl+A)

原创 2015年07月10日 14:18:19

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 实现循环 全选/取消全选,虽然取消全选很简单,一句话SetSel(-1),但难点在于如何判断取消全选的条件,代码如下:

对于一个编辑框,实现它的全选和取消全选(前提:该编辑框获得焦点)

新建一个dialog based MFC application, 命名为“d1”,界面如下:

为对话框类添加一个成员变量:bool m_bSelectAll;用于控制全选状态。另外重载对话框类的PreTranslateMessage事件,添加如下代码:

BOOL CD1Dlg::PreTranslateMessage(MSG* pMsg)
{
    if((GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState('A') & 0x8000) && pMsg->hwnd == m_pEdit->m_hWnd)
    {
        if(m_bSelectAll)
        {
            m_pEdit->SetSel(-1);         // 取消全选
        }
        else
        {
            m_pEdit->SetSel(0, -1);          // 全选
        }
        m_bSelectAll = !m_bSelectAll;
        return TRUE;
    }
     
    return CDialog::PreTranslateMessage(pMsg);
}

这样,当编辑框获得焦点时,如果再按下Ctrl+A,编辑框的内容就会被“全选”或“取消全选”。

但是上面以m_bSelectAll来作为判断是否“已经处于全选”状态有个问题,那就是当全选时,用户点击编辑框而取消了全选,但这时,m_bSelectAll却还处于全选状态,也就是说这个标志(m_bSelectAll)与实际的全选状态不一致。

所以采用了另外的方法来验证是否处于全选状态(就是选中内容的长度与编辑框内容长度是否一致),代码如下:

BOOL CD1Dlg::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->hwnd == m_pEdit->m_hWnd && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(_T('A')) & 0x8000))
    {
        CString txt;
        int start, end;
         
        m_pEdit->GetWindowText(txt);
        m_pEdit->GetSel(start, end);
        if(txt.GetLength() == end - start)  // 处于全选状态
        {
            m_pEdit->SetSel(-1);         // 取消全选
        }
        else
        {
            m_pEdit->SetSel(0, -1);          // 全选
        }
        return TRUE;
    }
     
    return CDialog::PreTranslateMessage(pMsg);
}

 

说明:GetAsyncKeyState()只检查一个键是否被按下,而不区分大小写!



版权声明:本文为博主原创文章,未经博主允许不得转载。

MFC中CEdit控件使用SetSel无法取消全选状态解决办法

问题背景:      我的对话框里只含有一个CEdit 控件,在对话框初始化时,我会载入外部文件的内容到Edit控件中。      在代码中我明明正确调用了CEdit的SetSel方法,但...
  • qing666888
  • qing666888
  • 2016年11月17日 17:29
  • 797

C#文本框允许使用ctrl+A

C#文本框中默认是不允许使用全选的。可以通过以下事件完成: private void textBox1_KeyDown(object sender, KeyEventArgs e) { TextBo...
  • dongzhe8
  • dongzhe8
  • 2016年11月26日 16:48
  • 1162

关于EDIT等控件不能响应CTRL+V和CTRL+C的解决

 有时候自己添加的一些控件不能响应CTRL+V和CTRL+C等快捷键,比如在框架里添加的文本域或在FORMVIEW里的控件等,我想这应该是因为MFC里没有对这些操作进行支持的缘故,要想彻底解决就要自己...
  • xiaoyao888
  • xiaoyao888
  • 2006年08月01日 22:31
  • 836

MFC Edit控件之enter回车捕捉

MFC Edit控件之enter回车捕捉 1、 构建基本框架 当输入框检测到enter按下,输入框数值将赋值到相关变量并在对应输出框显示。 2、 添加相关变量 四个Edit控件ID依次为: IDC_...
  • Cracent
  • Cracent
  • 2016年03月26日 13:11
  • 2708

MFC->Edit Control控件基本使用

介绍使用Edit Control控件进行基本的输入和显示,其他功能有待补充。使用MFC应用程序开发流程: 1.创建基于对话框的应用程序框架(修改对话框属性) 2.给对话框添加控件(设置唯一ID) 3....
  • xAston
  • xAston
  • 2016年03月16日 00:32
  • 3354

MFC中Edit控件的用法整理

MFC中Edit用法整理 众所周知,现在微软出台的编译器已经很多了,如vc++6.0,vs2005,vs2008,vs2010等,虽然变化多样,但是万变不离其根本,最根本用法没有多大变化。打开你所安...
  • leiyang2014
  • leiyang2014
  • 2017年01月02日 14:05
  • 4251

MFC(VS2010)编程实例之一(Edit Control控件)

Edit Control是在MFC对话框中最频繁的使用的控件之一,获取Edit Control与赋值是常见的操作。...
  • u013035197
  • u013035197
  • 2014年07月05日 23:21
  • 5868

[MFC]如何改变对话框EDIT Control内控件的字体?

[MFC]如何改变对话框EDIT Control内控件的字体?  (2012-09-19 11:47:55) 转载▼ 标签:  it 分类: 计算机 ...
  • JTZP007
  • JTZP007
  • 2014年04月09日 11:19
  • 1788

mfc现实edit控件输入限制(只能输入数字和小数点)

软件开发工具:vs2010 前段时间的一个项目需要显示温度值,需要计算热敏电阻端adc采样值和温度的一一对应关系,因为计算量大,就想到自己写一个简单的计算器方便计算。这写代码过程中,需要处理edi...
  • u012568663
  • u012568663
  • 2016年07月05日 10:58
  • 3140

MFC Edit Control 鼠标离开编辑框时显示消息

开发环境:Visual Studio 2010 应用程序:MFC Application 笔记主要包含Edit Control控件的常用设置、多个Edit Control控件输入时单独判断...
  • qq_31209383
  • qq_31209383
  • 2016年03月18日 16:36
  • 2085
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Edit Control响应全选(Ctrl+A)
举报原因:
原因补充:

(最多只允许输入30个字)