我用图片作为一对话框背景,再在对话框上放 edti控件,运行后edit部分为白色,我想问一下怎么让edit部分显示对应的背景图片部分,
BRUSH CxxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
这种方法用过了,不行
希望大家帮帮忙

解决方案 »

  1.   

    http://topic.csdn.net/u/20100719/21/ac513990-5236-4f45-a58a-7399fd691556.html
    http://blog.csdn.net/fishion/archive/2009/03/14/3990457.aspx
      

  2.   

    绘制自己的Edit,OnCtlColor里面又不能画图,自己绘制背景,处理按键消息
      

  3.   

    不用bmp图片,用png图片     最要好给个能批量处理的方法,因为要用好多edit控件
      

  4.   

    [C/C++]
    HBRUSH CxxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    在OnCtlColor里面:if(IDC_EDIT1==pWnd->GetDlgCtrlID())
    {
    CRect rect;
    GetWindowRect(&rect);
    ScreenToClient(&rect);
    static BOOL Init=FALSE;
    CDC memDC;
    CBitmap bitmap;
    if(!Init)
    {
       memDC.CreateCompatibleDC(pDC);
       bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
       memDC.SelectObject(&bitmap);
       memDC.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY); 
       Init=TRUE;

    else
    {
        pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SCRCOPY);
    }  
    static HBRUSH hbr=::CreatePatternBrush(bitmap);
    return hbr; 
    }
    大概是这么写的,我这没编译器,用记事本打的,可能有些拼写错误^^
      

  5.   

    GetWindowRect(&rect);错了,应该得到EDIT的矩形
    pWnd->GetWindowRect(&rect);
      

  6.   

    1,在oninitialdialog里用createpatternbrush以你的图片作为参数创建brush
    2,在onCtrlcolor里返回刚才创建的brush就行了
      

  7.   

    Edit 控件也是窗体类,继承CWnd 
    所以可以直接在其OnEraseBkgnd()内用5楼代码做处理贴图即可。
      

  8.   

    1,在oninitialdialog里用createpatternbrush以你的图片作为参数创建brush
    2,在onCtrlcolor里返回刚才创建的brush就行了 
     
      

  9.   

    不好搞的。
    1》对话框的背景一般用StretchBlt,这样edit部分的位置和大小难定。
    2》对话框画背景时edit部分是Clip掉的,除非edit被hide。
    3》如果edit使能scroll那么edit的背景(即对话框的某部分)会scroll而不在原位置)。
      

  10.   

    给你写了一个例子,不知道你好用否:
    1》dlg头:
    CDrawEditDlg::~CDrawEditDlg();
    CBitmap  m_bitmap;
    CBrush  *m_pbrEd;
    BOOL     m_blInitEditBr;
    1+》
    CDrawEditDlg::CDrawEditDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CDrawEditDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CDrawEditDlg)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_bitmap.LoadBitmap(IDB_CLOUDS);
    m_pbrEd=0;
    m_blInitEditBr=FALSE;
    }2》//
    CDrawEditDlg::~CDrawEditDlg()
    {
    if(m_pbrEd)
    {
    DeleteObject(m_pbrEd);
    delete m_pbrEd;
    }
    }
    3》在第一次EraseBkgnd时生成PatternBrush,注意edit的背景被加上了。BOOL CDrawEditDlg::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
    CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
    // Retrieve the size of our bitmap...
    BITMAP bmp;
    m_bitmap.GetObject(sizeof(bmp),&bmp);
    // and the size of our window's client area
    CRect rect;
    GetClientRect(&rect);
    // Create Edit background brush; only once !
    if(!m_blInitEditBr)
    {// add  edit rect
    CRgn  prgnClip;
    CRect selEditRc;
    m_SelEdit.GetWindowRect(selEditRc);
    prgnClip.CreateRectRgnIndirect(selEditRc);//DeleteObject needed
    CDC* pDCex=GetDCEx(&prgnClip,DCX_PARENTCLIP);//ReleaseDC needed
    // Fill the client area of dlg,include SelEdit with our bitmap
    pDCex->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
    &dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
     //we create the background brush of SelEdit
    CDC dcMemEd;
    dcMemEd.CreateCompatibleDC(pDCex);//DeleteDC needed
    CBitmap EditBmp;//DeleteObject needed
    EditBmp.CreateCompatibleBitmap(pDCex,selEditRc.Width(),selEditRc.Height());
    pOldBitmap = dcMemEd.SelectObject(&EditBmp);
    ScreenToClient(&selEditRc);
    MapWindowPoints(this,selEditRc);
    dcMemEd.BitBlt(0,0,selEditRc.Width(),selEditRc.Height(),
    pDCex,selEditRc.left, selEditRc.top, SRCCOPY);
    CBitmap  *nowBMP=dcMemEd.SelectObject(pOldBitmap); 
    // copy to CB for checking
    #ifdef TEST
    OpenClipboard();
    EmptyClipboard(); 
    SetClipboardData(CF_BITMAP,nowBMP->GetSafeHandle());
    CloseClipboard();
    #endif
    m_pbrEd=new CBrush;
    m_pbrEd->CreatePatternBrush(nowBMP);
    m_blInitEditBr=TRUE;
    //
    DeleteObject(prgnClip);
    DeleteObject(EditBmp);
    ReleaseDC(pDCex);
    dcMemEd.DeleteDC();
    }
    else
    {// MORMAL
    pDC->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
    &dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
    }
    dcMem.SelectObject(pOldBitmap);
    dcMem.DeleteDC(); 
    //
    return TRUE;
    // return CDialog::OnEraseBkgnd(pDC);
    }4》要设置SetBkMode
    HBRUSH CDrawEditDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    // TODO: Change any attributes of the DC here
    if((CTLCOLOR_EDIT==nCtlColor) && (*pWnd == m_SelEdit))
    {
    pDC->SetBkMode(TRANSPARENT);
    return 0;
    }
    return hbr;
    }
    5》派生Edit (m_SelEdit)CSelEdit
    6》注意 Invalidate();
    void CSelEdit::OnChange() 
    {
    // TODO: Add your control notification handler code here
    Invalidate();
    }
    7》用PatternBrush刷背景
    BOOL CSelEdit::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    CDrawEditDlg *pdlg=(CDrawEditDlg*)GetParent();
    CRect rc;
    GetWindowRect(&rc);
    ScreenToClient(&rc);
    // afxDump << rc << "\n";
    pDC->FillRect(rc,pdlg->m_pbrEd);
    return TRUE;
    // return CEdit::OnEraseBkgnd(pDC);
    }
    8》击键太快时有闪烁。
      

  11.   

    下面是使用隐藏edit的方法,略简单些,不再使用pDCex:BOOL CDrawEditDlg::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    // add  edit rect,must here!
    if(!m_blInitEditBr) m_SelEdit.ShowWindow(SW_HIDE);
    // normal 
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
    CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
    // Retrieve the size of our bitmap...
    BITMAP bmp;
    m_bitmap.GetObject(sizeof(bmp),&bmp);
    // and the size of our window's client area
    CRect rect;
    GetClientRect(&rect);
    pDC->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
    &dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
    // 
    if(!m_blInitEditBr)
    {// Create Edit background brush; only once !
    CRect selEditRc;
    m_SelEdit.GetWindowRect(selEditRc);
    //we create the background brush of SelEdit
    CDC dcMemEd;
    dcMemEd.CreateCompatibleDC(pDC);//DeleteDC needed
    //
    CBitmap EditBmp;//DeleteObject needed
    EditBmp.CreateCompatibleBitmap(pDC,selEditRc.Width(),selEditRc.Height());
    //
    CBitmap* pOld = dcMemEd.SelectObject(&EditBmp);
    ScreenToClient(&selEditRc);
    MapWindowPoints(this,selEditRc);
    dcMemEd.BitBlt(0,0,selEditRc.Width(),selEditRc.Height(),
    pDC,selEditRc.left, selEditRc.top, SRCCOPY);
    CBitmap  *nowBMP=dcMemEd.SelectObject(pOld); 
    // copy to CB for checking
    #ifdef TEST
    OpenClipboard();
    EmptyClipboard(); 
    SetClipboardData(CF_BITMAP,nowBMP->GetSafeHandle());
    CloseClipboard();
    #endif
    m_pbrEd=new CBrush;
    m_pbrEd->CreatePatternBrush(nowBMP);
    m_blInitEditBr=TRUE;
    //
    DeleteObject(EditBmp);
    dcMemEd.DeleteDC();
    //
    m_SelEdit.ShowWindow(SW_SHOW);
    }
    //
    dcMem.SelectObject(pOldBitmap);
    dcMem.DeleteDC(); 
    //
    return TRUE;
    // return CDialog::OnEraseBkgnd(pDC);
    } if(!m_blInitEditBr) m_SelEdit.ShowWindow(SW_HIDE);必须在CreateCompatibleDC(pDC)前