zoukankan      html  css  js  c++  java
  • 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控件中删除字符,只有遇到的是分号时才能删除,并且删除从当前分号到前面一个分号之间所有的字符,如果删除的不是分号,则不能删除。

  • 相关阅读:
    yii 引入文件
    CodeForces 621C Wet Shark and Flowers
    面试题题解
    POJ 2251 Dungeon Master
    HDU 5935 Car(模拟)
    HDU 5938 Four Operations(暴力枚举)
    CodeForces 722C Destroying Array(并查集)
    HDU 5547 Sudoku(dfs)
    HDU 5583 Kingdom of Black and White(模拟)
    HDU 5512 Pagodas(等差数列)
  • 原文地址:https://www.cnblogs.com/lit10050528/p/3732138.html
Copyright © 2011-2022 走看看