Announcement

Collapse
No announcement yet.

Rectangle zeichnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Rectangle zeichnen

    Guten Morgen,
    mit der Grafik in .Net stehe ich auf Kriegsfuss. Pixel kenne ich noch, aber bei dpi, inch und twips hört es bei mir absolut auf. Müsst ihr mir auch jetzt nicht erklären, hab dicke Bücher, wo ich das lesen könnte. Hat bisher immer die Zeit dazu gefehlt.
    Wäre bitte jemand so nett und sagte mir, welche Breite und Höhe ich bei einem DrawRectangle angeben muss, damit er exakt mit den Massen 38 x 22 mm (Breite, Höhe) ausgedruckt wird.

    Rect = New Rectangle(0, 20, 300, 200)
    graphics.DrawRectangle(myPen, Rect)

    Vielen Dank im Voraus.

  • #2
    Da es um NET geht -> verschoben
    Um das milimetergenau auszudrucken. muss du deine DPI des Druckers ermitteln und das anhand dieses Wertes umrechnen
    http://stackoverflow.com/questions/1...-in-millimeter
    Zuletzt editiert von Christian Marquardt; 09.01.2015, 13:16.
    Christian

    Comment


    • #3
      Um das milimetergenau auszudrucken. muss du deine DPI des Bildschirms ermitteln und das anhand dieses Wertes umrechnen
      Bildschirm im Text wahrscheiblich durch Drucker ersetzen. Er möchte ja drucken und meint wahrscheinlich Größe des Ausdrucks

      Wobei es natürlich darauf ankommt wie du druckst. Wenn ich das mit dem anderen Thread zur RichtextBox korreliere und du mit exakt tatsächlich exakt meinst dann ist die Wahrscheinlichkeit das du auf dem Holzweg bist hoch.
      Es scheint ja so das du dieses Rectangle auch noch genau positionieren willst und dann in der richtigen Größe brauchst. Du mischt jetzt ein selbstzeichnendes Control (es ist ein Windows Common Control das wird NICHT wirklich von .Net per GDI+ gezeichnet sondern nur von Winforms gewrappt) mit einem selbstgezeichneten GDI+ Rectangle. In Kombination je nach Druckverfahren und Systemeinstellungen kommt da irgendwas raus aber nicht das was man naiv erwartet ohne sich mit den Systemeigenheiten zu beschäftigen. Zum Beispiel versuch mal die benutzerdefinierte Textgröße (Zoom) in Windows zu ändern. Im Standardfall zoomt Text etwas anders als Controlgrößen was bedeutet das Text in deinem Control plötzlich anders umbricht oder sonstwie verschoben sein könnte und nicht da ist wo du es erwartest. Wenn da in Windows z.B. 110% zoom einstellst werden Controls Pixelgenau um diesen Wert gezoomt. Text wird aber natürlich auf passende Punktgrößen gerendet damit diese auch wirklich lesbar bleiben. Das entspricht aber eben nicht genau 110% und wird zu Verschiebungen führen. Im Normalfall auf dem Bildschirm eher uninteressant ist aber etwas anderes wenn man exakt drucken will. Man könnte jetzt versuchen dem gegenzusteueren in dem man an den Controls versucht über AutoScaleMode, AutoSize, AutoSizeMode was Konsistentes zu basteln. Das ist aber ein Minenfeld von controlabhängigen Bugs.

      Worauf ich hinauswill wenn du exaktes Drucken brauchst versuche nicht Formen per GDI zu drucken da warten zu viele Probleme. Zum exakten Drucken nimm einen auf solche Dinge zugeschnittenen Reporter.

      Comment


      • #4
        Ja, korrigiert
        Christian

        Comment


        • #5
          Danke! War genau das, was ich brauchte.

          Edit: Nö, nun doch wieder Schwimmen im großen Teich und keine Ahnung.
          Also es geht wirklich nur ums Drucken. Der Rahmen wird auf dem Bildschirm nicht angezeigt.
          Die Position (X, Y) liegt fest. Und das funktioniert auch. Die Breite und Höhe hab ich jetzt durch Ausprobieren ermittelt, denn die Berechnungen in Inch und Multiplizieren mit 300 (Ergebnis: 449 und 260 Pixel) brachte einen völlig falschen Ausdruck. Die Werte liegen jetzt bei 153 und 90 und das kommt beim Ausdrucken nahezu auf 38 x 22 mm (Feinkorrektur noch erforderlich).
          Schon Mist, wenn man keinen Durchblick hat.
          Zuletzt editiert von strzata; 09.01.2015, 13:35.

          Comment


          • #6
            Originally posted by strzata View Post
            Die Position (X, Y) liegt fest. Und das funktioniert auch. Die Breite und Höhe hab ich jetzt durch Ausprobieren ermittelt, denn die Berechnungen in Inch und Multiplizieren mit 300 (Ergebnis: 449 und 260 Pixel) brachte einen völlig falschen Ausdruck. Die Werte liegen jetzt bei 153 und 90 und das kommt beim Ausdrucken nahezu auf 38 x 22 mm (Feinkorrektur noch erforderlich).
            Jetzt musst du nur noch hoffen, dass es mit einem anderen Bildschirm oder anderen Druckereinstellungen auch noch funktioniert!

            Gruss

            Comment


            • #7
              Hab nach Reporter gegoogelt, aber nichts passendes gefunden. Wo könnte man sich da informieren?

              Comment


              • #8
                Vielen Dank. Aber ihr versteht mein Problem leider nicht. Zurück zum Anfang: ich wollte nur die Millimeter in Pixel umrechnen.
                Ich versuchs nochmal zu schildern. Vielleicht kann ich noch ein paar Tipps erheischen.

                Auf einem Rezept soll zukünftig um den Arztstempel ein Rahmen von der Größe 38 x 22 mm erscheinen.
                Das ist fest und hat mit Windows Controls nichts zu tun. Der Anwender sieht den Rahmen auch nicht, geschweige er könnte ihn verändern. Von der Idee, den Rahmen in die RTB einzubauen, bin gänzlich abgekommen. Für mich viel zu kompliziert.

                Den Stempel kann der Anwender editieren. Dazu biete ich eine RichTextBox, wo man im Menü Schriftart, Schriftgröße, Zeilenabstände und Bold usw. auswählen kann. Die RTB wird als XML abgespeichert. Vor dem Drucken lade ich das xml in ein Dokument, zusammen mit den anderen Texten. Und hier zeichne ich auch den Rahmen mit DrawRectangle. Die Positionen (Location: hOffset, vOffset) habe ich in einer Steuerdatei. Ich weiss also genau, wo der Stemepl sitzt.

                Damit der Rahmen korrekte Maße hat, müssen die Pixel für Weite und Höhe stimmen. Da ich nicht weiss, wie ich das berechnen muss, probiere ich es Stück für Stück aus. Bin jetzt mit 153 und 90 nahe dran. Lieber wäre es mir, ich könnte bei DrawRectangle sagen: 38 Millimter sind soundsoviele Pixel. Die Standardeinstellungen meiner zwei Drucker (ein 24 Nadler und ein Tintenstrahl) scheinen übereinzustimmen. Der gedruckte Rahmen ist bei beiden gleich groß und ich bin überzeugt, andere Drucker machen auch nichts anderes. Folglich werde ich wohl das Ermitteln der DPI des Druckers (Christian) verzichten können?

                Kann man nun die Anzahl der Pixel bei DrawRectangle fest angeben oder muss ich da mit weiteren Problemen rechnen? Und wieviel Pixel müssten es für 38 x 22 mm sein?

                Hier ein Code-Ausschnitt. stampBox ist meine Klasse mit der druckbare Richtextbox (User32.dll, Hdc)
                Code:
                                xmlDoc.Load(SelectedStampFile)
                                stampBox.Width = xmlDoc("Stamp")("Width").InnerText
                                stampBox.Height = xmlDoc("Stamp")("Height").InnerText
                                stampBox.Rtf = xmlDoc("Stamp")("Text").InnerText
                                Rect = New Rectangle(hOffset - 2, vOffset - 5, 153, 90)
                                graphics.DrawRectangle(myPen, Rect)
                                stampBox.Print(hOffset, vOffset, 0, stampBox.Text.Length - 1, e)

                Comment

                Working...
                X