Newsgroup: it.comp.programmare.win32
Titolo: Finestra Child

Salve a tutti!
Sto imparando i concetti delle child windows, per ora intese come
control e poco altro. Ho voluto sperimentare la creazione di una child
intesa come finestra in tutto e per tutto: creo un tasto nella
finestra parent e se lo clicco si apre una finestra dentro la parent.
In WM_COMMAND trappo il tasto premuto dopodiche' faccio qualcosa del
genere:
WNDCLASS     wndclass;
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc   = WndProcChild ;
wndclass.cbClsExtra    = 0 ;
wndclass.cbWndExtra    = 0 ;
wndclass.hInstance     = hInstance_funz ;
wndclass.hIcon         = LoadIcon (hInstance_funz, MAKEINTRESOURCE
(IDI_PROVA));
wndclass.hCursor       = LoadCursor (hInstance_funz,
MAKEINTRESOURCE(IDC_PROVA)) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName  = NULL ;
wndclass.lpszClassName = "finestra";
if (!RegisterClass (&wndclass))  
{
  MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
            "finestra", MB_ICONERROR) ;
  return 0 
}
hwnd_childwin = CreateWindow ("finestra", TEXT ("Finestra di prova"),
          WS_CHILD|WS_OVERLAPPEDWINDOW,
          50, 100,
          400, 200,
          hwnd, NULL, hInstance_funz, NULL) ;
ShowWindow (hwnd_childwin, SW_SHOW) ;
UpdateWindow (hwnd_childwin) ;
cioe' quello che faccio nel main con un po' di parametri sistemati
(l'hinstance, il nome della classe etc). La WndProcChild trappa il
WM_PAINT e scrive il classico "Hello World!".
Sicuramente c'e' un modo piu' elegante per creare la finestra child ma
c'e' una cosa che non mi convince: il programma si compila e la
finestra viene creata ma tutti i controlli che sono sotto la nuova
finestra vengono disegnati sopra quella nuova ad ogni aggiornamento
della finestra parent (vengono invalidate aree del client e quindi
ogni tanto parte un WM_PAINT) e onestamente non so come risovere il
problema (provato con SetActiveWindow ma niente da fare).
Vi ringrazio in anticipo!

della finestra parent
La notte a volte porta consiglio... Per ovviare al problema mi tocca
tirare in ballo la gestione dei thread separando cosi' i compiti delle
due finestre?

Ho fatto un passo avanti mettendo WS_CLIPCHILDREN al momento della
creazione della parent window e WS_CLIPSIBLINGS in ogni control
all'interno della finestra stessa. In questo modo ne' la parent ne' i
controlli (principalmente bottoni, checkbox e progress bar)
sovrascrivono la child se questi vengono ridisegnati.
Pero'...
Al momento della sua creazione la child e' "sporcata" dalle checkbox
che ha sotto. Se la sposto le immagini dei checkbox rimangono fino
alla prima WM_PAINT. Potrebbe bastare un InvalidareRect o c'e' il
classico modo piu' elegante per ovviare a cio'?

che ha sotto.
Pian pianino sto provando a risolvere il mio dilemma... Ho letto che
non e' possibile combinare WS_CHILD, WS_OVERLAPPED e WS_POPUP
(ovviamente io ho messo WS_CHILD e WS_OVERLAPPED da bravo niubbo).
Ho specificato WS_OVERLAPPED window e l'handler della finestra parent
all'interno della CreateWindow. In questo modo la finestra e' libera
di muoversi per lo schermo e non e' confinata all'interno della client
ma cerchero' di venire a capo del problema (magari un aiutino :)

(ovviamente io ho messo WS_CHILD e WS_OVERLAPPED da bravo niubbo).
Mettici:
WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SIZEBOX
Se vuoi ti posto il codice completo.
Ciao
Paolo

Se vuoi ti posto il codice completo.
Mi faresti un grande favore... E' da un paio di giorni che ci sto
sbattendo la testa senza risolvere nulla!