各位朋友请多指教帮忙, 我不知该如何处理, 我现在非常郁闷.我想用EN_CHANGE 事件做如下的数据查询:
(用全拼输入法)输入 '你' 时
触发一次EN_CHANGE 事件
做查询 SELECT * FROM ... WHERE ... LIKE '%你'...输入 '你好' 时
触发一次EN_CHANGE 事件
做查询 SELECT * FROM ... WHERE ... LIKE '%你好'...但事实却是这样:void CTestDlg::OnEnChangeEdit3()
{
CString str; // 触发后得到CEdit的内容
GetDlgItem(IDC_EDIT3)->GetWindowText(str); // 触发后CEdit的内容
::AfxMessageBox(str);
}我想在用全拼输入法时,输入词组时 (nihao 1.'你好' 2... 3...) 选择1时, CEdit 的显示的内容为 '你好' EN_CHANGE 事件只触发一次, 做一次查询, 然而输入一词组 '你好' 时, 触发了两次 EN_CHANGE 事件
第一次 str 的内容为 '你好',
第二次 str 的内容为 '你',
控件显示的是 '你好'.问题:
1:
这导致我每次做查询时, 条件不对, 第一次为'你好%',第二次为'你%',
多了一次还不说, 顺序也不对, 为什么顺序不是 ('你' '你好') ?2:
有什么办法输入一词组(有多字)只触发一次EN_CHANGE 事件?
(用全拼输入法)输入 '你' 时
触发一次EN_CHANGE 事件
做查询 SELECT * FROM ... WHERE ... LIKE '%你'...输入 '你好' 时
触发一次EN_CHANGE 事件
做查询 SELECT * FROM ... WHERE ... LIKE '%你好'...但事实却是这样:void CTestDlg::OnEnChangeEdit3()
{
CString str; // 触发后得到CEdit的内容
GetDlgItem(IDC_EDIT3)->GetWindowText(str); // 触发后CEdit的内容
::AfxMessageBox(str);
}我想在用全拼输入法时,输入词组时 (nihao 1.'你好' 2... 3...) 选择1时, CEdit 的显示的内容为 '你好' EN_CHANGE 事件只触发一次, 做一次查询, 然而输入一词组 '你好' 时, 触发了两次 EN_CHANGE 事件
第一次 str 的内容为 '你好',
第二次 str 的内容为 '你',
控件显示的是 '你好'.问题:
1:
这导致我每次做查询时, 条件不对, 第一次为'你好%',第二次为'你%',
多了一次还不说, 顺序也不对, 为什么顺序不是 ('你' '你好') ?2:
有什么办法输入一词组(有多字)只触发一次EN_CHANGE 事件?
BOOL CMydilog::PreTranslateMessage(MSG* pMsg)
{
if(GetFocus()==GetDlgItem(IDC_EDIT2))//判断焦点在不在框内
if(pMsg->message==WM_RETURN)
......//你的处理代码
这个查询规定输入一字后(不用敲回车键)就自动匹配查询一次, 所以不能指望用回车处理.To zhucde(【風間苍月】)(MS_MVP) ; windyloft(好好吃饭)
使用EN_KILLFOCUS, 在输入后不一定回产生KILLFOCUS, 而且EN_KILLFOCUS情况还很多. To carbon107(<软件开发思想.h>) ; lixiaosan(小三)
那为什么用GetWindowText(str)时
其缓冲的内容会变化?
第一次 str 的内容为 '你好',
第二次 str 的内容却变为 '你',
控件显示的是 '你好'.这让我如何处理是好?
处理 WM_IME_* 消息时不处理 EN_CHANGE 消息。
CString str;void CTestDlg::OnEnChangeEdit3()
{
// 触发后得到CEdit的内容
GetDlgItem(IDC_EDIT3)->GetWindowText(str);
len=str.GetLength( );
//str[len-oldlen]为新内容。
//输入一词组 '你好' 时, 触发了两次 EN_CHANGE 事件
//第一次 str[len-oldlen] 的内容为 '你',
//第二次 str[len-oldlen] 的内容为 '好',
//控件显示的是 '你好'.
oldlen=len;
// 触发后CEdit的内容
::AfxMessageBox(str);
}