C++

MFC的自定义控件之消息机制

2018-02-23  本文已影响0人  JasonChen8888

MFC消息机制

MFC是使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。
当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理。SDK编程时需要在窗口过程中一一判断消息值进行相应的处理,相比之下MFC的消息映射机制要方便好用的多。


消息结构.png

以窗口消息为例:

如下是消息的动态添操作图,在类向导直接添加,vs会自动在类的头文件和源文件中自动添加。


image.png

并且会添加消息到源文件的map中

BEGIN_MESSAGE_MAP(CMyControl, CWnd)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

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);
}
 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);
}
  void CMyControl::OnLButtonDown(UINT nFlags, CPoint point)
  {
     // TODO: 在此添加消息处理程序代码和/或调用默认值
     if (FALSE == flag) {
       oldPoint = point;
       flag = TRUE;
     }
     CWnd::OnLButtonDown(nFlags, point);
  }
 void CMyControl::OnLButtonUp(UINT nFlags, CPoint point)
 {
     // TODO: 在此添加消息处理程序代码和/或调用默认值
    flag = FALSE;
    CWnd::OnLButtonUp(nFlags, point);
 }
上一篇 下一篇

猜你喜欢

热点阅读