1.如果要使用SendMessage或者PostMessage触发某条消息,则在消息与消息响应函数关联时,要使用ON_MESSAGE而不是使用ON_COMMAND(自己感觉是这样,也不知道真的假的)
2.关于OnPaint()和OnDraw()均是WM_PAINT的消息响应函数,只不过OnPaint是CWnd类中声明定义的,而OnDraw是在CView中声明定义的,所以在XXXView类中,往往默认就有了OnDraw函数,而没有OnPaint函数。CView又是CWnd的一个子类,因此,要么就别再XXXView类中添加WM_PAINT的实现函数,此时对于重绘的消息会自动调用OnDraw函数,所以可以把重绘的操作写在OnDraw中。如果添加了WM_PAINT,要么就把重绘的操作写在OnPaint函数中;要么就把重绘的操作写在OnDraw中,然后再从OnPaint函数中调用OnDraw。下面以GraphicView为例:
- 不手动添加WM_PAINT消息时的响应函数:
void CGraphicView::OnDraw(CDC* pDC) { CGraphicDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CFont *pOldFont = pDC->SelectObject(&m_font); pDC->TextOut(0, 0, m_strFontName); pDC->SelectObject(pOldFont); }
手动添加WM_PAINT消息
在Onpaint中调用OnDraw:
<pre name="code" class="cpp">void CGraphicView::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here OnDraw(&dc); // Do not call CView::OnPaint() for painting messages }
然后重绘操作OnPaint函数中实现:
<pre name="code" class="cpp">void CGraphicView::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CFont *pOldFont = dc.SelectObject(&m_font); dc.TextOut(0, 0, m_strFontName); dc.SelectObject(pOldFont); // Do not call CView::OnPaint() for painting messages }
- 使用Invalidate函数,使窗口无效(将WM_PAINT消息放入消息队列中)。