Forum: PC-Programmierung Objektinstanz vom Drucker nach printDialog->ShowDialog().


von B. P. (skorpionx)


Angehängte Dateien:

Lesenswert?

Visual Studio:Objektinstanz vom Drucker nach
printDialog->ShowDialog()? Sehe das Bild.

von Εrnst B. (ernst)


Lesenswert?

B. P. schrieb:
> Sehe das Bild.

Dann such mal in deinem Bild nach den Unterschied zwischen 
"printDialog1" und "PrinterResolutionXY". Das sind nämlich zwei 
verschiedene Variablen, auch wenn sie ein paar Buchstaben gemeinsam 
haben.

von B. P. (skorpionx)


Lesenswert?

Εrnst B. schrieb:
> Dann such mal in deinem Bild nach den Unterschied zwischen
> "printDialog1" und "PrinterResolutionXY"

Wie bekomme ich Zugriff auf den Drucker der im printDialog
ausgewählt wurde? ich brauche Info über Drucker...

von B. P. (skorpionx)


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);

von Bernd H. (geeky)


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

von B. P. (skorpionx)


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;

von B. P. (skorpionx)


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..?

von B. P. (skorpionx)


Lesenswert?

Das wird auch akzeptiert:
printerResolution[0]->X;

von C-hater (c-hater)


Lesenswert?

B. P. schrieb:

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

Wenn ein kompetenter Programmiererer solche Fragen hat, schaut er sich 
gewöhnlich einfach die Deklaration der Struktur an...

von B. P. (skorpionx)


Angehängte Dateien:

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...?

von Roger S. (edge)


Lesenswert?

1
#pragma comment(lib, "winspool")

von B. P. (skorpionx)


Lesenswert?

Roger S. schrieb:
> #pragma comment(lib, "winspool")

Danke!!!!

von B. P. (skorpionx)


Angehängte Dateien:

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?

von B. P. (skorpionx)


Angehängte Dateien:

Lesenswert?

Ich habe schon die Lösung.
1
Xi = PrinterReslolution[4]->X;  Yi = PrinterReslolution[4]->Y;
Man muss array index von 0 bis x (bei mir 4) durchsuchen
bis man keinen negativen Wert bekommt. Eine Art von Abstufung
vom Printer Auflösung von High bis...

von B. P. (skorpionx)


Lesenswert?

Mit index 5 bekomme ich Aulösung 300;

von Roger S. (edge)


Lesenswert?

"The horizontal printer resolution, in dots per inch, if Kind is set to 
Custom; otherwise, a dmPrintQuality value."

Ein Wert von -1 entspricht DMRES_HIGH.

Findest du alles in der Dokumentation von Microsoft.

von B. P. (skorpionx)


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.."

von Εrnst B. (ernst)


Angehängte Dateien:

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.

: Bearbeitet durch User
von Roger S. (edge)


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.

von B. P. (skorpionx)


Angehängte Dateien:

Lesenswert?

Εrnst B. schrieb:
> 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.

Könntest du einen Link posten zu einer Seite wo diese Umschaltung
möglich ist?

von B. P. (skorpionx)


Lesenswert?

Εrnst B. schrieb:
> 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.

https://learn.microsoft.com/en-us/dotnet/api/system.drawing.printing.printerresolution?view=windowsdesktop-7.0

Du hast recht..."unscheinbares Dropdown"

von Εrnst B. (ernst)


Lesenswert?

B. P. schrieb:
> Du hast recht..."unscheinbares Dropdown"

Aber die Ironie, dass der Beispiel-Code mit Auswahl auf "C#" mehr nach 
(echtem) C++ aussieht, als bei der Wahl von "C++"(/CLI), ist dir 
entgangen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.