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*
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()仅仅检查一个键是否被按下,而不区分大写和小写!

Edit Control响应全选(Ctrl+A)的更多相关文章

  1. 【VB.NET】类绑定控件,实现文本框快捷键全选

    Public Class KeyBinder Public Sub BindControl(ByRef CControl As TextBox) AddHandler CControl.KeyDown ...

  2. 【转】MFC 自定义edit 限制输入十六进制内容 响应复制粘贴全选剪切的功能

    参考地址:MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能   Ctrl组合键ASCII码 ^Z代表Ctrl+z                     ASCII值 控制字符  AS ...

  3. VC++6.0/MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能

    Ctrl组合键ASCII码 ^Z代表Ctrl+z                     ASCII值 控制字符  ASCII值 控制字符  ASCII值 控制字符  ASCII值 控制字符0(00) ...

  4. Java Swing 如何实现记事本中“编辑”菜单下的 剪切,复制,粘贴,删除,全选 功能

    这篇文字将要学习以下知识点: 1.如何给JButton按钮添加鼠标点击事件监听器 #1.addMouseListener(MouseListener l)  给JButton添加一个鼠标点击监听器l ...

  5. WPF: 实现带全选复选框的列表控件

    本文将说明如何创建一个带全选复选框的列表控件.其效果如下图:     这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成.它的操作逻辑: 当选中“全选”时,列表中所有的项目都 ...

  6. C#文本框中默认是不允许使用全选的

    C#文本框中默认是不允许使用全选的.可以通过以下事件完成:  private void textBox1_KeyDown(object sender, KeyEventArgs e) {      i ...

  7. 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.文件读取.可变参数.自动滚动 之前的介 ...

  8. WPF实现带全选复选框的列表控件

    本文将说明如何创建一个带全选复选框的列表控件.其效果如下图: 这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成.它的操作逻辑: 当选中“全选”时,列表中所有的项目都会被选中 ...

  9. Ctrl-A全选这点事(C#,WinForm)

    所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...

随机推荐

  1. 高并发编程之ReentrantLock

    上文学习jvm提供的同步方法synchronized的用法,一些常见的业务类型以及一道以前阿里的面试题,从中学习到了一些并发编程的一些规则以及建议,本文主要学习jdk提供的同步方法reentrantL ...

  2. Hibernate 对象的生命周期及CRUD操作

    对象状态及生命周期 1.Transient(瞬时状态):new的对象为瞬时态 session中没有数据,数据库中没有数据. 2.Persistent(持久状态):被session管理的对象为持久状态, ...

  3. SPOJDRUIDEOI - Fata7y Ya Warda!【单调栈】

    题目链接[http://www.spoj.com/problems/DRUIDEOI/en/] 题意:给出n个数,从1到n围城一个环(1和n相连),求每个数左边第一个比他大的第一个下标,右边第一个比他 ...

  4. Tomcat+Apache集群方案

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha # environment slash for Windows(反斜杠代表Windows ...

  5. [转][Android]Android数据的四种存储方式

    android.database.sqlite类 SQLiteQueryBuilder java.lang.Object android.database.sqlite.SQLiteQueryBuil ...

  6. 如何监控ActiveMQ

    如何监控ActiveMQ在ActiveMQ 4.x中你可以监控代理并查看使用了哪些目标,和连接一起的活动和订阅使用下面的工具进行查看: JMX和JMX控制台,如jConsole http://java ...

  7. 让ios项目同时支持ARC和非ARC

    ttp://code4app.com/snippets/one/禁止某几个文件用ARC模式编译/502344256803fa246d000000#s0 如果你的绝大部分代码需要ARC,那么就设置项目支 ...

  8. POJ 3384 Feng Shui (半平面交)

    Feng Shui Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3743   Accepted: 1150   Speci ...

  9. hadoop招聘需求每天都在添加,短短半个月时间,需求量差点儿翻了一番,这是大数据要爆发的节奏么?

    近期常常关注企业hadoop招聘需求的动态变化,多说无益,直接上几张百度的截图: 4月20日: 4月22日: 4月27日: 5月8日:

  10. FastStone Capture 8.4 注册码

    原文:https://blog.csdn.net/mlin_123/article/details/51557079 name:bluman serial/序列号/注册码:VPISCJULXUFGDD ...