我的作法是:1:从CStatic类派生一个类CStaticXX
2:类CStaticXX中定义变量bool m_bMouseDown, 用以指定鼠标是否按下;
3:映射类CStaticXX的WM_PAINT, WM_LBUTTONDOWN, WM_LBUTTONUP消息;
4:映射的消息处理函数中代码如下:void CStaticXX::OnPaint() 
{
CPaintDC dc(this);
if (m_bMouseDown) dc.SetTextColor(RGB(255, 0, 0));
else dc.SetTextColor(RGB(0, 0, 255)); CRect rect(0, 0, 100, 20);
dc.DrawText(CString("T"), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}void CStaticXX::OnLButtonDown(UINT nFlags, CPoint point) 
{
m_bMouseDown = true;
SendMessage(WM_PAINT);

CStatic::OnLButtonDown(nFlags, point);
}void CStaticXX::OnLButtonUp(UINT nFlags, CPoint point) 
{
m_bMouseDown = false;
SendMessage(WM_PAINT);

CStatic::OnLButtonUp(nFlags, point);
}显示效果是:
如果m_bMouseDown初始化为true,则一直显示为红色;
如果m_bMouseDown初始化为true,则一直显示为蓝色:
——也就是说dc.SetTextColor没有起到我预期的效果!!!大家帮忙看看原因何在??
我怀疑是我在某些基本知识上犯了低级错误。

解决方案 »

  1.   

    同意。不要用SendMessage。直接Invalidate刷新。
      

  2.   

    多谢二位!!如二位所言,问题解决了。再请问二位,为何SendMessage(WM_PAINT)达不到效果??
    多谢。
      

  3.   

    对头,就是用Invalidatevoid Invalidate( BOOL bErase = TRUE );
    该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。