主题:edit控件如何响应EN_CHANGE

admin 2018年12月08日 30

soui中使用的edit实际上是系统的richedit的无窗口形式的包装,因此一般适用于系统richedit的操作也适用于soui.要响应EN_CHANGE,首先你需要设置允许richedit触发这个事件,这可以在XML中配置notifyChange=1来实现。

 下面是这个属性的实现代码:

HRESULT SRichEdit::OnAttrNotifyChange(const SStringW & strValue,BOOL bLoading)
{
    m_fNotifyChange = strValue!=L"0";
    if(!bLoading)
    {
        LPARAM lEvtMask = SSendMessage(EM_GETEVENTMASK);
        if(m_fNotifyChange) lEvtMask |= ENM_CHANGE;
        else lEvtMask &= ~ENM_CHANGE;
        SSendMessage(EM_SETEVENTMASK,0,lEvtMask);
    }
    return S_FALSE;
}

就是简单的设置eventmask操作。设置完成后,EN_CHANGE事件就会通过事件:EVT_RE_NOTIFY来通知。下面是demos/slogviewer处理过滤条件输入的代码:


void CMainDlg::OnFilterInputChange(EventArgs *e)
{
        EventRENotify *e2 = sobj_cast<EventRENotify>(e);
        SASSERT(e2);
        if(e2->iNotify == EN_CHANGE)
        {
                SEdit * pEdit = sobj_cast<SEdit>(e2->sender);
                SStringT str = pEdit->GetWindowText();
                m_logAdapter->SetFilter(str);
        }
}

注意,richedit所有事件都是通过EVT_RE_NOTIFY来通知的,应该在这里判断e2->iNotify==EN_CHANGE再处理。