Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Stampa da richTextBox

Piccolo problemino: il controllo RichTextBox ha un suo metodo che consente
di stampare il suo contenuto sulla stampante, con le tutte le sue
formattazioni a posto; nel mai abbastanza lodato libro di F.Balena è
riportato un pezzetto di codice che consente di ottenere lo stesso risultato
impostando anche i margini della pagina; in entrambe i casi non è però
possibile sapere qual'è l'altezza del testo stampato.
Nel caso in cui ci fosse la necessità di saperlo, come si può fare?
Soliti ringraziamenti anticipati a chi potrà rispondere.
Salutoni
Sergio

 Nel caso in cui ci fosse la necessità di saperlo, come si può fare?
Se ti riferisci a una qualsiasi ipotetica riga (o, comunque, a una parte di
testo) temo che (tenendo conto di formati/font diversi, altezze diverse,
etc, la TextHeight possa (ma non ho provato) restituire risultati strani,
anche perchè come si fa a posizionare il font di riferimento se questo è
variabile (carattere per carattere?) ?
Se ti riferisci a dove è arrivata la stampa di tutto il testo (prima di
andare a pagina nuova, eheh), potresti provare con Printer.CurrentY,
considerando eventualmente anche il valore che questo aveva prima di
iniziare la stampa del testo interessato.

 iniziare la stampa del testo interessato.
Ho provato or ora con la proprietà currentY, anche perchè mi è venuto in
mente immediatamente dopo aver postato il messsaggio e mi sono dato del
cretino per non averlo fatto prima, ma con la funzione nativa del controllo,
in modo per me inspiegabile, la proprietà non cambia di valore, la posizione
corrente resta all'inizio del foglio! AZZ!
Comunque thanks a lot!
Sergio

 corrente resta all'inizio del foglio! AZZ!
Strano, ma, forse, non troppo. Fai una prova: immediatamente dopo
l'istruzione (o la serie) che stampa il RTB, fai una Printer.Print "Sono
arrivato qua" e poi Printer.EndDoc
Se te la trovi a inizio del foglio seguente (o corrente?, eheh...) significa
(escludendo che tu abbia esplicitamente cambiato foglio con un NewPage o
EndDoc, ri-eheh) che la stampa del RTB va automaticamente a foglio nuovo
(troppo pretenzioso), non posiziona il CurrentY (bug) o ..., no, direi
niente altro.

 niente altro.
Allora: posto che il metodo SelPrint normalmente lancia uno startdoc e un
EndDoc automatico, e questo suo comportamento è modificabile aggiungendo
false dopo aver indicato l'Hdc della stampante (e questo non viene detto
nell'help di VB6!!!), ho provato queste due cose:
1)
printer.print "" 'Per attivare il device context
richtextbox.selprint printer.hdc, false
printer.print "Pippo"
printer.enddoc
2)
printer.print "Pippo"
richtextbox.selprint printer.hdc, false
printer.enddoc
Il risultato dei due test è il medesimo: la stringa "Pippo" e il contenuto
del controllo vengono stampati in prossimità del margine superiore del
foglio (con risultati grafici a volte abbastanza apprezzabili.....;-))
La sensazione è che questi due sistemi di stampa lavorino in contesti
assolutamente non comunicanti, e che quindi non sia possibile utilizzare
questi due approcci contemporaneamente (solo che è proprio ciò che ho
bisogno di fare).
Per indicare il punto in cui cominciare la stampa ho appunto utilizzato la
funzione suggerita da Balena, il mio problema è sapere dove finisce!
Salutoni
Sergio

 funzione suggerita da Balena, il mio problema è sapere dove finisce!
Io getto la spugna, ma qualche spunto lo potresti trovare qui (per
esempio -con 8000 forse- per vedere la Height del RTB dopo averlo settato
come verrebbe rappresentato in stampa):
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q146022&


Intanto grazie a Lupo per la sua disponibilità.
L'articolo segnalato sul link è lo stesso su cui si è basato Balena per il
codice riportato nel suo (mai abbastanza lodato) libro.
Ci ho ponzato un po' su, e sono arrivato a questa conclusione (riporto anche
il ragionamento seguito, magari è utile come spunto):
(Per chiarezza: mi riferisco alla parte di codice che effettua la stampa del
contenuto del controllo)
La funzione utilizzata per la stampa è un SendMessage, e nella sua
dichiarazione i primi tre parametri sono passati per valore, mentre il
quarto no; quindi mi sono detto "Stai a vedere che l'ultimo parametro può
essere modificato dalla funzione!"
In effetti, per lanciare la stampa, il quarto parametro corrisponde ad una
struttura abbastanza complessa che contiene i seguenti campi:
Private Type FormatRange
   hdc As Long       ' Actual DC to draw on
   hdcTarget As Long ' Target DC for determining text formatting
   rc As Rect        ' Region of the DC to draw to (in twips)
   rcPage As Rect    ' Region of the entire DC (page size) (in twips)
   chrg As CharRange ' Range of text to draw (see above declaration)
End Type
Prima della chiamata alla funzione l'elemento rc contiene i limiti dell'area
del foglio da utilizzare per la stampa, dopo contiene invece i limiti della
regione effettivamente usati per stampare il contenuto del RichTextBox
(questo particolare, non segnalato, produce in realtà un malfunzionamento
della routine complessiva, anche se alquanto improbabile: nel caso di un
documento con molte pagine l'area utilizzabile può progressivamente
ridursi!) e ciò permette di ottenere l'informazione da me cercata.
Prego, potete smettere di applaudire ;-)
Sperando che tutto ciò possa essere utile a qualcuno (oltre che a me, of
course) porgo i miei più cordiali
Salutoni
Sergio

 course) ...
Plaudo, invece! Per il tuo bingo e per questo tuo post.

 Salutoni
Keep Message
Grazie, G.