2012-07-13 19 views
6

He creado una casilla de verificación transparente en Win32 C++. Lo hice porque, por lo que sé, no puedes tener una casilla de verificación transparente en win32 nativo y necesito usar esta casilla de verificación en un instalador de NSIS.Cómo "borrar" una ventana transparente de WinAPI

Mi problema: Al repintar, no sé cómo borrar mi fondo transparente para poder dibujar sobre un "lienzo claro". Esto es importante cuando el usuario cambia el texto dentro de la casilla de verificación y necesito volver a pintarlo. Supongo que me he encontrado con el problema que todos deben tener con ventanas transparentes.

De qué manera puedo borrar mi ventana transparente, Nota Estoy familiarizado con WinAPI que realmente no puede borrar una ventana AFAIK porque simplemente vuelve a pintar sobre la ventana. Así que estoy buscando consejo sobre qué técnicas puedo utilizar para volver a dibujar la ventana, tales como:

  • Enviar un mensaje repinte a la ventana primaria que se espera que vuelva a pintar el padre (que es la sentada debajo de la casilla de verificación) withut enviar un mensaje a sus hijos (es decir, la casilla de verificación). He intentado esto, hace que la casilla de verificación tenga mucho parpadeo.
  • Tal vez hay una función de pincel/pintura transparente que no sé sobre la que podría utilizar para pintar sobre toda la ventana de la casilla de verificación que esencialmente borrará la ventana? He intentado esto, ¿hace que la ventana de casilla de verificación sea negra por algún motivo?

Mi código:

case WM_SET_TEXT: 
{ 
     // set checkbox text 
     // Technique 1: update parent window to clear this window 
     RECT thisRect = {thisX, thisY, thisW, thisH}; 
     InvalidateRect(parentHwnd, &thisRect, TRUE); 
} 
break; 
case WM_PAINT: 
{ 
    PAINTSTRUCT ps; 
    HDC hdc = BeginPaint(hwnd, &ps); 
    // Technique 2: 
    SetBkMode(hdc, TRANSPARENT); 
    Rectangle(hdc, thisX, thisY, thisW, thisH); // doesn't work just makes the window a big black rectangle? 
    EndPaint(hwnd, &ps); 
} 
break; 
+3

En general no quiero volver a enviar un mensaje de dibujo a otra ventana, si lo desea repintado, invalida es rectángulo. –

+0

¿Qué haces en tu controlador de mensajes WM_ERASEBKGND? –

+0

@LarryOsterman hmm ¿nunca antes funcionó con ese mensaje? Entonces nada en este momento, ¿qué debería hacer? –

Respuesta

0

que necesita para manejar el mensaje WM_ERASEBBKGND. ¡Algo como lo siguiente debería funcionar!

case WM_ERASEBKGND: 
{ 
    RECT rcWin; 
    RECT rcWnd; 
    HWND parWnd = GetParent(hwnd); // Get the parent window. 
    HDC parDc = GetDC(parWnd); // Get its DC. 

    GetWindowRect(hwnd, &rcWnd); 
    ScreenToClient(parWnd, &rcWnd); // Convert to the parent's co-ordinates 

    GetClipBox(hdc, &rcWin); 
    // Copy from parent DC. 
    BitBlt(hdc, rcWin.left, rcWin.top, rcWin.right - rcWin.left, 
     rcWin.bottom - rcWin.top, parDC, rcWnd.left, rcWnd.top, SRC_COPY); 

    ReleaseDC(parWnd, parDC); 
} 
break; 
+0

¿Pinta eso un "color" transparente o un botón estándar de color gris? Recuerde que la casilla de verificación tiene un fondo transparente y su padre padre puede no tener el fondo gris estándar, podría ser una imagen, etc. –

+0

@JakeM Vea la respuesta actualizada. Supongo que está manejando la parte de dibujo de la casilla de verificación. –

0

intenta quitar estilo de ventana WS_CLIPCHILDREN

+0

¿quiere decir eliminar el estilo de la casilla de verificación o de las casillas de verificación padre? –

+0

@JakeM desde la casilla de verificación –

Cuestiones relacionadas