Objektinstanz vom Drucker nach printDialog->ShowDialog().

OP #7461912
Lesenswert?

In alten guten Zeiten war so etwas möglich:

1
HORZ_SIZE = GetDeviceCaps(Printer()->Handle, HORZSIZE);
2
         VERT_SIZE = GetDeviceCaps(Printer()->Handle, VERTSIZE);
3
         HORZ_RES = GetDeviceCaps(Printer()->Handle, HORZRES);
4
         VERT_RES = GetDeviceCaps(Printer()->Handle, VERTRES);
5
         LOG_PIXELSX = GetDeviceCaps(Printer()->Handle, LOGPIXELSX);
6
         LOG_PIXELSY = GetDeviceCaps(Printer()->Handle, LOGPIXELSY);
#7461928
Lesenswert?

Zumindest das Windows.Forms PrintDialog hat ein PrinterSettings-Property das durch den Dialog beim Öffnen für die Defaultwerte im Dialog verwendet wird und nach Schließen des Dialogs die im Dialog gewählten Drucker-Settings enthält. In PrinterSettings wiederrum steckt auch PrinterResolutions. https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.printdialog.printersettings?view=windowsdesktop-7.0

Man kann auch direkt ein PrinterSettings-Objekt instanziieren, das enthält dann meine ich direkt die Angaben zum Standarddrucker. Via PrinterSettings.InstalledPrinters kann man sich die Namen der verfügbaren Drucker holen. Setzt man bei einem PrinterSettings-Objekt das PrinterName-Property auf einen der verfügbaren Druckernamen wird in das PrinterSettings-Objekt der Kram zum jeweiligen Drucker rein geladen. https://learn.microsoft.com/en-us/dotnet/api/system.drawing.printing.printersettings?view=windowsdesktop-7.0

OP #7462137
Lesenswert?

So muss das gehen(intuitive Vermutung...):

1
if (printDialog1->ShowDialog() != System::Windows::Forms::DialogResult::OK)    // Wenn File ausgewählt dann return true
2
  {
3
    Meldung2->Text = "Keinen Drucker wurde ausgewählt";
4
    goto Fehler;
5
  }
6
String^ DruckerName;
7
  System::Drawing::Printing::PrinterSettings^ PrinterSettings;
8
  PrinterSettings = printDialog1->PrinterSettings;
9
  DruckerName = PrinterSettings->PrinterName;
10
  //oder direkt:
11
  DruckerName = printDialog1->PrinterSettings->PrinterName;
OP #7462743
Lesenswert?

Die Sache klemmt noch.

1
array<System::Drawing::Printing::PrinterResolution^>^ printerResolution;
2
 printDialog1->PrinterSettings->PrinterResolutions->
3
                                            CopyTo(printerResolution,0);
4
//Das wird z.B. akzeptiert:
5
 printerResolution[0];

Wie komme ich an die Zahlen von PrinterResolution? array..?

OP #7463366
Lesenswert?

1
if (printDialog1->ShowDialog() != System::Windows::Forms::DialogResult::OK)// Wenn Drucker nicht ausgewählt                               //dann Ende
2
  {  Meldung2->Text = "Keinen Drucker wurde ausgewählt";
3
    goto Fehler;}
4
long Xi, X0, X1, X2, X3, Yi;
5
array<System::Drawing::Printing::PrinterResolution^>^ printerResolution = gcnew array<System::Drawing::Printing::PrinterResolution^>( 100);
6
printDialog1->PrinterSettings->PrinterResolutions->CopyTo(printerResolution,0);
7
  X0 = printerResolution[0]->X;
8
  X1 = printerResolution[1]->X;
9
  X2 = printerResolution[2]->X;
10
  X3 = printerResolution[3]->X;

Das Ergebnis auf dem Screenshot. Einzige Information die ich nach dem Rücker vom printDialog1→ShowDialog() auslesen kann ist der Drucker Name. Ich wollte dann den tradionellen Weg gehen:

1
LPHANDLE hPr; wchar_t* wchs=L"DruckerName";
2
  OpenPrinterW(wchs, hPr, 0);

Bei der Erstellung vom Programm kommen aber Fehler. Hat jemand einen Rat...?

