Mfc 具有WS_EX_透明样式的静态控件未重新绘制

Mfc 具有WS_EX_透明样式的静态控件未重新绘制,mfc,user-controls,gdi,cwnd,Mfc,User Controls,Gdi,Cwnd,我试图创建一个控件,在绘制32位位图时实现每像素alpha混合 我扩展了CWnd并在资源编辑器中使用静态控件。我成功地正确绘制了alpha通道,但静态控件仍在绘制灰色背景 我重写了OnEraseBkgnd以防止控件绘制背景,但它不起作用。我最终通过使用WS_EX_TRANSPARENT实现了这一点 我现在的问题是我的控制权凌驾于其他控制权之上。第一次绘制对话框时一切正常……但是如果我单击“父”控件(即我控件下的控件),我的控件不会收到WM_PAINT消息。所以它不再是画的了 如果我最小化应用程序

我试图创建一个控件,在绘制32位位图时实现每像素alpha混合

我扩展了CWnd并在资源编辑器中使用静态控件。我成功地正确绘制了alpha通道,但静态控件仍在绘制灰色背景

我重写了OnEraseBkgnd以防止控件绘制背景,但它不起作用。我最终通过使用WS_EX_TRANSPARENT实现了这一点

我现在的问题是我的控制权凌驾于其他控制权之上。第一次绘制对话框时一切正常……但是如果我单击“父”控件(即我控件下的控件),我的控件不会收到WM_PAINT消息。所以它不再是画的了

如果我最小化应用程序并再次将其最大化,控件将再次绘制

请问,有人能给个提示吗?我越来越疯狂与这个控制


谢谢

我认为,如果您同时处理WM_ERASEBKGNDWM_PAINT消息,那么您应该涵盖所有的绘画选项,而不必使用WS_EX_TRANSPARENT样式

您确定您的代码没有将这些消息传递给默认处理


另一个选项可能是对静态控件进行子类化,以确保您的代码是唯一处理这两条消息的代码。

我认为,如果您同时处理WM_ERASEBKGNDWM_PAINT消息,那么您应该涵盖所有的绘制选项,无需使用WS_EX_TRANSPARENT样式

BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
    ON_WM_ERASEBKGND()
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

BOOL CTransparentStatic::OnEraseBkgnd(CDC* /*pDC*/)
{
    // Prevent from default background erasing.
    return FALSE;
}

BOOL CTransparentStatic::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.dwExStyle |= WS_EX_TRANSPARENT;
    return CStatic::PreCreateWindow(cs);
}

HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
    pDC->SetBkMode(TRANSPARENT);
    return reinterpret_cast<HBRUSH>(GetStockObject(NULL_BRUSH));
}

void CTransparentStatic::PreSubclassWindow()
{
    CStatic::PreSubclassWindow();

    const LONG_PTR exStyle = GetWindowLongPtr(m_hWnd, GWL_EXSTYLE);
    SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_TRANSPARENT);
}
您确定您的代码没有将这些消息传递给默认处理

另一个选项可能是对静态控件进行子类化,以确保您的代码是处理这两条消息的唯一代码。

BEGIN\u MESSAGE\u MAP(CTransparentStatic,CStatic)
BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
    ON_WM_ERASEBKGND()
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

BOOL CTransparentStatic::OnEraseBkgnd(CDC* /*pDC*/)
{
    // Prevent from default background erasing.
    return FALSE;
}

BOOL CTransparentStatic::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.dwExStyle |= WS_EX_TRANSPARENT;
    return CStatic::PreCreateWindow(cs);
}

HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
    pDC->SetBkMode(TRANSPARENT);
    return reinterpret_cast<HBRUSH>(GetStockObject(NULL_BRUSH));
}

void CTransparentStatic::PreSubclassWindow()
{
    CStatic::PreSubclassWindow();

    const LONG_PTR exStyle = GetWindowLongPtr(m_hWnd, GWL_EXSTYLE);
    SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_TRANSPARENT);
}
关于_WM_ERASEBKGND() 关于颜色反射() 结束消息映射() BOOL CtrTransparentStatic::OnEraseBkgnd(CDC*/*pDC*/) { //防止默认背景擦除。 返回FALSE; } BOOL CtrTransparentStatic::PreCreateWindow(CREATESTRUCT&cs) { cs.dwExStyle |=WS_EX_透明; 返回CStatic::预创建窗口(cs); } HBRUSH CtrTransparentStatic::CtlColor(CDC*pDC,UINT/*nCtlColor*/) { pDC->SetBkMode(透明); 返回reinterpret_cast(GetStockObject(NULL_笔刷)); } void CTransparentStatic::PreSubclassWindow() { CStatic::PreSubclassWindow(); const LONG_PTR exStyle=GetWindowLongPtr(m_hWnd,GWL_exStyle); SetWindowLongPtr(m_hWnd、GWL_EXSTYLE、EXSTYLE | WS_EX_TRANSPARENT); }
开始消息映射(CTransparentStatic、CStatic)
关于_WM_ERASEBKGND()
关于颜色反射()
结束消息映射()
BOOL CtrTransparentStatic::OnEraseBkgnd(CDC*/*pDC*/)
{
//防止默认背景擦除。
返回FALSE;
}
BOOL CtrTransparentStatic::PreCreateWindow(CREATESTRUCT&cs)
{
cs.dwExStyle |=WS_EX_透明;
返回CStatic::预创建窗口(cs);
}
HBRUSH CtrTransparentStatic::CtlColor(CDC*pDC,UINT/*nCtlColor*/)
{
pDC->SetBkMode(透明);
返回reinterpret_cast(GetStockObject(NULL_笔刷));
}
void CTransparentStatic::PreSubclassWindow()
{
CStatic::PreSubclassWindow();
const LONG_PTR exStyle=GetWindowLongPtr(m_hWnd,GWL_exStyle);
SetWindowLongPtr(m_hWnd、GWL_EXSTYLE、EXSTYLE | WS_EX_TRANSPARENT);
}