Discussion:
DrawWidth: Wie viele Pixel sind ein pt (Point)?
(zu alt für eine Antwort)
Martin Schell
2003-12-06 17:51:09 UTC
Permalink
Hallo,

ich möchte (muß) in einem Bericht beim Drucken mit der
Line-Methode Rechtecke zeichnen. Die Strichstärke muß
genauso breit sein wie die vorhandener Feld-Rahmen.
Deren Rahmenbreite wird in pt (Punkt) angegeben.

Die Strichstärke von Line muß mit DrawWidth aber in Pixel
festgelegt werden. Sollen die Striche von Rahmen und
gezeichneten Rechtecken *druckerunabhängig* gleich dick
sein, stellt sich die Frage: Wie viele Pixel sind ein pt
(oder umgekehrt)?

Oder kann ich noch anders vorgehen?

Gruß Martin

PS: Ich zeichne die Rechtecke erst beim Drucken deshalb,
weil erst dann die Anzahl der Felder feststeht, die gedruckt
und insgesamt umrahmt werden sollen. Das Control Rechteck
ist aber zur Laufzeit nicht wie z.B. ein Textfeld automatisch
vergrößer-/verkleinerbar, so daß sich die Bereichshöhe nicht
automatisch anpasst.
Roman Schütz
2003-12-06 19:12:57 UTC
Permalink
Post by Martin Schell
Hallo,
ich möchte (muß) in einem Bericht beim Drucken mit der
Line-Methode Rechtecke zeichnen. Die Strichstärke muß
genauso breit sein wie die vorhandener Feld-Rahmen.
Deren Rahmenbreite wird in pt (Punkt) angegeben.
Die Strichstärke von Line muß mit DrawWidth aber in Pixel
festgelegt werden. Sollen die Striche von Rahmen und
gezeichneten Rechtecken *druckerunabhängig* gleich dick
sein, stellt sich die Frage: Wie viele Pixel sind ein pt
(oder umgekehrt)?
Nein, die Strichstärke muß nicht in Pixel festgelegt werden.
Du kannst dafür jede bei VBA mögliche Maßeinheit (Twips, Pixel, Punkt,
Zeichen, Zoll, mm, cm) nehmen.
Du kannst die Maßeinheit mit der ScaleMode-Eigenschaft einstellen.

Grüsse
Roman
Martin Schell
2003-12-06 20:13:12 UTC
Permalink
Hallo Romean,
[]
Post by Roman Schütz
Nein, die Strichstärke muß nicht in Pixel festgelegt werden.
siehe OH DrawWidth!
Post by Roman Schütz
Du kannst dafür jede bei VBA mögliche Maßeinheit (Twips, Pixel, Punkt,
Zeichen, Zoll, mm, cm) nehmen.
Du kannst die Maßeinheit mit der ScaleMode-Eigenschaft einstellen.
Afaik bestimmt ScaleMode lediglich die Maßeinheit des Koordinatensystems
des Berichts und damit die Positionierung, nicht jedoch z.B. Strichstärken.

Wenn ich mich irre, laß ich mich gern aufklären.

Danke für deine Antwort
Martin
Roman Schütz
2003-12-06 22:30:27 UTC
Permalink
Post by Martin Schell
Hallo Romean,
[]
Post by Roman Schütz
Nein, die Strichstärke muß nicht in Pixel festgelegt werden.
siehe OH DrawWidth!
Post by Roman Schütz
Du kannst dafür jede bei VBA mögliche Maßeinheit (Twips, Pixel, Punkt,
Zeichen, Zoll, mm, cm) nehmen.
Du kannst die Maßeinheit mit der ScaleMode-Eigenschaft einstellen.
Afaik bestimmt ScaleMode lediglich die Maßeinheit des Koordinatensystems
des Berichts und damit die Positionierung, nicht jedoch z.B. Strichstärken.
Stimmt, du hast recht.
Zum Problem:
Die Breite einer Linie, angegeben in Pixel ist bei der Bildschirmanzeige
abhängig von der eingestellten Bildschirmauflösung und bei der
Druckausgabe von der eingestellten Druckerauflösung.
Die dünnste darstellbare Linie hat die Breite von 1 Pixel, und genau die
wird genommen, wenn du die Rahmenbreite des Steuerelements auf
"Haarlinie" stellst (lt. OH wird bei Haarlinie die dünnste darstellbare
Breite genommen).

