回 帖 发 新 帖 刷新版面

主题:[讨论]按键消息的处理

想设计一个文本编辑器,处理键盘输入的 字符
之前看到一个实例程序中使用 OnChar()函数实现的,然后把输入的 直接在OnDraw显示
但是这样,吧 OnDraw弄的很浮肿!
今天看到一个 使用 // CTerminalView message handlers
LRESULT CTerminalView::OnCommNotify(WPARAM wParam, LPARAM lParam)
{
    char buf[MAXBLOCK/4];
    CString str;
    int nLength, nTextLength;

    CTerminalDoc* pDoc=GetDocument();
    CEdit& edit=GetEditCtrl();
    if(!pDoc->m_bConnected || 
        (wParam & EV_RXCHAR)!=EV_RXCHAR) // 是否是EV_RXCHAR事件?
    {
        SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
        return 0L;
    }
    nLength=pDoc->ReadComm(buf,100);
    
    if(nLength)
    {
        nTextLength=edit.GetWindowTextLength();
        edit.SetSel(nTextLength,nTextLength); //移动插入光标到正文末尾
        for(int i=0;i<nLength;i++)
        {
            switch(buf[i])
            {
            case '\r': // 回车
                if(!pDoc->m_bNewLine) 
                break;
            case '\n': // 换行
                str+="\r\n";
                break;
            case '\b': // 退格
                edit.SetSel(-1, 0);
                edit.ReplaceSel(str);
                nTextLength=edit.GetWindowTextLength();
                edit.SetSel(nTextLength-1,nTextLength);
                edit.ReplaceSel(""); //回退一个字符
                str="";
                break;
            case '\a': // 振铃 
                MessageBeep((UINT)-1);
                break;
            default : 
                str+=buf[i];
            }
        }
        edit.SetSel(-1, 0);
        edit.ReplaceSel(str); // 向编辑视图中插入收到的字符
    }
    SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
    return 0L;
}实现的,消息是      ON_MESSAGE(WM_COMMNOTIFY, OnCommNotify)
这样其OnDraw函数比较简单,如下
void CTerminalView::OnDraw(CDC* pDC)
{
    CTerminalDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
}
我就奇怪了,OnDraw函数中没有把输入的显示,为什么我们也能看到这个编辑框中输入操作的实时反应呢 ?

回复列表 (共1个回复)

沙发

对了 ,我之前使用的是视窗类继承 public CView
但是现在的程序继承 public CEditView
是不是这些编辑的功能是 CEditView中已经集成好了的呢 ?
那他是使用什么原理让视窗能随键盘输入操作实时更新呢 ?

我来回复

您尚未登录,请登录后再回复。点此登录或注册