我想创建而画一个32位的位图,它实现了每个像素的α混合的控制。

我延长一个CWnd和在资源编辑器使用静态控制。我设法正确地绘制alpha通道,但仍是静态控制保持画灰色背景。

我已改写了OnEraseBkgnd防止画背景的控制,但没有奏效。我最终通过使用WS_EX_TRANSPARENT做到这一点。

我现在的问题是我的控制被置于其他控制。第一次对话是画一切工作正常...但如果我点击了“父”控制(即我的控制之下的一个)我控制不接收WM_PAINT消息。因此,它不再被画。

如果我最小化aplication和最大化它再次控制被涂一遍。

请,任何人可以给出提示?我越来越疯狂与此控件!

感谢。

有帮助吗?

解决方案

我本来不过,如果你正在处理两者的 WM_ERASEBKGND WM_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);
}

http://unick-soft.ru/Articles.cgi?id=12 - 俄罗斯遗憾,但有实例。 例如具有码样本之后的超链接“Впримере,которыйвыможетескачать”,在底部制品。 学习俄语:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top