Angehängte Dateien:
OP #7465591
Lesenswert?

1
                        //PaperSize
2
array < System::Drawing::Printing::PaperSize^>^ PaperSize = gcnew array < System::Drawing::Printing::PaperSize^>(100);
3
System::Drawing::Printing::PrinterSettings::PaperSizeCollection^ PapierSizeCollection;
4
PapierSizeCollection = printDialog1->PrinterSettings->PaperSizes;
5
PapierSizeCollection->CopyTo(PaperSize, 0);
6
                //PrinterResolution
7
array < System::Drawing::Printing::PrinterResolution ^>^ PrinterReslolution = 
8
gcnew array < System::Drawing::Printing::PrinterResolution^>(100);
9
System::Drawing::Printing::PrinterSettings::PrinterResolutionCollection^ PrinterResolutionCollection;
10
PrinterResolutionCollection = printDialog1->PrinterSettings->PrinterResolutions;
11
PrinterResolutionCollection->CopyTo(PrinterReslolution, 0);
12
Xi = PrinterReslolution[0]->X;  Yi = PrinterReslolution[0]->Y;
13
PapierHeight = PaperSize[0]->Height;PapierWidth =PaperSize[0]->Width;
14
Meldung1->Text = Xi + " " + Yi;
15
Meldung2->Text = PapierHeight + " " + PapierWidth;

Mit 1100 und 850 als PaperSize kann ich leben. Aber mit -4 und -1 als Auflösung X, Y bin ich nicht einverstanden… Hat jemand einen Rat?

Angehängte Dateien:
OP #7466052
Lesenswert?

Roger S. schrieb:

Findest du alles in der Dokumentation von Microsoft.

Dokumentation ist sehr wichtig. Wenn du über Dokumentation schreibst,schreibst du über das, was im Visual Studio integriert ist, oder hast du noch eine andere Quelle? Bei Problemen, Suche über google führt immer zu C#. C++/CLI scheint ein nicht geliebtes Stiefkind zu sein. Die Situation ist ähnlich wie beschreibt das einen Zitat von Jeffrey Richter Buch „Windows Programmierung für Experten“ von 90. Jahren. Zitat: „Das die Beispielprogramme dennoch C reinsten Wasser sind, liegt daran, dass die meistens Windows-Programmiere nach wie vor nicht auf C++ umgestiegen sind.."

#7466106
Lesenswert?

B. P. schrieb:

Bei Problemen, Suche über google führt immer zu C#. C++/CLI scheint ein nicht geliebtes Stiefkind zu sein.

Schau dir die MS-Seiten nochmal genau an. Da gibt's ein unscheinbares Dropdown, mit dem du zwischen C# und C++/CLI (dort frecherweise nur als C++ bezeichnet) umschalten kannst.

Auf der Seite mit den Druckauflösungen macht das Umschalten genau den Unterschied zwischen "public enum PrinterResolutionKind" und "public enum class PrinterResolutionKind" ... natürlich klar, dass die Information auf der Seite für C++/CLI komplett unverständlich ist, wenn man den Umschalt-Knopf nicht gefunden hat, und da C# Syntax angezeigt wird.

Angehängte Dateien:
#7466167
Lesenswert?

B. P. schrieb:

Dokumentation ist sehr wichtig. Wenn du über Dokumentation schreibst,schreibst du über das, was im Visual Studio integriert ist, oder hast du noch eine andere Quelle?

Die online Dokumentation, der Einstiegspunkt für mich ist Google (suche nach der Struktur oder Funktionsnamen).

Bei Problemen, Suche über google führt immer zu C#.

Das ist eigentlich egal, du nutzt ja .NET komponenten, da musst du halt bloss die Syntax auf Dein C++/CLI umdenken.

C++/CLI scheint ein nicht geliebtes Stiefkind zu sein.

In der Tat.

Die Situation ist ähnlich wie beschreibt das einen Zitat von Jeffrey Richter Buch „Windows Programmierung für Experten“ von 90. Jahren. Zitat: „Das die Beispielprogramme dennoch C reinsten Wasser sind, liegt daran, dass die meistens Windows-Programmiere nach wie vor nicht auf C++ umgestiegen sind.."

In den 90er war MFC der heisse Scheiss.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren