首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

CButton 的 ON_WM_CTLCOLOR_REFLECT() 跟ON_WM_PAINT有什么区别

2013-11-29 
CButton 的 ON_WM_CTLCOLOR_REFLECT() 和ON_WM_PAINT有什么区别ON_WM_CTLCOLOR违背面向对象的思想,所以微

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();
}

[解决办法]
第二个问题:
当需要重绘控件背景和前景时,先调用WM_CTLCOLOR消息响应函数,来获取背景的HDC中,画刷颜色和文本的背景及前景色,然后再调用WM_ERASEBKGND消息响应函数,用这个HDC来绘背景,再调用WM_PAINT消息响应函数,用HDC来绘前景。可以这样理解,WM_CTLCOLOR消息是为WM_ERASEBKGND和WM_PAINT消息做准备用的。
第三个问题:
作者有可能在WM_PAINT里,加了一句:

MSG msg;
GetCurrentMessage(&msg);
DefWindowProc(&msg, msg.wParam, msg.lParam);//调用默认的消息处理,这样就可以执行DrawItem()
//然后再执行WM_PANIT下面的代码

热点排行