创建透明CEdit控件

1.在资源编辑器中将Edit控件的Border设为none(当然也可以在代码中修改窗口样式)

2.在重载CEdit的类中响应MSG_OCM_CTLCOLOREDIT消息,在处理函数中将背景模式设为透明,否则无法显示背景画刷填充效果

3.从父窗口截取控件对应位置的图片,以此图片创建画刷作为控件的背景画刷返回

4.在Edit的EN_CHANGE处理中调用Invalidate(),否则由于第一步的操作,会导致文本重叠

相关代码如下

// ACEdit.h

#pragma once

#include "ACListWnd.h"

class CACEdit : public CWindowImpl<CACEdit, CEdit> {
public:
    CACEdit();
    virtual ~CACEdit();

protected:
    BEGIN_MSG_MAP_EX(CACEdit)
        REFLECTED_COMMAND_CODE_HANDLER(EN_CHANGE, OnChange)
        MSG_OCM_CTLCOLOREDIT(OnCtlColorEdit)
        DEFAULT_REFLECTION_HANDLER()
    END_MSG_MAP()

    LRESULT OnChange(UINT wNotifyCode, UINT wID, HWND hWndCtl, BOOL& bHandled);
    LRESULT OnCtlColorEdit(HDC hDC, HWND hWnd);
        
private:
    CDC m_dcBk;
    CBitmap m_bmpBk;
    CBrush* m_pbkBrush;
};
// ACEdit.cpp

#include "stdafx.h"
#include "ACEdit.h"

CACEdit::CACEdit() {
    m_pbkBrush = NULL;
}

CACEdit::~CACEdit() {
}

LRESULT CACEdit::OnChange(UINT wNotifyCode, UINT wID, HWND hWndCtl, BOOL& bHandled) {
    Invalidate();
    return 0;
}

LRESULT CACEdit::OnCtlColorEdit(HDC hDC, HWND hWnd) {
    SetBkMode(hDC, TRANSPARENT);
    if(NULL == m_pbkBrush) {
        CRect rect;
        GetClientRect(rect);
        CRect rect1;
        CClientDC clDC(GetParent());
        GetWindowRect(rect1);
        GetParent().ScreenToClient(rect1);
        m_dcBk.CreateCompatibleDC(clDC);

        m_backBmp.CreateCompatibleBitmap(clDC, rect.Width(), rect.Height());
        m_dcBk.SelectBitmap(m_backBmp);
        m_dcBk.BitBlt(0,0,rect.Width(),rect.Height(),clDC,rect1.left,rect1.top,SRCCOPY);
        m_pbkBrush = new CBrush(CreatePatternBrush((HBITMAP)m_backBmp));
    }
    return (LRESULT)(m_pbkBrush->m_hBrush);
}

贴张效果图

原文地址:https://www.cnblogs.com/mforestlaw/p/3617171.html