QPrinter::setup()

Simon Rutishauser simon.rutishauser at web.de
Mon Oct 18 13:17:55 CEST 2004


Just two hours after writing the first post I found the solution. It is 
quite weird nevertheless. devmode->dmDeviceName has to be initialized or 
the other settings in devmode won't be used.

I do the initialization via
   qt_strncpy(devmode->dmDeviceName, QString("").ucs2(), 32);
because the other ways I tried to do this it did not work at all. Can 
someone tell me how I can correctly initialize devmode->dmDeviceName 
which is a WCHAR[32] or unsigned short [32] array without using this 
ugly and stupid method?

Changed patch attached.

Simon

On Sun, Oct 17, 2004 at 03:06:35PM +0200, Simon Rutishauser wrote:
> Hello,
> 
> for the last few days I've done some work on QPrinter::setup(). It's not 
> yet done - the printer dialog does ignore some settings I make (page 
> size, orientation, greyscale/color, paper source - all I think 
> correctly set in the DEVMODE structure) while it accepts others.
> Interestingly these settings all worked once but don't anymore now, no 
> idea why.
> 
> I post this now because I probabely won't have time to work on it during 
> the next few weeks.
> 
> Simon

> Index: qprinter_win.cpp
> ===================================================================
> RCS file: /cvsroot/kde-cygwin/qt-3/src/kernel/Attic/qprinter_win.cpp,v
> retrieving revision 1.1.2.6.2.8
> diff -r1.1.2.6.2.8 qprinter_win.cpp
> 13a14
> > ** Copyright (C) 2004 Simon Rutishauser
> 50a52
> > #include "qt_windows.h"
> 107c109,148
> < {}
> ---
> > {
> > 	viewOffsetDone = false;
> >     painter = 0;
> >     hdevmode = new DEVMODE();
> >     hdevnames = new DEVNAMES();
> > 
> >     orient = Portrait;
> >     page_size = A4;
> >     page_order = FirstPageFirst;
> > 	printer_name = QString();
> >     color_mode = Color;
> >     ncopies = 1;
> >     from_pg = to_pg = min_pg = max_pg = 0;
> >     state = PST_IDLE;
> >     output_file = FALSE;
> >     to_edge     = FALSE;
> >     paper_source = OnlyOne;
> >     switch ( m ) {
> > 		case ScreenResolution:
> > 			//#ifdef Q_WS_QWS
> > 			res = 72;
> > 			/*#else
> > 			res = QPaintDevice::x11AppDpiY();
> > 			#endif*/
> > 		    break;
> > 		case Compatible:
> > 		case PrinterResolution:
> > 			res = 72;
> > 			break;
> > 		case HighResolution:
> > 			res = 600;
> >     }
> > 
> > 	d = new QPrinterPrivate;
> > 	//D->marginsSpecified = false;
> > 	//d->printerOptions = 0;
> > 	setOptionEnabled( PrintToFile, TRUE );
> > 	setOptionEnabled( PrintPageRange, TRUE );
> > 	setPrintRange( AllPages );
> > }
> 193,194c234,385
> <     bool result = FALSE;
> <     return result;
> ---
> > 	//resolution? duplex? custom paper size?
> > 	PRINTDLG pd;
> > 	pd.lStructSize = sizeof(pd);
> > 	pd.hwndOwner = parent->winId();
> > 
> > 	DEVMODE* devmode = static_cast<DEVMODE*>(hdevmode);
> > 	
> > 	if (printerName().length() != 0)
> > 		qt_strncpy(devmode->dmDeviceName, printerName().left(31).ucs2(), 32);
> > 	devmode->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_COPIES | DM_DEFAULTSOURCE | DM_COLOR;
> > 	devmode->dmOrientation = orientation() == Portrait ? DMORIENT_PORTRAIT : DMORIENT_LANDSCAPE;
> > 
> > 	switch(pageSize()) {
> > 		case Letter:		devmode->dmPaperSize = DMPAPER_LETTER; break;
> > 		case Legal:			devmode->dmPaperSize = DMPAPER_LEGAL; break;
> > 		case Executive:		devmode->dmPaperSize = DMPAPER_EXECUTIVE; break;
> > 		case A2:			devmode->dmPaperSize = DMPAPER_A2; break;
> > 		case A3:			devmode->dmPaperSize = DMPAPER_A3; break;
> > 		case A4:			devmode->dmPaperSize = DMPAPER_A4; break;
> > 		case A5:			devmode->dmPaperSize = DMPAPER_A5; break;
> > 		case B4:			devmode->dmPaperSize = DMPAPER_B4; break;
> > 		case B5:			devmode->dmPaperSize = DMPAPER_B5; break;
> > 		case C5E:			devmode->dmPaperSize = DMPAPER_ENV_C5; break;
> > 		case Comm10E:		devmode->dmPaperSize = DMPAPER_ENV_10; break;
> > 		case DLE:			devmode->dmPaperSize = DMPAPER_ENV_DL; break;
> > 		case Folio:			devmode->dmPaperSize = DMPAPER_FOLIO; break;
> > 		case Ledger:		devmode->dmPaperSize = DMPAPER_LEDGER; break;
> > 		case Tabloid:		devmode->dmPaperSize = DMPAPER_TABLOID; break;
> > 		case Custom:		
> > 			devmode->dmPaperSize = 0;
> > 			//devmode->dmPaperLength =
> > 			//devmode->dmPaperWidth = 
> > 			break;
> > 	}
> > 	devmode->dmCopies = numCopies();
> > 	switch(paperSource()) {
> > 		case OnlyOne:		devmode->dmDefaultSource = DMBIN_ONLYONE; break;
> > 		case Lower:			devmode->dmDefaultSource = DMBIN_LOWER; break;
> > 		case Middle:		devmode->dmDefaultSource = DMBIN_MIDDLE; break;
> > 		case Manual:		devmode->dmDefaultSource = DMBIN_MANUAL; break;
> > 		case Envelope:		devmode->dmDefaultSource = DMBIN_ENVELOPE; break;
> > 		case EnvelopeManual:	devmode->dmDefaultSource = DMBIN_ENVMANUAL; break;
> > 		case Auto:			devmode->dmDefaultSource = DMBIN_AUTO; break;
> > 		case Tractor:		devmode->dmDefaultSource = DMBIN_TRACTOR; break;
> > 		case SmallFormat:	devmode->dmDefaultSource = DMBIN_SMALLFMT; break;
> > 		case LargeFormat:	devmode->dmDefaultSource = DMBIN_LARGEFMT; break;
> > 		case LargeCapacity:	devmode->dmDefaultSource = DMBIN_LARGECAPACITY; break;
> > 		case Cassette:		devmode->dmDefaultSource = DMBIN_CASSETTE; break;
> > 		case FormSource:	devmode->dmDefaultSource = DMBIN_FORMSOURCE; break;
> > 	}
> > 	devmode->dmColor = colorMode() == Color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME;
> > 	
> > 	pd.hDevMode = hdevmode;
> > 	pd.hDevNames = hdevnames;
> > 	pd.hDC = hdc;
> > 	
> > 	switch (printRange()) {
> > 		case AllPages: 
> > 			pd.Flags = PD_ALLPAGES; 
> > 			break;
> > 		case Selection:
> > 			pd.Flags = PD_SELECTION; 
> > 			break;
> > 		case PageRange:
> > 			pd.Flags = PD_PAGENUMS;
> > 			break;
> > 	}
> > 	//pd.Flags |= PD_COLLATE; 
> > 	pd.Flags |= PD_USEDEVMODECOPIESANDCOLLATE; //printer driver handles multipage and collation
> > 	if (!isOptionEnabled(PrintToFile))
> > 		pd.Flags |= PD_HIDEPRINTTOFILE | PD_DISABLEPRINTTOFILE; //?
> > 	if (!isOptionEnabled(PrintSelection))
> > 		pd.Flags |= PD_NOSELECTION;
> > 	if (!isOptionEnabled(PrintPageRange))
> > 		pd.Flags |= PD_NOPAGENUMS;
> > 	if (outputToFile())
> > 		pd.Flags |= PD_PRINTTOFILE;
> > 
> > 	pd.nFromPage = fromPage();
> > 	pd.nToPage   = toPage();
> > 	pd.nMinPage  = minPage();
> > 	pd.nMaxPage  = maxPage();
> > 	pd.nCopies   = numCopies();
> > 
> > 	if (!PrintDlg(&pd))
> > 		return false;
> > 
> > 	if (hdevmode != 0) {
> > 		setPrinterName( qt_winQString(devmode->dmDeviceName));
> > 		setPrintProgram(qt_winQString(devmode->dmDeviceName));
> > 		
> > 		if (devmode->dmFields & DM_ORIENTATION) 
> > 			setOrientation( devmode->dmOrientation == DMORIENT_PORTRAIT ? Portrait : Landscape );
> > 		if (devmode->dmFields & DM_PAPERSIZE)
> > 			switch(devmode->dmPaperSize) {
> > 				case DMPAPER_LETTER:	setPageSize(Letter); break;
> > 				case DMPAPER_LEGAL:		setPageSize(Legal); break;
> > 				case DMPAPER_EXECUTIVE:	setPageSize(Executive); break;
> > 				case DMPAPER_A2:		setPageSize(A2); break;
> > 				case DMPAPER_A3:		setPageSize(A3); break;
> > 				case DMPAPER_A4:		setPageSize(A4); break;
> > 				case DMPAPER_A5:		setPageSize(A5); break;
> > 				case DMPAPER_B4:		setPageSize(B4); break;
> > 				case DMPAPER_B5:		setPageSize(B5); break;
> > 				case DMPAPER_ENV_C5:	setPageSize(C5E); break;
> > 				case DMPAPER_ENV_10:	setPageSize(Comm10E); break;
> > 				case DMPAPER_ENV_DL:	setPageSize(DLE); break;
> > 				case DMPAPER_FOLIO:		setPageSize(Folio); break;
> > 				case DMPAPER_LEDGER:	setPageSize(Ledger); break;
> > 				case DMPAPER_TABLOID:	setPageSize(Tabloid); break;
> > 				default:
> > 					setPageSize(Custom);
> > 					//devmode->dmPaperLength
> > 					//devmode->dmPaperWidth 
> > 					break;
> > 		}
> > 
> > 		if (devmode->dmFields & DM_COPIES)
> > 			setNumCopies(devmode->dmCopies);
> > 		if (devmode->dmFields & DM_DEFAULTSOURCE) 
> > 			switch(devmode->dmDefaultSource) {
> > 				case DMBIN_ONLYONE:			setPaperSource(OnlyOne); break;
> > 				case DMBIN_LOWER:			setPaperSource(Lower); break;
> > 				case DMBIN_MIDDLE:			setPaperSource(Middle); break;
> > 				case DMBIN_MANUAL:			setPaperSource(Manual); break;
> > 				case DMBIN_ENVELOPE:		setPaperSource(Envelope); break;
> > 				case DMBIN_ENVMANUAL:		setPaperSource(EnvelopeManual); break;
> > 				case DMBIN_AUTO:			setPaperSource(Auto); break;
> > 				case DMBIN_TRACTOR:			setPaperSource(Tractor); break;
> > 				case DMBIN_SMALLFMT:		setPaperSource(SmallFormat); break;
> > 				case DMBIN_LARGEFMT:		setPaperSource(LargeFormat); break;
> > 				case DMBIN_LARGECAPACITY:	setPaperSource(LargeCapacity); break;
> > 				case DMBIN_CASSETTE:		setPaperSource(Cassette); break;
> > 				case DMBIN_FORMSOURCE:		setPaperSource(FormSource); break;
> > 			}
> > 		if (devmode->dmFields & DM_COLOR)
> > 			setColorMode( devmode->dmColor == DMCOLOR_COLOR ? Color : GrayScale);
> > 	}
> > 
> > 	if (pd.Flags & PD_ALLPAGES)
> > 		setPrintRange(AllPages);
> > 	else if (pd.Flags & PD_SELECTION)
> > 		setPrintRange(Selection);
> > 	else if (pd.Flags & PD_PAGENUMS)
> > 		setPrintRange(PageRange);
> > 
> > 	setOutputToFile(pd.Flags & PD_PRINTTOFILE);
> > 	setFromTo(pd.nFromPage, pd.nToPage);
> > 	setMinMax(pd.nMinPage, pd.nMaxPage);
> > 	setNumCopies(pd.nCopies);
> > 
> >     return true;

