CButton 的 ON_WM_CTLCOLOR_REFLECT() 和ON_WM_PAINT有什么区别
ON_WM_CTLCOLOR 违背面向对象的思想, 所以微软提出ON_WM_CTLCOLOR_REFLECT来。。。
让控件自身处理 ,不让父窗口处理, 这样的话,封装了一个控件类, 用户可以直接用,,
不需要在对话框中处理 一些消息:ON_WM_CTLCOLOR 。。。。。。。
我有些糊涂了。。。。。。
按钮它也可以有WM_APINT 啊, ,为什么, 还需要再弄出一个 WM_CTLCOLOR_REFLECT 来呢??
什么时候 该用WM_PAINT ? 什么时候该用WM_CTLCOLOR_REFLECT来???
第二个问题:对话框中添加WM_CTLCOLOR消息使 对话框有能去处理控件的背景、颜色什么的修改,,
如果 对话框 又添加了 WM_PAINT (这个是必须添加的) ,
两个消息 各自对应的消息响应函数 都去处理 子空间的 背景 、颜色,,,, 会怎样?
使用哪一个 更好一些
第三个问题: 都说 只要OVERRIDE 了CMyButton的 OnPaint ,那么 DrawItem就无效了。。。。。
但是我昨天下了个代码,发现作者: 封装的按钮类, 可以自绘,但同时也添加了 WM_PAINT
// CMyButton
IMPLEMENT_DYNAMIC(CMyButton, CButton)
CMyButton::CMyButton()
{
iX=0;
bMouseHover=false;
}
CMyButton::~CMyButton()
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()
// CMyButton 消息处理程序
void CMyButton::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
ModifyStyle(0,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
}
void CMyButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CButton::OnPaint()
CRect rcClient;
GetClientRect(rcClient);
CDC CompatibleDC;
CBitmap bitmap;
CBitmap *OldBitmap;
BITMAP bit;
CompatibleDC.CreateCompatibleDC(&dc);
bitmap.LoadBitmap(m_nBitmapID);
bitmap.GetBitmap(&bit);
OldBitmap=(CBitmap *)CompatibleDC.SelectObject(&bitmap);
if(m_bState)
TransparentBlt(dc.m_hDC,0,0,rcClient.Width(),rcClient.Height(),CompatibleDC.m_hDC,bit.bmWidth/2,bit.bmHeight/5*m_nItem,bit.bmWidth/2-1,bit.bmHeight/5,RGB(255,255,255));
else
TransparentBlt(dc.m_hDC,0,0,rcClient.Width(),rcClient.Height(),CompatibleDC.m_hDC,bit.bmWidth/2*iX,bit.bmHeight/5*m_nItem,bit.bmWidth/2-1,bit.bmHeight/5,RGB(255,255,255));
CompatibleDC.SelectObject(OldBitmap);
bitmap.DeleteObject();
}