Ch8.2.1  键盘消息与消息处理
[案例1演示:ex_key_move,引入键盘消息处理]
键盘消息包括按键消息和字符消息,当某键被按下又释放时,不论该键是否会产生可见字符,都会产生WM_KEYDOWN和WM_KEYUP消息。
因此,键盘消息处理也分为按键消息处理和字符消息处理。
案例1:利用上下左右箭头键在一个对话框中移动字符“A”。
实现要点:
(1)创建对话框应用程序ex_key_move
(2)在对话框类中添加数据成员m_xPos和m_yPos,表示字符的位置。
int m_xPos,m_yPos;mousemove是什么键
(3)在对话框类的构造函数中对数据成员初始化为0。
M_xPos=m_yPos=0;
(4)修改OnPaint()函数,在当前位置显示字符。在else中添加代码如下:
CPaintDC dc2(this);
dc2.TextOut(m_xPos,m_yPos,"A");  //显示字符
[运行,结果在对话框的左上角显示字符A]
(5)添加对话框类的键盘消息WM_KEYUP的响应函数,根据按键修改坐标变
量m_xPos和m_yPos。
void CEx_keyDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{ // TODO: Add your message handler code here and/or call default if(nChar==VK_RIGHT)
m_xPos+=10;
else if(nChar==VK_LEFT)
m_xPos-=10;
else if(nChar==VK_UP)
m_yPos-=10;
else if(nChar==VK_DOWN)
m_yPos+=10;
Invalidate();
CDialog::OnKeyUp(nChar, nRepCnt, nFlags);*/
}
[运行:每当按下并释放箭头键时,字符移动。单独按下箭头键时,字符不动] 思考题1:为什么直接添加对话框类的WM_KEYDOWN消息的映射函数没有反应?应该如何处理按键消息?
原因:按键消息发给了对话框类的父窗口。
解决办法:添加对话框类的PreTranslateMessage消息处理函数,代码如下:BOOL CEx_keyDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==VK_RIGHT)
m_xPos+=10;
else if(pMsg->wParam==VK_LEFT)
m_xPos-=10;
else if(pMsg->wParam==VK_UP)
m_yPos-=10;
else if(pMsg->wParam==VK_DOWN)
m_yPos+=10;
}
Invalidate();                //强迫调用OnPaint()函数
return CDialog::PreTranslateMessage(pMsg);
}
运行:当箭头键按下时,字符随按键移动。
思考题2:当字符移到窗口右边缘或窗口下边缘时,继续移动则移出了对话框窗口。
解决办法:每当坐标改变时,根据当前窗口的大小进行判断,若超出了窗口,则将其限定在窗口内。
//限制字符坐标在窗口内
if(m_xPos<0)
m_xPos=0;
if(m_yPos<0)
m_yPos=0;
CRect rect;
GetClientRect(&rect);  //取得窗口客户区
int width=rect.Width();
int height=rect.Height();
if(m_yPos>height) m_yPos=height-20;
if(m_xPos>width) m_xPos=width-20;
总结:键盘消息的响应在相应的消息映射函数中实现,其中按键消息WM_KEYDOWN的处理比较特殊,需要在消息映射函数PreTranslateMessage()中实现。
Ch8.2.2 鼠标消息与处理函数
[演示案例2运行结果,明确案例要实现的功能,引出鼠标消息在程序中的使用] 案例2:在对话框程序的客户区的(50,50)位置显示当前鼠标的位置(横坐标,纵坐标)。
实现要点:
(1)创建对话框程序ex_mousemove
(2)在对话框类的头文件中添加数据成员:int  m_x, m_y; 或者添加一个数据成员:CPoint m_point;
(3)在对话框类的构造函数中对新添加的坐标初始化:
m_x=m_y=0;
(4)在对话框类的OnPaint()中else中添加显示鼠标当前位置的代码:
CPaintDC dc(this);
CString  tempstr;
tempstr.Format("鼠标位置:(%d  %d)",m_x, m_y);
dc.TextOut(50,50,tempstr);
[运行结果:鼠标位置:(0,0)    ]
(5)为对话框类添加WM_MOUSEMOVE消息映射函数并添加代码:
void CEx_mousemoveDlg::OnMouseMove(UINT nFlags, CPoint point)
{
/
/ TODO: Add your message handler code here and/or call default m_x=point.x;
m_y=point.y;
Invalidate();
CDialog::OnMouseMove(nFlags, point);
}
[运行:显示结果随鼠标移动而变化]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。