Bei breiteren Rahmenbreiten musst du die aktuelle Rahmenbreite in Pixeln
selbst per VBA ermitteln.

Grüsse
Roman
Martin Schell
2003-12-07 15:39:21 UTC
Permalink
Hallo Roman,
Post by Roman Schütz
Post by Martin Schell
Hallo Romean,
Sorry wegen Vertipper!!
Post by Roman Schütz
Post by Martin Schell
[]
Post by Roman Schütz
Nein, die Strichstärke muß nicht in Pixel festgelegt werden.
siehe OH DrawWidth!
Post by Roman Schütz
Du kannst dafür jede bei VBA mögliche Maßeinheit (Twips, Pixel, Punkt,
Zeichen, Zoll, mm, cm) nehmen.
Du kannst die Maßeinheit mit der ScaleMode-Eigenschaft einstellen.
Afaik bestimmt ScaleMode lediglich die Maßeinheit des Koordinatensystems
des Berichts und damit die Positionierung, nicht jedoch z.B.
Strichstärken.
Post by Roman Schütz
Stimmt, du hast recht.
Die Breite einer Linie, angegeben in Pixel ist bei der Bildschirmanzeige
abhängig von der eingestellten Bildschirmauflösung und bei der
Druckausgabe von der eingestellten Druckerauflösung.
Die dünnste darstellbare Linie hat die Breite von 1 Pixel, und genau die
wird genommen, wenn du die Rahmenbreite des Steuerelements auf
"Haarlinie" stellst (lt. OH wird bei Haarlinie die dünnste darstellbare
Breite genommen).
Stimmt.
Post by Roman Schütz
Bei breiteren Rahmenbreiten musst du die aktuelle Rahmenbreite in Pixeln
selbst per VBA ermitteln.
Genau das ist meine Frage.

Gruß Martin
Ahmed Martens
2003-12-08 18:19:39 UTC
Permalink
Hallo Martin,
Post by Martin Schell
Hallo Roman,
Post by Roman Schütz
Post by Martin Schell
Hallo Romean,
Sorry wegen Vertipper!!
Post by Roman Schütz
Post by Martin Schell
[]
Post by Roman Schütz
Nein, die Strichstärke muß nicht in Pixel festgelegt werden.
siehe OH DrawWidth!
Post by Roman Schütz
Du kannst dafür jede bei VBA mögliche Maßeinheit (Twips, Pixel,
Punkt, Zeichen, Zoll, mm, cm) nehmen.
Du kannst die Maßeinheit mit der ScaleMode-Eigenschaft einstellen.
Afaik bestimmt ScaleMode lediglich die Maßeinheit des
Koordinatensystems des Berichts und damit die Positionierung,
nicht jedoch z.B. Strichstärken.
Stimmt, du hast recht.
Die Breite einer Linie, angegeben in Pixel ist bei der
Bildschirmanzeige abhängig von der eingestellten
Bildschirmauflösung und bei der Druckausgabe von der eingestellten
Druckerauflösung.
Die dünnste darstellbare Linie hat die Breite von 1 Pixel, und
genau die wird genommen, wenn du die Rahmenbreite des
Steuerelements auf "Haarlinie" stellst (lt. OH wird bei Haarlinie
die dünnste darstellbare Breite genommen).
Stimmt.
Post by Roman Schütz
Bei breiteren Rahmenbreiten musst du die aktuelle Rahmenbreite in
Pixeln selbst per VBA ermitteln.
Genau das ist meine Frage.
Gruß Martin
laut OH:

1 Twips = 1/20 Punkt = 1/1440 Zoll
20 Twips = 1 Punkt
567 Twips = 1 cm
1 Zoll = 25,399 mm = 1440 Twips

Gruß Ahmed
Martin Schell
2003-12-09 14:34:19 UTC
Permalink
Hallo Achmed,
Post by Ahmed Martens
Hallo Martin,
[]
Post by Ahmed Martens
1 Twips = 1/20 Punkt = 1/1440 Zoll
20 Twips = 1 Punkt
567 Twips = 1 cm
1 Zoll = 25,399 mm = 1440 Twips
1 Punkt = 1/72 Zoll
Post by Ahmed Martens
Gruß Ahmed
danke für deine Antwort.

