我做一个Dialog,重载了OnCtlColor函数:
HBRUSH CMyAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
return m_Brush;
}m_Brush在构造函数里赋值:
CBrush m_Brush;
CBitmap* m_pDlgBkBmp;
CMyAppDlg::CMyAppDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyAppDlg::IDD, pParent)
{
m_pDlgBkBmp=new CBitmap;
m_pDlgBkBmp->LoadBitmap(IDB_MAINFRAM);
m_Brush.CreatePatternBrush(m_pDlgBkBmp);
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
IDB_MAINFRAM是背景图
发现窗口背景是有了,可是我上面原来的Edit里面的背景也设成了IDB_MAINFRAM最左上角部分,我现在想把Edit的背景去掉,该怎么做,如果要把Edit设成透明,又该怎么做,谢谢!!

解决方案 »

  1.   

    HBRUSH CMyAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
        if (nCtlColor == CTLCOLOR_DLG)
        {
    return m_Brush;
        }
        else
        {
            return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
        }
    }
      

  2.   

    如果你想把Edit做成透明的,可以在资源编辑器中直接设置。
      

  3.   

    资源编辑器里设不了吧,我设了,没用啊,还是老样子,static 也是一样,不能透明,我原来用过这个方法,可界面上的Static控件不能透明,必须在OnCtlColor里加一句:
    pDC->SetBkMode(TRANSPARENT); 
    才能设透明,这一句要加到什么地方?
    谢谢
      

  4.   

    HBRUSH CTestformView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {..
    HBRUSH hbr= CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
    if(nCtlColor==CTLCOLOR_STATIC)
    pDC->SetBkMode(TRANSPARENT);
             return hbr;
    }
      

  5.   

    HBRUSH CTestformView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {..
    HBRUSH hbr= CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
    pDC->SetBkMode(TRANSPARENT);
             return hbr;
    }
      

  6.   

    HBRUSH CMyAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
        if (nCtlColor == CTLCOLOR_DLG)
        {
    return m_Brush;
        }
        else if(nCtlColor == CTLCOLOR_STATIC)
        { 
            pDC->SetBkMode(TRANSPARENT);
        }
       
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);}
      

  7.   

    if(nCtlColor==CTLCOLOR_STATIC)
       pDC->SetBkMode(TRANSPARENT);
      

  8.   

    重新写下问题:我做一个Dialog,重载了OnCtlColor函数:
    HBRUSH CMyAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    return m_Brush;
    }
    //m_Brush是自定义的背景,现在这个Dialog上放了一个静态文本控件和一个Edit控件,在我用了上面那段代码后,Edit控件的背景也被设成和Dialog一样了,我现在想重写代码,
    背景还是m_Brush,但不要让Edit控件设背景,而且静态文本控件也要是透明的,应该怎么写
    代码,谢谢!
      

  9.   

    HBRUSH CMyAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
         pDC->SetBkMode(TRANSPARENT);
         return m_Brush;
    }
    这样就可以了,我试过了
      

  10.   

    你看看有没帮助http://expert.csdn.net/Expert/topic/1830/1830425.xml?temp=.5447046
      

  11.   

    偶说的不对,那是static
    抱歉
      

  12.   

    Your problem has been solved at Jingsheng's column.
    Go and check this link:
    http://www.csdn.net/develop/read_article.asp?id=9603
    title is:绘制有纹理的背景的应用程序
    solved by:Paul DiLascia
      

  13.   

    你再试试这一种方法,如果你不嫌麻烦的话,
    1,对话框的背景色设置原样处理;
    2,创建一个CMyStatic类,让其设置自己的颜色,而不是让起父类设置。 在头文件中添加以下代码:
    afx_msg HBRUSH CtlColor(CDC* pDC,UINT nCtlColor);在cpp文件中,指定消息映射的入口:
    ON_WM_CTLCOLOR_REFLECT();在cpp文件中,加上如下代码:
    HBRUSH CMyStatic::CtlColor(CDC* pDC,UINT nCtlColor)
    {
       pDC->SetBkMode(TRANSPARENT);
    }
    编辑控件也是按照同样的方法去做,只是CtlColor函数为空。
      

  14.   

    把OnCtlColor代码这么写就可以解决问题了
    HBRUSH CMyAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr= CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    switch (nCtlColor)
    {
    case CTLCOLOR_STATIC:
    pDC->SetBkMode(TRANSPARENT);
    hbr = m_Brush;
    break;
    case CTLCOLOR_DLG:
    hbr = m_Brush;
    break;
    default:
    break;
    }
        return hbr;
    }