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