Newsgroup: it.comp.programmare.win32
Titolo: Perchè la mia finestra è trasparente?

Salve,
Sto cominciando ora a muovere i primi passi con la programmazione di
applicazioni Windows. Ho cominciato con un semplice programma che mostra una
finestra e ci scrive dentro "Hello World" (in fondo si comincia sempre
così...).
Il problema però è che la finestra è trasparente, e cattura lo sfondo del
Desktop. Se la sposto lo sfondo catturato diventa lo sfondo della finestra.
Se la riduco ad icona e la ripristino, cattura lo schermo nella nuova
posizione. Ovviamente disegna sempre la scritta "Hello Word".
Che devo fare? Devo disegnare ogni volta un rettangolo pieno?
Grazie.
Allego il sorgente:
#include <windows.h>
#pragma hdrstop
#include <condefs.h>
USERC("Icona.rc"); // Contiene l'icona della finestra
#pragma argsused
#define MAIN_ICON 101
// Variabili
MSG message;
LRESULT CALLBACK WndProc (HWND hWND, UINT msg, WPARAM WParam, LPARAM LParam)
{
   switch( msg )
   {
      case WM_DESTROY: PostQuitMessage(0); break;
      case WM_PAINT  :
            PAINTSTRUCT ps;
            HDC hDC=BeginPaint(hWND , &ps);
            if (hDC)
            {
               TextOut(hDC, 20, 20, "Hello Word", 10);
            }
            EndPaint (hWND, &ps);
   }
   return DefWindowProc(hWND, msg, WParam, LParam);
}
WINAPI WinMain(HINSTANCE hInst, HINSTANCE , LPSTR , int nCmdShow)
{
   WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInst,
                   LoadIcon(hInst, MAKEINTRESOURCE(MAIN_ICON) ),
                   LoadCursor (NULL, IDC_ARROW), NULL, NULL,
                   TEXT("Window") };
   if ( !RegisterClass ( &wc ) ) return 0;
   HWND hWND = CreateWindow ("Window", "Finestra di gioco",
                             WS_OVERLAPPEDWINDOW,
                             200, 300, 400, 200, NULL, NULL, hInst, 0);
   if ( !hWND ) return 0;
   ShowWindow(hWND, nCmdShow);
   while( TRUE )
   {
     MSG msg;
     if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
     {
        if( msg.message == WM_QUIT )
        break;
        TranslateMessage( &msg );
        DispatchMessage( &msg );
     }
   }
   return 0;
}
--
===========================
                    BiiO
--------------------------------------------
   Home page       
www.biio.it
--------------------------------------------
  1°  E-Mail           
bi...@biio.it
  2°  E-Mail    
fab...@tiscalinet.it
===========================

Che devo fare? Devo disegnare ogni volta un rettangolo pieno?
La struttura WNDCLASS ha un elemento denominato hbrBackground, questo
e' un handler per un "pennello" (brush) standard usato per dipingere
lo sfondo della finestra. Utilizza un pennello bianco (o del colore
che preferisci) per lo sfondo.
   WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInst,
                   LoadIcon(hInst, MAKEINTRESOURCE(MAIN_ICON) ),
                   LoadCursor (NULL, IDC_ARROW), 
						 GetStockObject( WHITE_BRUSH ),
						 NULL,
                   TEXT("Window") };
Davide

in particolare guarda la proprieta' hbrBackground di WNDCLASS o WNDCLASSEX,
a seconda di quale usi..., non dovrebbe essere a null, ma puntare ad un
oggetto GDI chiamato BRUSH
wsnclass.hbrBackground = GetStockObject(LTGRAY_BRUSH);
(ce ne sono parecchi disponibili... WHITE_BRUSH, BLACK_BRUSH....)
se ne vuoi una rossa, o altro non presente usa questo
wndclass.hbrBackground = CreateSolidBrush(RGB(255, 0, 0));