主题:[讨论]按键消息的处理
想设计一个文本编辑器,处理键盘输入的 字符
之前看到一个实例程序中使用 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函数中没有把输入的显示,为什么我们也能看到这个编辑框中输入操作的实时反应呢 ?
之前看到一个实例程序中使用 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函数中没有把输入的显示,为什么我们也能看到这个编辑框中输入操作的实时反应呢 ?