从CWnd派生一个类CMyWnd,重载它的OnPaint函数,以便画上自己想要的东西。
但是在一个对话框测试程序中,添加成员变量CMyWnd myWnd; 在测试程序的OnInitDialog()中myWnd.Create(::AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, ::LoadCursor(NULL, IDC_ARROW), (HBRUSH) ::GetStockObject(WHITE_BRUSH)))创建了,并myWnd.ShowWindow(WS_SHOW)
在OnPaint里
void FireTree::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
CRect rc;
GetWindowRect(&rc);
CBrush brush;
brush.CreateSolidBrush(RGB(255, 0, 0));
dc.FillRect(&rc, &brush);
dc.LineTo(100, 100);
dc.TextOut(0, 0, "Hello");
dc.DrawText("你好", CRect(0, 50, 100, 80), DT_CENTER | DT_VCENTER);
// Do not call CWnd::OnPaint() for painting messages
}
画的线和文字都显示出来了,但是为什么用FillRect把背景填成RGB(255, 0, 0)却没有效果呢?而且对话框的背景也不是(HBRUSH) ::GetStockObject(WHITE_BRUSH)设定的白色,而是对话框原本的灰白色的背景,想不明白,请各位指教。

解决方案 »

  1.   

    SelectObject进去,也是同样的效果
      

  2.   

    将CBrush brush在类中声明,不要局部声明
      

  3.   

    楼主你需要手动添加WM_CTLCOLOR_REFLECT 的处理函数,然后再其中返回你想要的颜色画刷
      

  4.   

    用类向导找 =WM_CTLCOLOR,添加即可
      

  5.   

    ON_WM_CTLCOLOR_REFLECT()
    HBRUSH FireTree::CtlColor(CDC* pDC, UINT nCtlColor) 
    {

    pDC->SetTextColor(RGB(0, 255, 0));
    pDC->SetBkColor(RGB(0, 0, 0));
    HBRUSH hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
    return hbr;
    }
    不知道这样添加对不对?编译通过了,在这个函数里设置了断点,调试运行,窗口显示出来了,但是没有经过这个函数还是我哪里添加错了?
      

  6.   

    自定义的类是直接派生自CWnd,在类向导中未找到=WM_CTLCOLOR,只有WM_CTLCOLOR
      

  7.   

    自定义的类是直接派生自CWnd,在类向导中未找到=WM_CTLCOLOR,只有WM_CTLCOLOR
      

  8.   

    你的派生类是CMyWnd
    而你的Opaint函数是FireTree的
    这都哪跟哪啊
      

  9.   

    这个不是问题,CMyWnd改改不就FireTree不就好了吗
      

  10.   

    这个不是问题,CMyWnd改改不就FireTree不就好了吗。
      

  11.   

    CBrush brush;
    if (!brush.CreateSolidBrush(RGB(255, 0, 0))
         return;brush.UnrealizeObject();
    dc->FillRect(client, &brush);
      

  12.   

    CBrush brush;
    用完后记得deleteobject();看你代码没什么大问题。主要还是看firetree这个类是怎么定义的了。要是是cdiglog的派生类.在onpaint里面自绘,或者相应WM_CTLCOLOR或者ON_WM_ERASEBKGND改变背景色都是可以的。