WS_EX_TRANSPARENT样式的静态控件未重新绘制

时间:2008-11-26 00:49:09

标签: mfc user-controls gdi cwnd

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

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

我覆盖了OnEraseBkgnd以防止控件绘制背景,但它没有用。我终于通过使用WS_EX_TRANSPARENT来实现这一目的。

我现在的问题是我的控制权被置于其他控制之下。第一次绘制对话框时一切正常......但是如果我点击“父”控件(即我控制下的控件),我的控件就不会收到WM_PAINT消息。所以它不再涂漆了。

如果我最小化应用并再次最大化,则再次绘制控件。

拜托,任何人都可以提示吗?我对这种控制感到疯狂!!!

感谢。

3 个答案:

答案 0 :(得分:3)

如果您正在同时处理 WM_ERASEBKGND WM_PAINT 消息,那么您应该已经涵盖了所有绘画选项,而无需使用 WS_EX_TRANSPARENT 样式。

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

另一个选项可能是子类静态控件,只是为了确保您的代码是处理这两个消息的唯一代码。

答案 1 :(得分:2)

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);
}

答案 2 :(得分:0)

http://unick-soft.ru/Articles.cgi?id=12 - 抱歉俄语,但有例子。 示例在代码示例后的底部文章中有超链接“Впримере,которыйвыможетескачать”。 学习俄语:)