| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11212 人关注过本帖
标题:关于CEdit的EN_CHANGE消息?
只看楼主 加入收藏
新男孩
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2007-8-15
收藏
 问题点数:0 回复次数:8 
关于CEdit的EN_CHANGE消息?
我向实现在输入框中输入字串后,消息框显示我输入的字串.用了CEdit的EN_CHANGE消息处理函数,可是每次输入一个字符后,就有消息响应.代码如下:
void CSlaveDlg::OnChangeEditVolume()
{
    mp_editVolume = (CEdit*)GetDlgItem(IDC_EDIT_VOLUME);
    CString c_editVolume;
    mp_editVolume->GetWindowText(c_editVolume);
    HWND hWnd=GetFocus()->m_hWnd; //获得当前对话框句柄
    while(::GetMessage(pMsg,hWnd,NULL,NULL))
    {
        ::TranslateMessage(pMsg);
        if (WM_KEYFIRST <= pMsg-> message && pMsg-> message <= WM_KEYLAST)
        {
            if(pMsg-> wParam==VK_RETURN )
            {
                ::AfxMessageBox(c_editVolume);
                break;
            }
        }
    }    
}
我想当我输入完毕后才输出编辑框中的字串,请问能不能在这个函数中修改后实现?
或是这个方法就行不通?
搜索更多相关主题的帖子: CEdit CHANGE消息 pMsg editVolume hWnd 
2008-03-24 23:33
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
收藏
得分:0 
这个应该是不太可能实现的吧,电脑怎么会知道你输入完毕呢?,当然输入完后再按回车键/结尾+其它特殊符号做为输入结束就可以解决你的问题了,直接判断最后一个字符是不是结束符。

2008-03-25 09:36
PhryckDie
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2007-2-14
收藏
得分:0 
我想到一种比较麻烦的,但可能挺符合你的要求。

当EditChang函数响应时,设一个短时间的定时器,
第一次响应chang时创建一套计时设备,将输入的字符串取到一个buff里
在定时器时间内如果没有第二次EditChang发生就销毁计时设备,输出字符串
否则,将输入的字符串取到buff里,重置计时设备。

干嘛要这么干.....完全背弃交互式设计理念,还麻烦......
2008-03-25 10:36
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
是啊..呵呵..这样只给自己找麻烦..干吗不弄好在进行处理呢?

学习需要安静。。海盗要重新来过。。
2008-03-25 10:49
新男孩
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2007-8-15
收藏
得分:0 
对,我今天也想了想,没有什么用处,昨天一定是走火入魔了!
2008-03-25 18:54
xunxunmimi
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2006-12-12
收藏
得分:0 
还不如做个按钮,编辑框输入完毕后,点击安钮,显示消息框,将上面一段代码做为按钮的消息处理函数。
  或者按照上面说的在这段代码的开头加入标志符:
void CSlaveDlg::OnChangeEditVolume()
{
    mp_editVolume = (CEdit*)GetDlgItem(IDC_EDIT2);
    CString c_editVolume;
    mp_editVolume->GetWindowText(c_editVolume);
    if(c_editVolume.Right(1)!='\r')//如果输入的最后一个字符不是回车 符的话,就返回,不执行下面的语句
        return;
::AfxMessageBox(c_editVolume);
}
2008-03-26 08:58
xunxunmimi
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2006-12-12
收藏
得分:0 
补充
还有一个问题,就是当在编辑框中输入回车符的时候,主对话框就会被关闭,除非为编辑框的风格增加“多行”风格。但是当为编辑框的风格增加“多行”风格后编辑框却不对 回车键 和 退出 键产生响应。不知是什么原因。如果将上面代码中的结束符换成其他字符就能实现功能。
2008-03-26 09:44
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
收藏
得分:0 
回车会调用默认父对话框的IDOK函数。而默认的IDOK就是关闭对话框,因此需要在这里重载一下对话框的IDOK函数
该函数原形如下
virtual void OnOK();接着LZ在该函数中,直接返回什么都不做就OK了,
需要注意的是对话框还有一个默认的OnCancel函数,当按下ESC键时,会默认调用它,也会关闭对话框,有必要的话,也重载一下

2008-03-26 10:41
PhryckDie
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2007-2-14
收藏
得分:0 
你按回车实际上是响应了OnOk()函数,就像是单击了对话框开始的那个“确定”按钮效果是一样的(OnOk),即使你将那个确定按钮删除,回车时其实还是在相应那个函数。
解决方法,新建一个按钮把它设为默认按钮,或让editbox响应回车事件,不要让Dialog捕获,或重写最开始的那个确定按钮,时期消息响应函数不是OnOk().总之就是别去响应OnOk就行了,我推荐第一个方法,比较简单
2008-03-26 10:54
快速回复:关于CEdit的EN_CHANGE消息?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026337 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved