Seite 1 von 2

Druckerauflösung festlegen [gelöst]

Verfasst: 04.02.2008 10:42
von Thomas
kann man die Auflösung beim Drucken in PB festlegen?
Oder muss man da wieder mit PrinterPageWidth() / PrinterPageHeight rumtun, dass man trotz verschiedenen Druckern (Auflösungen) die gleiche Ausgabegröße hat?

Verfasst: 04.02.2008 11:50
von bobobo
in "nativ"-Pb musst du wohl rumtun

ansonsten gibt's dass codearchiv mit ein paar demos

und hierauf folgende antworten natürlich :)

Verfasst: 05.02.2008 10:15
von steelbasic
Hallo Thomas

ein ähnliches Problem hatte ich vor ein paar Tagen auch.

Schau mal hier http://www.purebasic.fr/german/viewtopic.php?t=15559

Beitrag vom 28.1.08 hier unter Anfänger

Funktioniert einwandfrei.

Verfasst: 05.02.2008 15:42
von Thomas
ok, thx :D

Verfasst: 05.02.2008 22:35
von N00B
Das Problem scheint ja gelöst zu sein, dann will ich mal anders helfen.

Hier hast den Selben Smiley den als Avatar benutzt, jedoch transparent ;-)

Bild

Verfasst: 06.02.2008 13:38
von Thomas
ok, thx

Verfasst: 06.02.2008 14:29
von Thomas
hier mal der Code von Shardik aus folgendem Link http://www.purebasic.fr/german/viewtopi ... 65&start=8 :

Code: Alles auswählen

EnableExplicit

NewList Printer.S()

Procedure.L GetInstalledPrinters()
  Shared Printer.S()

  Protected *Buffer
  Protected BufferSize.L
  Protected *Printer
  Protected PrinterName.S

  ClearList(Printer())

  BufferSize = 8192
  *Buffer = AllocateMemory(BufferSize)
  *Printer = *Buffer

  If GetProfileString_("Devices", 0, "", *Buffer, BufferSize)
    PrinterName = PeekS(*Printer)

    While Trim(PrinterName) <> ""
      AddElement(Printer())
      Printer() = Trim(PrinterName)
      *Printer = *Printer + Len(PrinterName) + 1
      PrinterName = PeekS(*Printer)
    Wend
  EndIf

  FreeMemory(*Buffer)

  ProcedureReturn CountList(Printer())
EndProcedure

Define DriverName.S
Define Info.S
Define WindowsVersion.L
Define PrinterDC.L
Define SelectedPrinter.S
Define WindowEvent.L