Die Umrechnung von Twips zu Punkten zu cm kenne ich, und
deine gute Zusammenstellung ist vollständig. Das Problem sind
die leidigen weil geräteabhängigen Pixel.

Dein Google-Link bezieht sich auf eine VB-Frage zur Pixelgröße
auf dem Bildschirm. In VB ist das aber kein Problem, weil dort
das Screen-Objekt die Eigenschaften TwipPerPixelX und
TwipsPerPixelY hat, die es aber in VBA leider nicht gibt.

Imho ist das Problem afaik bisher nur per API-Funktionen lösbar.

Für die Bildschirm-Pixel verwende ich seit Acc2 daher dem folgenden
Code-Schnipsel ähnliche Lösungen:

-----CodeStart
Option Compare Database
Option Explicit

Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _
(ByVal lpDriverName As String, ByVal lpDeviceName As String, _
ByVal lpOutput As String, lpInitData As Any) As Long
Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hdc As Long, ByVal nIndex As Long) As Long
Declare Function DeleteDC Lib "gdi32" _
(ByVal hdc As Long) As Long

Public Const LOGPIXELSX As Long = 88
Public Const LOGPIXELSY As Long = 90

Public TwipsPerPixelX As Integer
Public TwipsPerPixelY As Integer

Public Function SetTwipsPerPixel()
Dim hdc As Long
hdc = CreateDC("DISPLAY", vbNullString, vbNullString, vbNullString)
TwipsPerPixelX = 1440 / GetDeviceCaps(hdc, LOGPIXELSX)
TwipsPerPixelY = 1440 / GetDeviceCaps(hdc, LOGPIXELSY)
DeleteDC hdc
End Function
-----CodeEnd

Für Drucker-Pixel kann man diesen Ansatz ebenfalls verwenden.
Allerdings ist das deutlich aufwendiger, u.a. weil CreateDC im ersten
Parameter für die verschiedenen Windows-Versionen unterschiedliche
Argumente erwartet (die Windows-Version müßte also gecheckt und
im Code berücksichtigt werden) und im vierten Parameter eine
DEVMODE-Struktur übergeben werden muß. Beides hat den Aufruf
einere ganzen Menge weiterer API-Funktionen zur Folge.

Mit meiner Frage wollte ich vermeiden, mich möglichst nicht wieder
tief in das Plattform-SDK eingraben zu müssen. Im Hinterkopf hatte
ich, daß es vielleicht eine Möglichkeit gibt, die Fähigkeit von Access,
z.B. die Rahmenbreite einer Textbox über eine pt-Angabe direkt auf
dem Drucker (als Pixel) abzubilden, irgendwie abzugreifen.

Mit Dank und Gruß
Martin


PS: "Im Hinterkopf hatte ich ..." habe ich eben geschrieben. Dies
deshalb, weil ich mein konkretes Problem inzwischen anders lösen
konnte. Aber das geschilderte Problem wird mir wohl wieder einmal
begegnen, und seine Lösung ist wohl auch für manch andere von
Interesse.
Ahmed Martens
2003-12-09 15:17:21 UTC
Permalink
Hallo Martin,

vielen Dank für Deinen kurzen Exkurs aus der Pixel-Welt. ;-)

Wenn Du nach [Pixel und Zentimeter] in Google suchst, wirst Du
tonnenweise irgendwelche Infos erhalten. Vielleicht hilft es Dir weiter.

Ich benötige Gott sei Dank dieses nicht.

Gruß und viel Erfolg

Ahmed

Ahmed Martens
2003-12-08 18:40:58 UTC
Permalink
Hallo Martin,

noch ein Nachtrag da Du ja nach Pixeln gefragt hast.

Hier ein Beitrag aus Google.

http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&threadm=867fl5%24nkq%242%40news04.btx.dtag.de&rnum=6&prev=/groups%3Fq%3DPixel%2Bund%2BZentimeter%26hl%3Dde%26lr%3D%26ie%3DUTF-8%26selm%3D867fl5%2524nkq%25242%2540news04.btx.dtag.de%26rnum%3D6

(In einer Zeile)

Hier wird erklärt wie Du umrechnest.

Gruß Ahmed
Loading...