与WS_EX_TRANSPARENT风格静态控制不重新绘制
-
11-07-2019 - |
题
我想创建而画一个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 - 俄罗斯遗憾,但有实例。 例如具有码样本之后的超链接“Впримере,которыйвыможетескачать”,在底部制品。 学习俄语:)
不隶属于 StackOverflow