Hat PrinterSettings.GetHdevmode () einen Fehler?

8

Ich möchte die Druckereigenschaften ändern können, ohne das Druckereigenschaftenfenster aufzurufen ...

Die Verwendung der DocumentProperties-Funktion (aus winspool.drv importiert) ist bisher fehlgeschlagen, da der von PrinterSettings.GetHdevmode () zurückgegebene Wert nicht so aussagekräftig ist, dass der Dialog nicht angezeigt wird ruft es auf, aber der Wert aus den vorherigen Druckereigenschaften gibt OK zurück. Zum Beispiel gibt dies mir die vorherigen (falschen) Werte vom letzten Aufruf der Eigenschaften anstelle der Werte, die es von dem PrinterSettings-Objekt haben sollte:

%Vor%

Hat also GetHdevmode einen Fehler oder ist das was er tun soll? Gibt es dafür ein C # oder hat jemand überhaupt Informationen? Es hat mich sehr gedrängt, Informationen über das Thema zu finden.

Vielen Dank im Voraus für jede Einsicht.

BEARBEITEN: Ich wollte das nicht zu persönlich für ein Problem machen, aber hoffentlich haben alle Informationen in diesem Fall eine Antwort, die auch für andere eine nützliche Lösung ist.

Hier ist eine C ++ DLL, die ich geschrieben habe, um eine Abhilfe für dieses Problem zu haben. Es funktioniert derzeit nicht - es ändert anderen Speicher wie Kopien und ist nicht in der Lage, die "zugrunde liegende" Papiergröße zu ändern. Ich dachte, alles, was ich tun musste, war, das Puffer-Flag anzugeben, um die Änderungen vorzunehmen?

%Vor%

Ich dachte mir, dass der C ++ Code genug war, um die Einstellungen zu ändern, also mache ich nur in C #:

%Vor%

UPDATE: Die Reihenfolge wurde mit dmPaperSize und dmFields etwas geändert. Verbesserte Ergebnisse; noch nicht ganz da.

UPDATE 2: Okay, ich habe eine Microsoft-Seite gefunden, auf der steht, dass die Dokumentation falsch ist. MSDN sagt, dmPaperSize auf 0 festzulegen, wenn Sie Breite und Höhe angeben möchten, während die Microsoft Support-Korrektur besagt, dass es auf DMPAPER_USER festgelegt wird. Ссылка

    
Brandi 12.03.2010, 23:55
quelle

1 Antwort

2

Es gibt zwei Probleme mit der Art, wie Sie die Papiergröße im DEVMODE angeben:

(1) Wenn Sie DM_PAPERWIDTH oder DM_PAPERLENGTH oder beide angeben, dürfen Sie auch das Bit DM_PAPERSIZE nicht setzen. Das hängt vom Druckertreiber ab, aber viele Treiber ignorieren DM_PAPERLENGTH / WIDTH im obigen Code.

(2) Viele Treiber unterstützen DM_PAPERLENGTH / WIDTH überhaupt nicht. Mit solchen Treibern können Sie das Papierformat nicht so einstellen, wie Sie es oben tun möchten. Sie können nur eines der vordefinierten dmPaperSizes auswählen.

Sie können DeviceCapabilities (DC_FIELDS) verwenden, um festzustellen, ob Ihr Treiber DM_PAPERLENGTH / WIDTH unterstützt.

Sie können DeviceCapabilities (DC_PAPERS) verwenden, um die zulässigen dmPaperSizes aufzuzählen.

    
richb 02.04.2010, 11:18
quelle

Tags und Links