MFC消息机制
MFC是使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。
当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理。SDK编程时需要在窗口过程中一一判断消息值进行相应的处理,相比之下MFC的消息映射机制要方便好用的多。
以窗口消息为例:
如下是消息的动态添操作图,在类向导直接添加,vs会自动在类的头文件和源文件中自动添加。
并且会添加消息到源文件的map中
BEGIN_MESSAGE_MAP(CMyControl, CWnd)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
- 对应消息ON_WM_PAINT
void CMyControl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CWnd::OnPaint()
CRect rect;
this->GetClientRect(rect);
dc.MoveTo(0, 0);
dc.LineTo(rect.right, rect.bottom);
dc.MoveTo(rect.right, 0);
dc.LineTo(0, rect.bottom);
}
- 对应的消息ON_WM_MOUSEMOVE
void CMyControl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (TRUE == flag) {
CDC *dc = GetDC();
dc->MoveTo(oldPoint);
dc->LineTo(point);
oldPoint = point;
ReleaseDC(dc);
}
CWnd::OnMouseMove(nFlags, point);
}
- 对应的消息ON_WM_LBUTTONDOWN(点击按下)
void CMyControl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (FALSE == flag) {
oldPoint = point;
flag = TRUE;
}
CWnd::OnLButtonDown(nFlags, point);
}
- 对应的消息ON_WM_LBUTTONUP(点击放开)
void CMyControl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
flag = FALSE;
CWnd::OnLButtonUp(nFlags, point);
}