求大神解释WM_CTLCOLOR和WM_ERASEGND,WM_PAINT关系?解决方法

求大神解释WM_CTLCOLOR和WM_ERASEGND,WM_PAINT关系?
我在WM_CTLCOLOR消息时候,更改了对话框的颜色,可以使用,我又在WM_ERASEBKGND响应函数里面然后我又在对话框上贴了一副位图,然后背景色也没有改变了,但是如果把OnEraseBkgnd,返回值不更改,返回基类的OnEraseBkgnd函数,对话框背景色就可以改变了
BOOL CControl5Dlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
BITMAP m_bitinfo;
m_bitmap.GetBitmap(&m_bitinfo);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&m_bitmap);
//pDC->SetBkMode(TRANSPARENT);
pDC->StretchBlt(0,0,m_bitinfo.bmWidth,m_bitinfo.bmHeight,&dcCompatible,0,0,m_bitinfo.bmWidth,m_bitinfo.bmHeight,SRCCOPY);*/
/*CRect rc;
GetWindowRect(&rc);
pDC->FillSolidRect(&rc,RGB(255,0,0));*/
return true;
//return CDialog::OnEraseBkgnd(pDC);
}
HBRUSH CControl5Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: 在此更改 DC 的任何属性

// TODO: 如果默认的不是所需画笔,则返回另一个画笔
switch(nCtlColor)
{
case CTLCOLOR_DLG:
return m_brush;
break;
}

return hbr;
}
有谁能说说WM_CTLCOLOR和WM_ERASEGND关系?

------解决方案--------------------
调用的顺序记得好像是WM_ERASEBKGND -> WM_CTLCOLOR -> WM_PAINT

------解决方案--------------------
如果有对话框中有子窗口控件,调用WM_PAINT,会刷新所有子窗口,又会有WM_CTLCOLOR消息。
------解决方案--------------------
WM_ERASEGND:背景擦除
WM_PAINT:窗口绘制
WM_CTLCOLOR:控件着色

一般的做法是,WM_PAINT贴背景图,设置背景色,WM_ERASEGND直接返回TRUE,WM_CTLCOLOR设置控件外观,如透明,着色等。