1. 建立一个基于对话框的工程。
2. 删除对话框上默认给出的几个控件。
3. 新建一个MFC类CMyEdit,其父类为CEdit 类。
4. 引进一位图资源,接受位图资源的默认ID。
5. 向对话框中添加一个编辑框控件,设置其属性为read only\multiline,并为这个控件添加一个CMyEdit类的变量m_edit;
6. 为CMyEdit添加WM_ERASEBKGND消息响应函数,注释掉此函数的默认返回值。
并添加如下代码:
CBitmap bitbmp;
bitbmp.LoadBitmap(IDB_BITMAP1);
BITMAP bmp;
bitbmp.GetBitmap(&bmp);

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&bitbmp);

MoveWindow(0,0,bmp.bmWidth,bmp.bmHeight);
pDC->BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&memDC,0,0,SRCCOPY);
return FALSE;
7. 为CMyEdit添加=WM_CTLCOLOR消息响应函数,并添加如下代码:
pDC->SetBkMode(TRANSPARENT);

解决方案 »

  1.   

    设置Edit的属性:Multiline, 无Border1.定义类成员变量:CBitmap m_bmp;
    CBrush m_brush;//在WM_CREATE消息中初始化它们:int CMyEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CEdit::OnCreate(lpCreateStruct) == -1)
    return -1;// TODO: Add your specialized creation code here
    HBITMAP hBmp = (HBITMAP)LoadImage( AfxGetInstanceHandle(), "C:\\background.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    ASSERT( hBmp != NULL );
    m_bmp.Attach( hBmp );m_brush.CreatePatternBrush( &m_bmp );return 0;
    }
    2.映射消息:
    ON_WM_CTLCOLOR_REFLECT()HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
    // TODO: Change any attributes of the DC herepDC->SetBkMode(TRANSPARENT);return (HBRUSH)m_brush;// TODO: Return a non-NULL brush if the parent's handler should not be called
    return NULL;
    }
    特别注意:
    pDC的坐标原点为Edit控件左上角在父窗口的坐标, 所以C:\\background.bmp左上角对应Edit父窗口的左上角,而不是Edit控件的左上角3.映射消息:
    ON_CONTROL_REFLECT(EN_CHANGE, OnChange)void CSkinEdit::OnChange() 
    {
    // TODO: If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CEdit::OnInitDialog()
    // function and call CRichEditCtrl().SetEventMask()
    // with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here
    InvalidateRect( NULL );}
      

  2.   

    恩,关键是多了个border属性
    在6.0下这个border属性是不影响什么的,但在2008下就会有问题,不知道MFC做了什么修改
      

  3.   

    问题应该是出在这一句上:pDC->SetBkMode(TRANSPARENT); 
    因为没有2008版所以无从测试。楼主试一下注释掉看看。如果有变化,再想解决方法。