Newsgroup: it.comp.lang.visual-basic
Titolo: Rendere MDIChild un non-Child...

Ho appena terminato un mio controllo OCX, e ora sorge questo problema: il
mio OCX, tra le altre cose, visualizza anche un form nel quale vengono
inseriti dei dati. Questo form è, naturalmente, di tipo non-mdiChild (visto
che non ha senso inserire in un OCX un form MDI con all'interno un
mdiChild...). Ora, se utilizzo l'OCX all'interno di una applicazione che non
utilizza un form di tipo MDI, tutto bene ma, nel caso voglia sviluppare una
applicazione di tipo MDI con i form di tipo mdiChild, quando il mio
controllo visualizza il suddetto form, esso non viene inserito all'interno
del form MDI, ma viene visualizzato su "un piano diverso", cosicchè se io
clicco in un'area del form MDI il mio form sparisce sotto il form MDI e non
lo rivedo più. Allo stesso modo non riesco ad utilizzare le proprietà
affianca, sovrapponi ecc.. anche con questo form, proprio perchè non è di
timo mdiChild. Ho provato a impostare il mio form come mdiChild ma, essendo
parte di un controllo "esterno" all'applicazione, quando lo visualizzo mi
diche che non c'è "nessun form MDI disponibile per il caricamento"
generandomi un errore.
So che esiste (l'ho vista una volta) una API che mi permette di "cambiare"
la proprietà di un form da non-MDI a mdiChild, passando l'hWnd del form MDI.
Qualcuno può indicarmela? Grazie!

Non credo che sia possibile renderlo child però se lo vuoi sullo stesso
'piano' quando lo visualizzi, passagli come ownerform il form mdi.


Si puņ... basta usare l'API SetParent
Ciao

...

Penso che l'unico modo sia renderlo figlio con l'APE SetParent() di cui non
ricordo l'ordine dei parametri, ma vuole hWnd del padre e del nuovo figlio.
Puoi usarla in un metodo del tuo OCX.
Ciao.




Ehm... è l'API più semplice che abbia mai vista ^_^;;;
Il primo parametro è l'handle della finestra di cui vuoi cambiare il parent,
mentre il secondo è l'handle del nuovo parent. Il valore di ritorn è
l'handle del padre che aveva prima di cambiarlo.. semplice no?
Si può usare per staccare le Child dalla MDI e attaccarle al Desktop e poi
riattaccarle.... così puoi gestire le finestre dockable tipo VB... ma questa
è un'altra storia che non ha tempo e luogo ^__^
Ciao


Mi dispiace dirtelo, ma SetParent non basta...
Con SetParent la form rimane all'interno della MDI parent, ma non si
comporta esattamente come una MDIChild (ha alcuni effetti indesiderati che
ora non ricordo...)
--
Roal Zanazzi
z...@iol.it


Ciao,
avevo già provato questa strada in passato però non ottieni un vero child ma
un 'imparentato' che ha solo la caratteristica di essere ospitato nell'area
dell'mdi

parent e poi riattacarla, no?
No, il problema originale era di fare diventare child un 'non-mdiChild '.
Il tuo esempio funziona perfettamente perchè, in pregettazione, hai
impostato child Form1.
Personalmente avevo dedicato parecchio tempo a questo problema decidendo poi
di abbandonare. Però vista la tua invidiabile preparazione, ti sarei grato
se ....
Ciao


Invidiabile? Cmq sono appena sei mesi che programmo....
non so.. infatti da delle anomalie.. e con lo spy++ ho visto che una child
vera, rispetto a una child attaccata, ha uno Style in piů: WM_CHILDWINDOW.
Forse si dovrebbe assegnargli questo style con SetWindowLong.
Se le form fanno parte tutte e due di un progetto VB unico, potresti crearla
Child, poi staccarla e visualizzarla...  altre idee non ne ho.. mi dispiace
deluderti ;_;
Ciao

...



Come ti dicevo in questo messaggio, la differenza tra una vera MDI Child e
una Child attaccata, sta nello Style WM_CHILDWINDOW che manca in
quest'ultima. O provi a mettergli anche questo style, oppure la devi creare
dal nulla con CreateMDIWindow o CreateWindowEx. Io non so altro, mi
dispiace.
Ciao


Esatto, il problema e' che c'e' anche un'altra differenza (oltre allo style
WM_CHILDWINDOW) tra una form normale e una MDIChild...
Purtroppo non me la ricordo :-(
Avevo provato tempo fa (sia in Delphi che in VB) a trasformare una form
normale in MDIChild, ma non c'ero riuscito, poi ho lasciato perdere.
La differenza (che non ricordo) in pratica rendeva impossibile "trasformare"
la form, quindi l'unico modo sarebbe di creare la form gia' come MDIChild.
Purtroppo pero' per farlo in VB bisogna avere anche una MDIParent, e questo
non e' possibile (o non e' voluto) in DLL e OCX...
--
Roal Zanazzi
z...@iol.it


Salve a tutti,
io avrei il problema inverso: ho delle MDIChild che devo trasformare in NON
Child (e viceversa, ma sono già definite come Child). Il problema è più semplice
o non vale la pena tentare?
grazie
Flavio Ronco
f.ronco@*NonMiServeNiente*
flashnet.it
http:\\
www.geocities.com
\Paris\3461\
-------------------------------------------------------------
"Dio ha uno screensaver. Speriamo che non tocchi il mouse..."


Il problema è più semplice. Usa l'API SetParent
Ciao