> _______________________________________________
> kde-cygwin mailing list
> kde-cygwin at kde.org
> https://mail.kde.org/mailman/listinfo/kde-cygwin
> 


-- 
-------------- next part --------------
Index: qprinter_win.cpp
===================================================================
RCS file: /cvsroot/kde-cygwin/qt-3/src/kernel/Attic/qprinter_win.cpp,v
retrieving revision 1.1.2.6.2.8
diff -r1.1.2.6.2.8 qprinter_win.cpp
13a14
> ** Copyright (C) 2004 Simon Rutishauser
50a52
> #include "qt_windows.h"
107c109,148
< {}
---
> {
> 	viewOffsetDone = false;
>     painter = 0;
>     hdevmode = new DEVMODE();
>     hdevnames = new DEVNAMES();
> 
>     orient = Portrait;
>     page_size = A4;
>     page_order = FirstPageFirst;
> 	printer_name = QString();
>     color_mode = Color;
>     ncopies = 1;
>     from_pg = to_pg = min_pg = max_pg = 0;
>     state = PST_IDLE;
>     output_file = FALSE;
>     to_edge     = FALSE;
>     paper_source = OnlyOne;
>     switch ( m ) {
> 		case ScreenResolution:
> 			//#ifdef Q_WS_QWS
> 			res = 72;
> 			/*#else
> 			res = QPaintDevice::x11AppDpiY();
> 			#endif*/
> 		    break;
> 		case Compatible:
> 		case PrinterResolution:
> 			res = 72;
> 			break;
> 		case HighResolution:
> 			res = 600;
>     }
> 
> 	d = new QPrinterPrivate;
> 	//D->marginsSpecified = false;
> 	//d->printerOptions = 0;
> 	setOptionEnabled( PrintToFile, TRUE );
> 	setOptionEnabled( PrintPageRange, TRUE );
> 	setPrintRange( AllPages );
> }
193,194c234,385
<     bool result = FALSE;
<     return result;
---
> 	//resolution? duplex? custom paper size?
> 	PRINTDLG pd;
> 	pd.lStructSize = sizeof(pd);
> 	pd.hwndOwner = parent->winId();
> 
> 	DEVMODE* devmode = static_cast<DEVMODE*>(hdevmode);
> 	
> 	if (printerName().length() != 0)
> 		qt_strncpy(devmode->dmDeviceName, printerName().left(31).ucs2(), 32);
>	else
>		qt_strncpy(devmode->dmDeviceName, QString("").ucs2(), 32);
> 	devmode->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_COPIES | DM_DEFAULTSOURCE | DM_COLOR;
> 	devmode->dmOrientation = orientation() == Portrait ? DMORIENT_PORTRAIT : DMORIENT_LANDSCAPE;
> 
> 	switch(pageSize()) {
> 		case Letter:		devmode->dmPaperSize = DMPAPER_LETTER; break;
> 		case Legal:			devmode->dmPaperSize = DMPAPER_LEGAL; break;
> 		case Executive:		devmode->dmPaperSize = DMPAPER_EXECUTIVE; break;
> 		case A2:			devmode->dmPaperSize = DMPAPER_A2; break;
> 		case A3:			devmode->dmPaperSize = DMPAPER_A3; break;
> 		case A4:			devmode->dmPaperSize = DMPAPER_A4; break;
> 		case A5:			devmode->dmPaperSize = DMPAPER_A5; break;
> 		case B4:			devmode->dmPaperSize = DMPAPER_B4; break;
> 		case B5:			devmode->dmPaperSize = DMPAPER_B5; break;
> 		case C5E:			devmode->dmPaperSize = DMPAPER_ENV_C5; break;
> 		case Comm10E:		devmode->dmPaperSize = DMPAPER_ENV_10; break;
> 		case DLE:			devmode->dmPaperSize = DMPAPER_ENV_DL; break;
> 		case Folio:			devmode->dmPaperSize = DMPAPER_FOLIO; break;
> 		case Ledger:		devmode->dmPaperSize = DMPAPER_LEDGER; break;
> 		case Tabloid:		devmode->dmPaperSize = DMPAPER_TABLOID; break;
> 		case Custom:		
> 			devmode->dmPaperSize = 0;
> 			//devmode->dmPaperLength =
> 			//devmode->dmPaperWidth = 
> 			break;
> 	}
> 	devmode->dmCopies = numCopies();
> 	switch(paperSource()) {
> 		case OnlyOne:		devmode->dmDefaultSource = DMBIN_ONLYONE; break;
> 		case Lower:			devmode->dmDefaultSource = DMBIN_LOWER; break;
> 		case Middle:		devmode->dmDefaultSource = DMBIN_MIDDLE; break;
> 		case Manual:		devmode->dmDefaultSource = DMBIN_MANUAL; break;
> 		case Envelope:		devmode->dmDefaultSource = DMBIN_ENVELOPE; break;
> 		case EnvelopeManual:	devmode->dmDefaultSource = DMBIN_ENVMANUAL; break;
> 		case Auto:			devmode->dmDefaultSource = DMBIN_AUTO; break;
> 		case Tractor:		devmode->dmDefaultSource = DMBIN_TRACTOR; break;
> 		case SmallFormat:	devmode->dmDefaultSource = DMBIN_SMALLFMT; break;
> 		case LargeFormat:	devmode->dmDefaultSource = DMBIN_LARGEFMT; break;
> 		case LargeCapacity:	devmode->dmDefaultSource = DMBIN_LARGECAPACITY; break;
> 		case Cassette:		devmode->dmDefaultSource = DMBIN_CASSETTE; break;
> 		case FormSource:	devmode->dmDefaultSource = DMBIN_FORMSOURCE; break;
> 	}
> 	devmode->dmColor = colorMode() == Color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME;
> 	
> 	pd.hDevMode = hdevmode;
> 	pd.hDevNames = hdevnames;
> 	pd.hDC = hdc;
> 	
> 	switch (printRange()) {
> 		case AllPages: 
> 			pd.Flags = PD_ALLPAGES; 
> 			break;
> 		case Selection:
> 			pd.Flags = PD_SELECTION; 
> 			break;
> 		case PageRange:
> 			pd.Flags = PD_PAGENUMS;
> 			break;
> 	}
> 	//pd.Flags |= PD_COLLATE; 
> 	pd.Flags |= PD_USEDEVMODECOPIESANDCOLLATE; //printer driver handles multipage and collation
> 	if (!isOptionEnabled(PrintToFile))
> 		pd.Flags |= PD_HIDEPRINTTOFILE | PD_DISABLEPRINTTOFILE; //?
> 	if (!isOptionEnabled(PrintSelection))
> 		pd.Flags |= PD_NOSELECTION;
> 	if (!isOptionEnabled(PrintPageRange))
> 		pd.Flags |= PD_NOPAGENUMS;
> 	if (outputToFile())
> 		pd.Flags |= PD_PRINTTOFILE;
> 
> 	pd.nFromPage = fromPage();
> 	pd.nToPage   = toPage();
> 	pd.nMinPage  = minPage();
> 	pd.nMaxPage  = maxPage();
> 	pd.nCopies   = numCopies();
> 
> 	if (!PrintDlg(&pd))
> 		return false;
> 
> 	if (hdevmode != 0) {
> 		setPrinterName( qt_winQString(devmode->dmDeviceName));
> 		setPrintProgram(qt_winQString(devmode->dmDeviceName));
> 		
> 		if (devmode->dmFields & DM_ORIENTATION) 
> 			setOrientation( devmode->dmOrientation == DMORIENT_PORTRAIT ? Portrait : Landscape );
> 		if (devmode->dmFields & DM_PAPERSIZE)
> 			switch(devmode->dmPaperSize) {
> 				case DMPAPER_LETTER:	setPageSize(Letter); break;
> 				case DMPAPER_LEGAL:		setPageSize(Legal); break;
> 				case DMPAPER_EXECUTIVE:	setPageSize(Executive); break;
> 				case DMPAPER_A2:		setPageSize(A2); break;
> 				case DMPAPER_A3:		setPageSize(A3); break;
> 				case DMPAPER_A4:		setPageSize(A4); break;
> 				case DMPAPER_A5:		setPageSize(A5); break;
> 				case DMPAPER_B4:		setPageSize(B4); break;
> 				case DMPAPER_B5:		setPageSize(B5); break;
> 				case DMPAPER_ENV_C5:	setPageSize(C5E); break;
> 				case DMPAPER_ENV_10:	setPageSize(Comm10E); break;
> 				case DMPAPER_ENV_DL:	setPageSize(DLE); break;
> 				case DMPAPER_FOLIO:		setPageSize(Folio); break;
> 				case DMPAPER_LEDGER:	setPageSize(Ledger); break;
> 				case DMPAPER_TABLOID:	setPageSize(Tabloid); break;
> 				default:
> 					setPageSize(Custom);
> 					//devmode->dmPaperLength
> 					//devmode->dmPaperWidth 
> 					break;
> 		}
> 
> 		if (devmode->dmFields & DM_COPIES)
> 			setNumCopies(devmode->dmCopies);
> 		if (devmode->dmFields & DM_DEFAULTSOURCE) 
> 			switch(devmode->dmDefaultSource) {
> 				case DMBIN_ONLYONE:			setPaperSource(OnlyOne); break;
> 				case DMBIN_LOWER:			setPaperSource(Lower); break;
> 				case DMBIN_MIDDLE:			setPaperSource(Middle); break;
> 				case DMBIN_MANUAL:			setPaperSource(Manual); break;
> 				case DMBIN_ENVELOPE:		setPaperSource(Envelope); break;
> 				case DMBIN_ENVMANUAL:		setPaperSource(EnvelopeManual); break;
> 				case DMBIN_AUTO:			setPaperSource(Auto); break;
> 				case DMBIN_TRACTOR:			setPaperSource(Tractor); break;
> 				case DMBIN_SMALLFMT:		setPaperSource(SmallFormat); break;
> 				case DMBIN_LARGEFMT:		setPaperSource(LargeFormat); break;
> 				case DMBIN_LARGECAPACITY:	setPaperSource(LargeCapacity); break;
> 				case DMBIN_CASSETTE:		setPaperSource(Cassette); break;
> 				case DMBIN_FORMSOURCE:		setPaperSource(FormSource); break;
> 			}
> 		if (devmode->dmFields & DM_COLOR)
> 			setColorMode( devmode->dmColor == DMCOLOR_COLOR ? Color : GrayScale);
> 	}
> 
> 	if (pd.Flags & PD_ALLPAGES)
> 		setPrintRange(AllPages);
> 	else if (pd.Flags & PD_SELECTION)
> 		setPrintRange(Selection);
> 	else if (pd.Flags & PD_PAGENUMS)
> 		setPrintRange(PageRange);
> 
> 	setOutputToFile(pd.Flags & PD_PRINTTOFILE);
> 	setFromTo(pd.nFromPage, pd.nToPage);
> 	setMinMax(pd.nMinPage, pd.nMaxPage);
> 	setNumCopies(pd.nCopies);
> 
>     return true;


More information about the kde-cygwin mailing list