各位兄弟,窗口的非客户区的背景能通过wm_ncpaint消息来改变,可这样做,是画的太麻烦,因为你画的时侯不能一起全画,而且画的也不好看。而且效率也不好,拖运的时侯容易出现阴影,特别有时侯机子运行的慢的时侯,窗口一卡在那,还变成原来的样子.
   
   我突然在想,窗口本身一生成就有颜色,这种颜色应该可以改变吧!可我找了半天也没找到方法去改变,可我看到很多的软件中,窗口背景色都已经发生变化,更重要的是无论怎么样都不会出现变成原始 窗口的样子。多好呀,不知哪位兄弟对此有何见解!

解决方案 »

  1.   

    网上文章,借花献给兄弟:WM_ERASEBKGND 
    Windows在向窗口发送WM_PAINT消息之前,总会发送一个WM_ERASEBKGND消息通知该窗口擦除背景,默认情况下,Windows将以窗口的背景色清除该窗口。 可以响应窗口(包括子元素)的WM_ERASEBKGND,以更改它们的背景。WM_ERASEBKGND的映射函数原型如下: afx_msg BOOL OnEraseBkgnd( CDC* pDC ); 返回值: 指定背景是否已清除,如果为FALSE,系统将自动清除 参数: pDC指定了绘制操作所使用的设备环境。 
    BOOL CUi4Dlg::OnInitDialog()
    {
    //…
    //加载位图
    //CBitmap m_Back;
    m_Back.LoadBitmap(IDB_BACK);
    //…
    }BOOL CUi4Dlg::OnEraseBkgnd(CDC* pDC) 
    {
    CDC dc;
    dc.CreateCompatibleDC(pDC);
    dc.SelectObject(&m_Back); //获取BITMAP对象
    BITMAP hb;
    m_Back.GetBitmap(&hb); //获取窗口大小
    CRect rt;
    GetClientRect(&rt);
    //显示位图
    pDC->StretchBlt(0, 0, rt.Width(), rt.Height(),
    &dc, 0, 0, hb.bmWidth, hb.bmHeight, SRCCOPY); return TRUE;
    }HBRUSH CUi4Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    //设置透明背景模式
    pDC->SetBkMode(TRANSPARENT);
    //设置背景刷子为空
    return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
    }