Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Copia Form con SendMessage, WM_Paint e WM_Print

Ciao a tutti:
  sul sito Microsoft nella sezione Support c' e' un
articolo dal titolo "HOWTO: Print a Form That Is Too
Large for the Screen or Page".
Qualcuno di voi l' ha mai provato?
Quando io provo a copiare il Form1 su di un PictureBox1
piazzato su di un Form2 usando, come descritto, l' API
SendMessage con:
   ....
   rv = SendMessage(Form1.hWnd, WM_PAINT, Form2.PictureBox1.hDC, 0)
   rv = SendMessage(Form1.hWnd, WM_PRINT, Form2.PictureBox1.hDC, _
        PRF_CHILDREN + PRF_CLIENT + PRF_NONCLIENT + PRF_CHECKVISIBLE)
   ...
mi si presentano i seguenti problemi:
1) l' immagine eventualmente presente sul Form1, come
   pure l' area coperta dal Form1 BackColor, viene spostata
   verso l' alto di un passo pari all' altezza del Caption
   del Form1.
2) anche i controlli di tipo Label ed Image vengono
   spostati ugualmente verso l' alto.
3) se sul Form1 c' e' un PictureBox, questo viene copiato
   ma senza la sua immagine (come se fosse trasparente);
   eventuali altri controlli, contenuti nel PictureBox,
   vengono regolarmente copiati.
4) i Frames vengono copiati ma senza il loro BackColor
   (anche loro come se fossero trasparenti).
5) i controlli di tipo MSFlexGrid vengono copiati senza
   righe e colonne (trasparenti).
Se, invece di un Form, provo a copiare un singolo
controllo (PictureBox, Frame, MSFlexGrid, ...) questo viene
copiato correttamente.
Ancora ciao e grazie per ogni suggerimento atto a risolvere
questi problemi.
Franco
Web: 
http://www.flanguasco.org


se mandi il messaggio wm_paint (corrisponde all'evento paint del form)al
form viene disegnato quello che il form "deve" disegnare.Il wm_paint del
picturebox (o qualsiasi altro controllo con un proprio hwnd) non spetta al
form ma al controllo stesso.La copia avviene in quanto passi l'hdc del
picturebox di "form2"  e  "form1" usa quello.
Per una copia completa dovrai mandare lo stesso messaggio a tutti i
controlli nella giusta sequenza.
ciao

 controlli nella giusta sequenza.
Avevo pensato a fare qualcosa del genere (usando un
PictureBox per la copia temporanea dei vari controlli
da assemblare, poi, in un altro PictureBox finale) ma come
fare con quelli che non espongono l' hWnd? (*)
Lo scopo di tutto questo ambaradan e' quello di
poter stampare TUTTO un Form, anche quando e' parzialmente
o totalmente nascosto e se non posso metterci anche
le Labels, le Images, le Shapes, ..., l' obiettivo
non e' raggiunto :-).
Ciao, per ora ed a risentirci.
Franco
(*) ci sarebbe forse un modo, molto arzigogolato, di
copiare in successione (e poi di spostarle nelle loro
rispettive posizioni) le parti PRF_CLIENT e PRF_NONCLIENT,
ma vorrei lasciarlo come ultima spiaggia.
Web: 
http://www.flanguasco.org

Ciao a tutti:
  faccio seguito al mio precedente messaggio per
informarvi di come ho risolto il problema: mi scuso,
ovviamente, con tutti coloro che troveranno banali
queste note.
Il mio problema era su come addomesticare queste due API:
   rv = SendMessage(obj1.hWnd, WM_PAINT, obj2.hDC, 0)
   rv = SendMessage(ob1.hWnd, WM_PRINT, obj2.hDC, _
        PRF_CHILDREN + PRF_CLIENT + PRF_NONCLIENT + PRF_CHECKVISIBLE)
Entrambe copiano "qualcosa" dell' oggetto obj1 (purche'
fornito della proprieta' hWnd) sull' oggetto obj2 (in
pratica solo Forms e PictureBoxes).
Dopo aver passato diverse ore in Rete cercando informazioni
su SendMessage, WM_PAINT, WM_PRINT con relativi parametri
PRF_*** (senza trovare granche') ho seguito il metodo PVC
dei vecchi ingegneri Olivetti (pruvuma, veduma, changiuma...).
E' venuto fuori che la prima istruzione copia solamente
il BackColor, l' eventuale Picture di sfondo e tutti i
controlli grafici (Labels, Shapes, Lines, Images, etc...)
presenti su di un controllo mentre la seconda copia i
bordi (ma senza curarsi delle eventuali sovrapposizioni),
la barra Caption (dei Forms), le ScrollBars delle Grids,
i TextBoxes, etc...
Insomma, un gran casino :-))  Anche per quanto riguarda
i PRF:*** c' e' da divertirsi: per copiare TextBoxes,
ListBoxes, ... basta PRF_CLIENT + PRF_NONCLIENT mentre
per i ComboBoxes bisogna aggiungere + PRF_CHILDREN.
Armato di queste scoperte mi sono messo, allora, a
cercare di ricomporre il Form su di un PictureBox
copiando un controllo per volta, dopo averli elencati
tutti in una lista e messi in ordine di hWndParent per
ottenere le giuste sovrapposizioni.
Il metodo usato prevede un PictureBox intermedio picT
(la copia con SendMessage non permette di specificare
le coordinate di destinazione) e consiste nel:
1) trovare con GetWindowRect e GetClientRect le
   posizioni e le dimensioni del Controllo e della
   sua area Client.
