0

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

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

我覆盖了 OnEraseBkgnd 以防止控件绘制背景,但它没有用。我终于设法通过使用 WS_EX_TRANSPARENT 做到了。

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

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

拜托,谁能给个提示?我对这个控制感到疯狂!!!

谢谢。

4

2 回答 2

3

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

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

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

于 2008-11-27T03:35:48.243 回答
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);
}
于 2010-12-15T19:53:52.607 回答