MFC基于对话框的程序,要实现对话框中编辑框透明效果,融合对话框的背景图片,且对话框背景图片每隔几秒显示一张,不影响编辑框的透明效果。。(编辑框显示对话框背景图片的效果)
下面是我的部分代码:
我继承了CEdit的类,写了个编辑框的类CEditTrans。处理编辑框的透明效果。EditTrans.h 文件:private:
    COLORREF m_TextColor;
    COLORREF m_BackColor;
    CBrush   m_Brush;// Operations
public:
    void SetTextColor(COLORREF col) { m_TextColor = col;
                                      UpdateCtrl();      }
    void SetBackColor(COLORREF col) { m_BackColor = col;
                                      UpdateCtrl();      }
private:
    void UpdateCtrl();//---------------------------------------------------------------
EditTrans.cpp 文件:#include "stdafx.h"
#include "EditTrans.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CEditTransCEditTrans::CEditTrans()
{
    m_TextColor = RGB(0, 0, 0);
    m_BackColor = TRANS_BACK;
}CEditTrans::~CEditTrans()
{
}
BEGIN_MESSAGE_MAP(CEditTrans, CEdit)
//{{AFX_MSG_MAP(CEditTrans)
ON_WM_CTLCOLOR_REFLECT()
ON_CONTROL_REFLECT(EN_UPDATE, OnUpdate)
ON_WM_LBUTTONDOWN()
ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CEditTrans message handlersHBRUSH CEditTrans::CtlColor(CDC* pDC, UINT nCtlColor) 
{
    m_Brush.DeleteObject();    if (m_BackColor == TRANS_BACK) {
        m_Brush.CreateStockObject(HOLLOW_BRUSH);
        pDC->SetBkMode(TRANSPARENT);
    }
    else {
        m_Brush.CreateSolidBrush(m_BackColor);
        pDC->SetBkColor(m_BackColor);
    }    pDC->SetTextColor(m_TextColor);    return (HBRUSH)m_Brush;
}
void CEditTrans::OnKillfocus() 
{
    UpdateCtrl();
}
void CEditTrans::OnUpdate() 
{
    UpdateCtrl();
}
void CEditTrans::OnLButtonDown(UINT nFlags, CPoint point) 
{
    UpdateCtrl();
    
    CEdit::OnLButtonDown(nFlags, point);
}
void CEditTrans::UpdateCtrl()
{
    CWnd* pParent = GetParent();
    CRect rect;
    
    GetWindowRect(rect);
    pParent->ScreenToClient(rect);
    rect.DeflateRect(2, 2);
    
    pParent->InvalidateRect(rect, FALSE);    
}
然后我在CTestEditDlg.h   CTestEditDlg.cpp  文件中调用,但是显示不出透明的效果,编译运行都是正确的。就是不能显示透明效果,编辑的背景色不是对话框背景图片的颜色。。
望高手们帮忙解决。 谢谢! 然后我用关联的CEdit变量去调用,就是显示不出透明效果。CTestEditDlg.h 文件:public:
CFont             m_EditFontTime;
CEditTrans        m_EditTime; CFont             m_EditFontScore;
CEditTrans        m_EditScore;

解决方案 »

  1.   

    编辑框里面有数字,显示的是倒计时。 但是编辑框背景色是白色的,要实现和对话框背景图片一样。 就是对话的背景图片覆盖编辑框,但是不能覆盖编辑框的内容。
    我不知道怎么截图,粘贴早CSDN的回帖中,不然我截个图,就很明白了。  怎么在CSDN回帖中贴图片,截图。
      

  2.   

    望CSDN中的高手们帮忙看看我的那程序!
      

  3.   

    edit控件中的字符不一定占满控件窗口,即窗口大,字小
      

  4.   

    添加WM_ONERASEBKGND,WM_PAINT这个两个消息
    在OnEraseBkGnd()这个函数里面把返回值改成TRUE;
    在OnPaint()这个函数里面添加显示文本的代码,添加如下代码:
    CRect rcClient;
    GetClientRect(rcClient);
    CString strText;
    GetWindowText(strText);
    dc.TextOut(rcClient.left,rcClient.top,strText);  
    这样子应该改就可以实现你要的功能
      

  5.   

    基本想法:
    1。隐藏edit(SW_HIDE),让dlg在edit区画背景。
    2。OnEraseBkgn时把edit区的背景产生成一个patBrush
    m_pbrEd=new CBrush;
    m_pbrEd->CreatePatternBrush(nowBMP);
    m_blInitEditBr=TRUE;3。显示edit。
    4。派生edit。
    //
    #define ONE_DC
    #ifdef ONE_DC
    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);
    }
    #else
    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);
    }
    #endif//注意edit 是无border的,多行(ctrl cr 回车 换行)
    //派生edit的3个函数如下:class CSelEdit : public CEdit
    void CSelEdit::OnChange() 
    {
    // TODO: Add your control notification handler code here
    Invalidate();
    }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);//PatternBrush
    return TRUE;
    // return CEdit::OnEraseBkgnd(pDC);
    }void CSelEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
    if((nChar==VK_LEFT) || (nChar==VK_RIGHT) || (nChar==VK_UP) ||(nChar==VK_DOWN))
    {
    afxDump << nChar<< "\n";
    CPoint pt=GetCaretPos();
    afxDump << pt << "\n";
    afxDump << "Column:" << pt.x/7+1 << "\n";
    afxDump << "Row:"    << pt.y/8+1 << "\n";
    }
    }
      

  6.   

    你用static静态多好。。反正都是显示时间
      

  7.   

    '用static静态多好'可以的,但问题还在。
      

  8.   

    用static静态。。 还有问题。  我试过了。楼上的说的对。
      

  9.   

    我试试你写的代码:schlafenhamster    
      

  10.   

    用RICHEDIT代替EDIT,透明背景问题就解决了
      

  11.   

    你的这段代码: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);//PatternBrush
        return TRUE;
    //    return CEdit::OnEraseBkgnd(pDC);
    }CDrawEditDlg这是主对话框的类名,在子类中编译的时候出错。 pdlg->m_pbrEd中的m_pbrEd未定义,可是定义之后也编译出错。 麻烦您在帮忙看看。解释一下,谢谢!
      

  12.   

    用RICHEDIT代替EDIT,透明背景问题就解决了能发个接单的代码吗?  RICHEDIT??
      

  13.   

    望,CSDN中的高手们,帮忙看看。谢谢!
      

  14.   

    http://www.cnblogs.com/laowen/archive/2009/06/01/1493768.html
      

  15.   

    小弟初学MFC,望高手们帮忙解决。。
      

  16.   

    刚如MFC的门,求一个查询关键字的VC程序
      

  17.   

    忘了把定义给你:
    class CDrawEditDlg : public CDialog
    {
    // Construction
    public:
    CDrawEditDlg(CWnd* pParent = NULL); // standard constructor
    ~CDrawEditDlg();
    CBitmap  m_bitmap;
    CBrush  *m_pbrEd;
    BOOL     m_blInitEditBr;