2) copiare con WM_PAINT lo sfondo del Controllo
   e poi spostarlo nella sua posizione Client.
3) sovrapporre su picT, con WM_PRINT, la cornice
   del Controllo.
4) copiare picT sul PictureBox finale nella sua
   giusta posizione.
E funziona...  Per la prima volta, dopo anni che
provavo, riesco a copiare (e quindi anche a stampare)
Forms e Controlli che siano parzialmente o totalmente
coperti da altri oggetti (od anche fuori schermo).
L' esempio Microsoft "HOWTO: Print a Form That Is Too
Large for the Screen or Page" e' del tutto semplicistico:
non viene, infatti, stampato un Form ma solo un Picture-
Box ed anche piuttosto "sguarnito".
Per chi fosse interessato ho fatto un progettino che
copia un Form (letteralmente zeppo di Controlli di
tutti i tipi che si ricoprono a vicenda) ed anche i
singoli Controlli (che ne contengono altri...).
Anche se sono molto contento del risultato ottenuto,
spero tanto che si alzi qualcuno di voi dicendo: ehi,
co***one, bastava mandare questo comando ed il gioco era
fatto senza tante complicazioni!  Ben vengano le sempli-
ficazioni :-))
Ancora ciao a tutti, scusate la lunghezza del messaggio
ed a risentirci.
Franco
Web: 
http://www.flanguasco.org

 Box ed anche piuttosto "sguarnito".
speie a quest'ora, e' la parte che capisco meglio, e intanto grazie, visto
che quella stampa e' una delle domande piu' ricorrenti.
non ti chiedo il progettino. ci capirei zero, ancora boccheggio sugli
anagrammi :)
ciao, a.

 Web: 
http://www.flanguasco.org
ho guardato sul tuo sito ma non l'ho trovato...
non l'hai messo ?
ciao

 non l'hai messo ?
No, non ancora: aspetto di rifinirlo per bene e
di integrarlo in StampaFCPB.  Se vuoi, posso pero'
mandartene una copia preliminare.
Ciao ed a presto.
Franco

 di integrarlo in StampaFCPB.
posso aspettare cmq grazie...
ciao
ps. esempi interessanti sul sito un bel lavoro...