7#include <qapplication.h>
9#include <private/qprintengine_win_p.h>
12#include <qpa/qplatformnativeinterface.h>
16QPageSetupDialog::QPageSetupDialog(QPrinter *printer, QWidget *parent)
17 : QDialog(*(
new QPageSetupDialogPrivate(printer)), parent)
19 setWindowTitle(QCoreApplication::translate(
"QPrintPreviewDialog",
"Page Setup"));
20 setAttribute(Qt::WA_DontShowOnScreen);
23QPageSetupDialog::QPageSetupDialog(QWidget *parent)
24 : QDialog(*(
new QPageSetupDialogPrivate(
nullptr)), parent)
26 setWindowTitle(QCoreApplication::translate(
"QPrintPreviewDialog",
"Page Setup"));
27 setAttribute(Qt::WA_DontShowOnScreen);
30int QPageSetupDialog::exec()
32 Q_D(QPageSetupDialog);
34 if (d->printer->outputFormat() != QPrinter::NativeFormat)
37 QWin32PrintEngine *engine =
static_cast<QWin32PrintEngine*>(d->printer->paintEngine());
38 QWin32PrintEnginePrivate *ep =
static_cast<QWin32PrintEnginePrivate *>(engine->d_ptr.data());
41 memset(&psd, 0,
sizeof(PAGESETUPDLG));
42 psd.lStructSize =
sizeof(PAGESETUPDLG);
45 HGLOBAL hDevMode =
nullptr;
47 if (!engine->globalDevMode()) {
48 devModeSize =
sizeof(DEVMODE) + ep->devMode->dmDriverExtra;
49 hDevMode = GlobalAlloc(GHND, devModeSize);
51 void *dest = GlobalLock(hDevMode);
52 memcpy(dest, ep->devMode, devModeSize);
53 GlobalUnlock(hDevMode);
55 psd.hDevMode = hDevMode;
57 psd.hDevMode = engine->globalDevMode();
60 HGLOBAL *tempDevNames = engine->createGlobalDevNames();
61 psd.hDevNames = tempDevNames;
63 QWidget *parent = parentWidget();
64 parent = parent ? parent->window() : QApplication::activeWindow();
65 Q_ASSERT(!parent ||parent->testAttribute(Qt::WA_WState_Created));
67 QWindow *parentWindow = parent ? parent->windowHandle() :
nullptr;
68 psd.hwndOwner = parentWindow
69 ? HWND(QGuiApplication::platformNativeInterface()->nativeResourceForWindow(
"handle", parentWindow))
71 psd.Flags = PSD_MARGINS;
72 QPageLayout layout = d->printer->pageLayout();
73 switch (layout.units()) {
74 case QPageLayout::Millimeter:
75 case QPageLayout::Inch:
77 case QPageLayout::Point:
78 case QPageLayout::Pica:
79 case QPageLayout::Didot:
80 case QPageLayout::Cicero:
81 layout.setUnits(QLocale::system().measurementSystem() == QLocale::MetricSystem ? QPageLayout::Millimeter
85 qreal multiplier = 1.0;
86 if (layout.units() == QPageLayout::Millimeter) {
87 psd.Flags |= PSD_INHUNDREDTHSOFMILLIMETERS;
90 psd.Flags |= PSD_INTHOUSANDTHSOFINCHES;
93 psd.rtMargin.left = layout.margins().left() * multiplier;
94 psd.rtMargin.top = layout.margins().top() * multiplier;
95 psd.rtMargin.right = layout.margins().right() * multiplier;
96 psd.rtMargin.bottom = layout.margins().bottom() * multiplier;
98 QDialog::setVisible(
true);
99 bool result = PageSetupDlg(&psd);
100 QDialog::setVisible(
false);
102 engine->setGlobalDevMode(psd.hDevNames, psd.hDevMode);
106 DEVMODE *rDevmode =
reinterpret_cast<DEVMODE*>(GlobalLock(psd.hDevMode));
107 if (rDevmode->dmFields & DM_ORIENTATION) {
108 layout.setOrientation(rDevmode->dmOrientation == DMORIENT_PORTRAIT
109 ? QPageLayout::Portrait : QPageLayout::Landscape);
111 if (rDevmode->dmFields & DM_PAPERSIZE)
112 pageSize = QPageSize::id(rDevmode->dmPaperSize);
113 GlobalUnlock(rDevmode);
116 if (!pageSize.isValid() || pageSize.id() == QPageSize::Custom) {
117 QSizeF unitSize(psd.ptPaperSize.x / multiplier, psd.ptPaperSize.y / multiplier);
118 if (unitSize.width() > unitSize.height()) {
119 layout.setOrientation(QPageLayout::Landscape);
120 unitSize.transpose();
122 layout.setOrientation(QPageLayout::Portrait);
124 pageSize = QPageSize(unitSize, layout.units() == QPageLayout::Inch
125 ? QPageSize::Inch : QPageSize::Millimeter);
127 layout.setPageSize(pageSize, layout.minimumMargins());
129 const QMarginsF margins(psd.rtMargin.left, psd.rtMargin.top, psd.rtMargin.right, psd.rtMargin.bottom);
130 layout.setMargins(margins / multiplier, QPageLayout::OutOfBoundsPolicy::Clamp);
131 d->printer->setPageLayout(layout);
134 if (!engine->globalDevMode() && hDevMode) {
136 if (ep->ownsDevMode && ep->devMode)
138 ep->devMode =
reinterpret_cast<DEVMODE *>(malloc(devModeSize));
139 QWin32PrintEnginePrivate::initializeDevMode(ep->devMode);
140 ep->ownsDevMode =
true;
143 void *src = GlobalLock(hDevMode);
144 memcpy(ep->devMode, src, devModeSize);
145 GlobalUnlock(hDevMode);
149 if (!engine->globalDevMode() && hDevMode)
150 GlobalFree(hDevMode);
151 GlobalFree(tempDevNames);
156void QPageSetupDialog::setVisible(
bool visible)