Newsgroup: it.comp.programmare.win32
Titolo: Ho stampato! Ma.....

Ciao a tutti
ok ragazzi sono risucito a stampare in modo direi quasi "intelligente" contando le pagine, stampando più oggetti insieme etc...
Però non ho capito perchè se stampo con la mia EPSON C62 tutto ok! mi fa le dimensioni giuste che ho stabilito.
Se stampo con PDF CONVERTER mi stampa in una scala molto più piccola e se stampo con PDF 995 me ne fa una ancora diversa!!
Come si fa a fare tutto uguale per tutte le stampanti del mondo?
Grazie
Ciao
F

 wrote:
Aggiorno la situazione!
Ho creato questa funzione / classe
che mi crea la stampante e di cui sono riuscito a impostare la risoluzione, ....in teoria.
In pratica la stampante non accetta che io imposti la sua risoluzione,....mi snobba!
Dove sbagliio?
void CStampante::CreaStampante(void)
{
	CPrintDialog Pdlg(TRUE,PD_RETURNDEFAULT); //Il dlg non si apre
	Pdlg.GetDefaults();	
 
	DEVMODE *pDevMode=new (DEVMODE);
	pDevMode=Pdlg.GetDevMode();
	::GlobalUnlock(pDevMode); // servirà???
 
	// Metto il landscape e la risoluzione
	pDevMode->dmFields=DM_YRESOLUTION  |DM_ORIENTATION ;
	pDevMode->dmOrientation=DMORIENT_LANDSCAPE;
	pDevMode->dmYResolution=360;
	CString tmp;
	tmp.Format("%i",pDevMode->dmYResolution);
	MessageBox(tmp);
	Pdlg.m_pd.hDevMode=pDevMode;
	PrintDC.Attach(Pdlg.CreatePrinterDC());
 
	DOCINFO docinfo;
	memset(&docinfo, 0, sizeof(docinfo));
	docinfo.cbSize = sizeof(docinfo);
	docinfo.lpszDocName = TitoloStampa;
...
...

 	pDevMode=Pdlg.GetDevMode();
qui fai due errori, il primo è nell'allocazione, il secondo è
nel'assegnazione
dovrebbe essere qualcosa di simile:
<code>
//------------
// carichi il DEVMODE esistente
DEVMODE *pDevMode=Pdlg.GetDevMode();
// calcoli la dimensione necessaria a contenerlo
uint sizeDev = pDevMode->dmSize + pDevMode->dmDriverExtra;
DEVMODE *pNewDevMode= (DEVMODE*)new BYTE[sizeDev];
// copi i dati esistenti nel buffer appena allocato
memcpy(pNewDevMode, pDevMode, sizeDev);
/*
fai le tue modifiche a pNewDevMode
poi (non so com'è fatta la classe CPrintDialog) ci dovrebbe essere il
metodo SetDevMode() con cui imposti i nuovi valori, infine
*/
delete [](LPBYTE)pNewDevMode;
//------------
</code>
Ciao

più piccola e se stampo con PDF 995 me ne fa una ancora diversa!!
Io uso solo Acrobat per la conversione in Pdf e temo che, per
quel tipo particolare di operazione, tu non possa settare la
risoluzione da software. Infatti Acrobat stampa il documento in
formato postscript, poi lo "distilla" con le preferenze del
profilo impostato.

Ciao
Ho capito!
Corrego i pasticci da smanettone.



Ho capito che (chissà che scoperta, direte voi !)
grazie alla fuzione :
PrintDC.Attach(Pdlg.CreatePrinterDC());
	tmp.Format("X=%i  Y=%i Largh: %i  Altezza: %i",PrintDC.GetDeviceCaps(ASPECTX),PrintDC.GetDeviceCaps(ASPECTY)
						      ,PrintDC.GetDeviceCaps(PHYSICALWIDTH),PrintDC.GetDeviceCaps(PHYSICALHEIGHT));
	MessageBox(tmp);
Che la largheza e l'alteza fisca del DC dipende dalla risoluzione della stampante.
Per cui, a questo punto, o trovo il modo di impostare qualsiasi stampante (o presunta tale) del mondo alla risoluzione che voglio io, 
oppure prendo la risoluzione della stampante che trovo e adatto il mio disegno con qualche funzione "Scalometrica".
Giusto?

 wrote:
HA haaaaaaaaaaaaaaaa!!
Ho capito ! Volevate fregarmi!
Tutti zitti finchè non ci arriva da solo e intanto lo si prende in giro!
Tutti sapevate che se si usa il MapMode Isotropic i DPI influiscono sulle dimensioni della stampa e invece se si mette LOMETRIC o HIMETRIC 
è il DC che converte le misure automaticamente, ...e...nessuno ha parlato!!
Bene, bene,....chi la fa la aspetti! 
Domani mattina controllare bene la pressione delle gomme della vostra macchina!!
(qualcuno dirà : ma perchè cavolo hai usato il map mode ISOTROPIC ??? 
...ah sapessi.......)

...ah sapessi.......)
Continuo a rispondermi da solo!!
In realtà non è neanche così, ma sembra che il casino con i DPI succeda solo quando si usano le funzioni
SetViewportExt, SetWindowExt, ScaleViewportExt,ScaleWindowExt  in combinazione con il map mode ISOTROPIC.
che scalano i disegni in funzione della risoluzione del DC(stampante)
Era l'unico modo per fare casino con le stampe in mezzo ad altri 10 e io ho preso proprio quello!!!!!!!!
Sono un fenomeno a ficcarmi nei casini!
Scusate la telenovela (o telestampela)
Ciao
F

