随笔 - 493  文章 - 0  评论 - 97  阅读 - 239万

实现编辑框的全选和取消全选

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

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

posted on   清清飞扬  阅读(4684)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
< 2010年11月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11

点击右上角即可分享
微信分享提示