• CEdit 控制键盘操作


    写在前面的话:在工作中要实现这样一个功能,在一个树形控件中选择要发送消息的客户,添加到一个列表控件中,点击确定跳到一个信息发送页面如下图,在发送人编辑框中显示选择的客户,要实现的就是即允许用户删除用户列表中的用户,但是又不能让用户只删除一个用户标识的一部分,所以要对键盘操作进行控制。

    实现对键盘的控制,在网上搜了一下有两种方法,重载PreTranslateMessage()函数,或者添加OnKeddown事件处理函数,我选择的是第一种。代码如下:

     1 // 控制编辑框删除用户
     2 BOOL SendMsgDlg::PreTranslateMessage(MSG* pMsg)
     3 {
     4     // TODO: 在此添加专用代码和/或调用基类
     5     if(WM_KEYDOWN == pMsg->message && m_editClients.m_hWnd == pMsg->hwnd)
     6     {
     7         if(8 == pMsg->wParam)
     8         {
     9             POINT cp = m_editClients.GetCaretPos();
    10             int xy = m_editClients.CharFromPos(cp);
    11             int charIndex = LOWORD(xy);
    12             if(charIndex <= 0)
    13             {
    14                 return true;
    15             }
    16 
    17             CString strOld, strTemp;
    18             m_editClients.GetWindowTextW(strOld);
    19 
    20             if(strOld.GetAt(charIndex - 1) == _T(';'))
    21             {
    22                 strTemp = strOld.Left(charIndex - 1);
    23                 strTemp = strTemp.Right(strTemp.GetLength() - strTemp.ReverseFind(_T(';')) - 1);
    24 
    25                 char *pszIp = UnicodeToAscii(strTemp);
    26                 SendMessage(WM_DELETE, (WPARAM)pszIp, 0);
    27 
    28                 strTemp.Append(_T(";"));
    29                 int iSel = strOld.Find(strTemp);
    30                 strOld.Replace(strTemp, _T(""));
    31                 m_editClients.SetWindowTextW(strOld);
    32                 m_editClients.SetSel(iSel, iSel);
    33                 return true;
    34             }
    35             else
    36             {
    37                 return true;
    38             }
    39         }
    40     }
    41 
    42     return CDialogEx::PreTranslateMessage(pMsg);
    43 }

    对代码稍微解释一下:

    第5行代码是判断事件是否是发生在CEdit控件中的按键事件

    第7行代码是判断按下的键是否是删除键,如果不是则返回true,表示这个按键消息不做处理。

    其中9-11行代码是获取光标所在处的字符在CEdit控件值字符串中位置。

    第17-32行代码是对字符串做处理,我的做法是寻找到‘;’号之间的字符串,并将之替换为空字符串,相当于删除它。

    第25-26行代码是发送一个消息,告诉系统删除了一个用户,需要同步内存中的用户列表。

    第33行代码是设置光标的位置。使用CEdit控件的SetSel()函数。

    这样这个小功能就实现了,即如果在CEdit控件中删除字符,只有遇到的是分号时才能删除,并且删除从当前分号到前面一个分号之间所有的字符,如果删除的不是分号,则不能删除。

  • 相关阅读:
    重载和重写的定义
    方法的重载与重写有什么区别?
    java: while 和do while区别
    java中的运算符
    java 8种基本数据类型
    java.面向对象特征
    java语言的特点
    java.注释类型
    char 和 varchar2 区别
    使用sql对数据库进行简单的增删改查
  • 原文地址:https://www.cnblogs.com/lit10050528/p/3732138.html
Copyright © 2020-2023  润新知