If OpenWindow(0, 0, 0, 160, 70, "Drucker-Auswahl", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    ComboBoxGadget(0, 10, 10, 140, 100)
    ButtonGadget(1, 20, 40, 120, 20, "Auflösung anzeigen")

    If GetInstalledPrinters() = 0
      End
    Else
      ForEach Printer()
        AddGadgetItem(0, -1, Printer())
      Next
    EndIf

    SetGadgetState(0, 0)

    Repeat
      WindowEvent = WaitWindowEvent()

      Select WindowEvent
        Case #PB_Event_CloseWindow
          End
        Case #PB_Event_Gadget
          If EventGadget() = 1
            If EventType() = #PB_EventType_LeftClick
              SelectedPrinter = GetGadgetText(0)
              Break
            EndIf
          EndIf
      EndSelect
    ForEver

    CloseWindow(0)

    WindowsVersion = OSVersion()
   
    If WindowsVersion <> #PB_OS_Windows_95 And WindowsVersion <> #PB_OS_Windows_98
      DriverName = "WinSpool"
    EndIf

    PrinterDC = CreateDC_(@"WinSpool", @SelectedPrinter, 0, 0)

    If PrinterDC
      Info = "Drucker: " + SelectedPrinter + #CR$ + #CR$
      Info + "Horizontale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSX)) + " DPI" + #CR$
      Info + "Vertikale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSY)) + " DPI"

      DeleteDC_(PrinterDC)

      MessageRequester("Drucker-Auflösung", Info, #MB_ICONINFORMATION)
    EndIf
  EndIf
EndIf 
die DruckerAuflösung dieses Codes bezieht sich ja nur auf die fest definierten Standartwerte der Druckoptionen ...

Wie krieg ich die im PrintRequester() (bzw. im "Erweitert-Dialog) ausgewählten Auflösungen zurück?

Verfasst: 06.02.2008 22:27
von Thomas
problem glöst!

ich weis jetzt, wie man jetzt genau mit mm druckt^^ (auch von den Ecken aus)

Verfasst: 07.02.2008 13:27
von Shardik
Thomas hat geschrieben: problem glöst!

ich weis jetzt, wie man jetzt genau mit mm druckt^^ (auch von den Ecken aus)
Schön, daß Du Dein Problem gelöst hast. Vielleicht könntest Du ja einmal Deine gefundene Lösung veröffentlichen, damit auch andere davon profitieren.

Ansonsten hast Du nur ohne Nennung von Quelle und Autor mein Code-Beispiel aus einem vorherigen Posting (http://www.purebasic.fr/german/viewtopi ... 65&start=8) ohne Änderung kopiert und noch einmal eingestellt. Dafür hätte eigentlich ein Link gereicht. So könnte man denken, daß Du Dich mit fremden Federn schmücken wolltest. Dies ist nicht das erste Mal, daß mir das auffällt und solltest Du so weiter machen, werde ich überdenken, meine weitere Mitarbeit und Hilfe in diesem Forum einzustellen, denn wenn Du wirklich so gut bist, kannst Du ja meinen Teil übernehmen... /:->

Ich empfinde es als ein Gebot der Höflichkeit und Anerkennung, bei "geborgtem" Code auch einen Link zum Original-Posting zu setzen, zumal dies dem Leser ja auch noch zusätzliche Informationen aus den übrigen Beiträgen des angegebenen Threads liefert.

Verfasst: 07.02.2008 16:07
von Thomas
Shardik hat geschrieben:Ansonsten hast Du nur ohne Nennung von Quelle und Autor mein Code-Beispiel aus einem vorherigen Posting (http://www.purebasic.fr/german/viewtopi ... 65&start=8) ohne Änderung kopiert und noch einmal eingestellt. Dafür hätte eigentlich ein Link gereicht. So könnte man denken, daß Du Dich mit fremden Federn schmücken wolltest. Dies ist nicht das erste Mal, daß mir das auffällt und solltest Du so weiter machen, werde ich überdenken, meine weitere Mitarbeit und Hilfe in diesem Forum einzustellen, denn wenn Du wirklich so gut bist, kannst Du ja meinen Teil übernehmen... /:->


Ich empfinde es als ein Gebot der Höflichkeit und Anerkennung, bei "geborgtem" Code auch einen Link zum Original-Posting zu setzen, zumal dies dem Leser ja auch noch zusätzliche Informationen aus den übrigen Beiträgen des angegebenen Threads liefert.
Sorry :oops: ,
ich wollte mich keinesfalls mit "fremden Federn schmücken" und ich seh's auch ein ... (habs auch schon geändert)
Shardik hat geschrieben:Schön, daß Du Dein Problem gelöst hast. Vielleicht könntest Du ja einmal Deine gefundene Lösung veröffentlichen, damit auch andere davon profitieren.
wollte ich auch noch nachholen, hatte bloß gestern Abend keine lust mehr ...

Also, hier mal der Code, mit dem man in mm-Maßen drucken kann (und das ganze wirklich vom Blattrand gemessen):

Code: Alles auswählen

Global hDC.l

Procedure mmX(Value.f)
  ProcedureReturn Value * (GetDeviceCaps_(hDC, #LOGPIXELSX) / 25.4) - GetDeviceCaps_(hDC, #PHYSICALOFFSETX)
EndProcedure

Procedure mmY(Value.f)
  ProcedureReturn Value * (GetDeviceCaps_(hDC, #LOGPIXELSY) / 25.4) - GetDeviceCaps_(hDC, #PHYSICALOFFSETY)
EndProcedure

Procedure mmWidth(Value.f)
  ProcedureReturn Value * (GetDeviceCaps_(hDC, #LOGPIXELSX) / 25.4)
EndProcedure

Procedure mmHeight(Value.f)
  ProcedureReturn Value * (GetDeviceCaps_(hDC, #LOGPIXELSY) / 25.4)
EndProcedure


If PrintRequester()
  If StartPrinting("Testdruck")
    hDC = StartDrawing(PrinterOutput())
        Box(mmX(20), mmY(20), mmWidth(20), mmHeight(20), RGB(0, 0, 255))  ;hier ein Testobjekt (2x2cm groß)
      StopDrawing()
    StopPrinting()
  EndIf
EndIf

End