Filippo ha scritto:

Scusa, non mi ero posto il problema se sapessi o meno come funzionano
le cose in generale. Avevo solo visto delle imprecisioni nel tuo codice
e te le avevo mostrate.
Non ricordo bene perché sono cose che ho fatto vari anni fa, messe in
una classe che mi gestisce il tutto ed uso quella, comunque per quel
che mi ricordo ho impostato il MM_LOMETRIC e stampo sempre in decimi di
mm fregandomene della risoluzione impostata dall'utente. La classe fa
poi il parsing di un file di testo in cui scrivo cosa deve stampare,
come e dove.
Le varie SetViewportExt, SetWindowExt, ScaleViewportExt, ScaleWindowExt
dovrebbero servire solo per creare un'anteprima di stampa e quindi
adattare le misure, dai decimi di mm, ai pixel della finestra.
Ciao

Ciao
! Sei già il secondo programmatore che conosco che fa la stessa cosa per stampare, cioè il parsing di un file di testo!
Si vede che in C è la cosa più comoda da fare per gestire le stampe.
In ogni caso io ho bisogno di stampare un disegno che , ipotesi, può essere largo, diciamo 1000 e quindi ci sta dentro il foglio, 
poi subito dopo stampo un'altro disegno che è largo 10000 e quindi non ci sta più e perciò devo scalarlo.
Considera che il disegno ha un bel poà di variabili, che non vorrei moltiplicare una per una per un fattore di scala, e che ci vorei far stare 
più disegni in una pagina di stampa (almeno 6) , metti tutto in un frullatore e ti esce il bel problemone!
per cui per risolverlo sto cercando di scalare a seconda delle misure massime del singolo disegno.
Non è proprio facile!
Ciao
F

Filippo ha scritto:

Le primitive di disegno non sono poi tante, se le metti in una classe a
cui aggiungi il DC, i fattori di scala e gli offset x, y hai già
risolto metà dei tuoi problemi. Naturalmente ogni wrapper dovrà farsi
i suoi calcoli (tempo relativamente piccolo rispetto alla fase di
stampa vera).
Se non puoi sapere prima quale sarà l'ampiezza massima non ti resta
altro che fare un doppio ciclo. Nel primo ti calcoli solo l'ingombro,
ti fai le opportune verifiche e crei l'oggetto passandogli i dati. Nel
secondo passi i comandi di disegno direttamente all'oggetto.
Se invece di passare direttamente i dati all'oggetto ti dai delle
regole per identificare i vari comandi puoi isolare la creazione dei
dati da stampare dalla stampa effettiva.
E usare un file di testo è un mezzo molto comodo. Infine, tra la fase
di creazione dei dati da stampare e la stampa stessa, si può passare
per vari filtri, inviare per email, ecc.
Ciao