mfc user-controls gdi cwnd

mfc - Control estático con estilo WS_EX_TRANSPARENT no repintado



user-controls gdi (3)

Sin embargo, hubiera pensado que, si está procesando los mensajes WM_ERASEBKGND y WM_PAINT , debería tener que cubrir todas las opciones de pintura sin tener que recurrir al estilo WS_EX_TRANSPARENT .

¿Estás seguro de que tu código no está pasando estos mensajes al procesamiento predeterminado ?

Otra opción podría ser subclasificar el control estático, solo para asegurarse de que su código sea el único que maneja estos dos mensajes.

Intento crear un control que implemente la mezcla alfa por píxel mientras pinto un mapa de bits de 32 bits.

Amplié un CWnd y uso el control estático en el editor de recursos. Logré pintar el canal alfa correctamente, pero el control estático sigue pintando el fondo gris.

Sobreescribí el OnEraseBkgnd para evitar que el control pintara el fondo pero no funcionó. Finalmente logré hacerlo usando WS_EX_TRANSPARENT.

Mi problema ahora es que mi control se coloca sobre otro control. La primera vez que se pinta el cuadro de diálogo todo funciona bien ... pero si hago clic sobre el control "principal" (es decir, el que está bajo mi control), mi control no recibe el mensaje WM_PAINT. Entonces ya no está pintado.

Si minimizo la aplicación y la vuelvo a maximizar, los controles se pintan nuevamente.

Por favor, ¿alguien puede dar una pista? ¡Me estoy volviendo loco con este control!

Gracias.


http://unick-soft.ru/Articles.cgi?id=12 - lo siento en ruso, pero tengo el ejemplo. Ejemplo tiene hipervínculo "В примере, который вы можете скачать", en el artículo inferior después del ejemplo de código. Aprender ruso :)


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