我正在尝试创建一个控件,在绘制32位位图时实现每像素alpha混合。
我扩展了CWnd并在资源编辑器中使用静态控件。我设法正确地绘制了alpha通道,但静态控件仍然在绘制灰色背景。
我覆盖了OnEraseBkgnd以防止控件绘制背景,但它没有用。我终于通过使用WS_EX_TRANSPARENT来实现这一目的。
我现在的问题是我的控制权被置于其他控制之下。第一次绘制对话框时一切正常......但是如果我点击“父”控件(即我控制下的控件),我的控件就不会收到WM_PAINT消息。所以它不再涂漆了。
如果我最小化应用并再次最大化,则再次绘制控件。
拜托,任何人都可以提示吗?我对这种控制感到疯狂!!!
感谢。
答案 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 - 抱歉俄语,但有例子。 示例在代码示例后的底部文章中有超链接“Впримере,которыйвыможетескачать”。 学习俄语:)