[リストへもどる]
一括表示

投稿時間:2004/02/27(Fri) 22:18
投稿者名:おじん
URL :
タイトル:
画面に正確な長さの線を引く
画面に正確な長さ(XY cm)の線を引く時、経験的にその長さX?は
Twips単位の場合、
X?=(1440/2.54)*XY*(800/Dx)     Dx は下記
Pixels単位の場合
X?=((1440/15)/2.54)*XY*(800/Dx)    
ただし、おじんのパソコンでは、15<=>TwipsPerPixelX(疑問1)、
2.54、1440は定義。800は経験則(疑問2)

コード例は、(ScaleMode を対応して)
With Line1
    .BorderWidth=5
    .x2=.x1+xy
End With

画面の大きさ S 例 15 inch
       Sx=15 * 4 / 5 画面の横の大きさ=12 inch=12 * 2.54 cm
              Sy=15 * 3 / 5 同上、縦の大きさ=9  inch
      ドット数 D 例 1024 x 768
       Dx=Screen.Width/Screen.TwipsPerPixelX=1024
      DPI(Dot Par Inch)=D / G

疑問1:
TwipsPerPixelsXはパソコン(モニタ)によって違うのでしょうか?
疑問2:
800は手持ちのノートパソコン(9インチ)でDxが800(x)だったものですから
それを代用して測って見たらニヤリイコールだったので。
これって、何ですか?、定数なのですか?

質問です。疑問1,2が解決すれば解決することなのですが、、、。
画面に「正確な長さ(大きさ)の線(画像)を描くには」どうすれば?
解決したのに、何故こだわるか、実はプリンタに同様の未解決の問題が
あるのです。プリンタの場合、DPI(上記)が今の知識では必要なのです。
そのためには「G=画面の大きさ」を、プリンタの場合はDPIをアプリから
取得する方法が知りたいのです。

疑問、質問が通じましたでしょうか、よろしくお願いいたします。

投稿時間:2004/02/28(Sat) 02:29
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 画面に正確な長さの線を引く
ScaleX、ScaleY メソッド で変換したのではだめですか?

詳しくはヘルプで見て下さい。

下記で印刷位置をmmで求めています。
http://www.bcap.co.jp/hanafusa/VBHLP/pMargi.n.htm

私のノートパソコンの環境ですが
Picture1.ScaleX(10, 6, 1)  '10mm = 566.9286 twip
Picture1.ScaleX(10, 6, 3)  '10mm = 37.79524 Pixels

twip については
http://software.nikkeibp.co.jp/software/yougo/yougo2.html#yougo43

投稿時間:2004/02/28(Sat) 09:21
投稿者名:おじん
URL :
タイトル:
Re^2: 画面に正確な長さの線を引く
まず、投稿の内容に間違いがありました。訂正いたします。
>画面に正確な長さ(XY cm)の線を引く時、経験的にその長さX?は
>Twips単位の場合、
>X?=(1440/2.54)*XY*(800/Dx)    
>Dx=Screen.Width/Screen.TwipsPerPixelX=1024
>2.54、1440は定義。800は経験則(疑問2)
ここでもう一つのパソコンでやって見ると「正しい長さ」になりません
でした。経験則の「800」は正しくありません。削除訂正します。

>ScaleX、ScaleY メソッド で変換したのではだめですか?
2cmの長さの線を描きたいとした時、目測値はそれぞれ、
'Line1.X2 = Line1.X1 + (1440 / 2.54) * 2 '* 800 / 1024  <---2.2 cm
'Line1.X2 = Line1.X1 + Form1.ScaleX(20, 6, 1)           <---2.2 cm
'Line1.X2 = Line1.X1 + Screen.Width * 2 / (12 * 2.54)   <---2 cm
となりました。
ここで一番下の例の 12 は使用したパソコンの画面の大きさ15インチの
横方向の長さ 15 * (4/5) ==> 12 です。
長さは思うようになりましたが、1 inch = 1440 twips は絶対的長さでは
ないと仮定した考えによります。なにかおかしい気がします。
また使用モニタが何インチかまたは解像度を取得する方法を知りません。

>下記で印刷位置をmmで求めています。
>http://www.bcap.co.jp/hanafusa/VBHLP/pMargi.n.htm
今プリンタがつながっていないので改めてテストいたします。

>私のノートパソコンの環境ですが
>Picture1.ScaleX(10, 6, 1)  '10mm = 566.9286 twip
>Picture1.ScaleX(10, 6, 3)  '10mm = 37.79524 Pixels
今ここで使用しているパソコン(1024x768)では全く同じ値になりました。

投稿時間:2004/02/28(Sat) 12:01
投稿者名:おじん
URL :
タイトル:
Re^4: 画面に正確な長さの線を引く
質問の「解像度」が「正確な表現」でありませんでした。
使用しているモニターの大きさ=例えば14インチとか17インチなど
この大きさを mWide としたとき、
mSize = Screen.Width / Screen.TwipsPerPixelX  ---> 例 1024
XXX = mSize / mWide とする。
このときの、XXX または mWide を求めたい。
質問では、XXX を「解像度」と表現していました。何故なら、XXX は
1インチの幅のドット数になっていますから(DotParInch)。
お手間をおかけして申し訳ありませんでした。言葉を勝手に解釈して
いたようです。気をつけます。

投稿時間:2004/02/29(Sun) 03:29
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: 画面に正確な長さの線を引く
> XXX = mSize / mWide とする。
> このときの、XXX または mWide を求めたい。
ようはどの単位で求めるかになると思うのですが

仮にどのパソコンでも同じ長さのラインを引きたいのであればスケールモードを
mm にしてラインを引けばどのパソコンやプリンターでも 50mm は 50mmだと思うのですが
前記のリンク先にも書いていたと思うのですがピクセル単位で座標を指定すると解像度等の
影響を受けますが、twip 単位だとデバイスの解像度に左右されない。
前記の色々な計算式はスケールモードの単位変換をされていると思うのですが
今は、ScaleX、ScaleY メソッド で簡単に変換できます。
APIを使用すると座標はピクセル単位になるので希望のスケールモードに変換してやる
必要がありますが、通常印刷位置を設定する場合など、プリンターのスケールモードを
mmに設定しておけば、どのプリンターを使っても同じ位置に印字されます。
プリンターやマシンによって 10mm の長さがまちまちなら困りますよね。

>疑問1:
>TwipsPerPixelsXはパソコン(モニタ)によって違うのでしょうか?
ピクセルあたりのtwip 数だから当然解像度等によって違ってきます。

投稿時間:2004/02/29(Sun) 07:23
投稿者名:おじん
URL :
タイトル:
Re^6: 画面に正確な長さの線を引く

> 仮にどのパソコンでも同じ長さのラインを引きたいのであればスケールモードを
> mm にしてラインを引けばどのパソコンやプリンターでも 50mm は 50mmだと思うのですが

と思っています。以下のコードでは、上2つは、見かけ約3.5cm、3つ目は約2cm。
Win98SE、VB6、液晶モニタ15インチ、1024X768です。

Option Explicit

Private Sub Command1_Click()
Me.ScaleMode = vbMillimeters 'ミリ単位
With Line1
    .BorderWidth = 5 '見やすくするため
    .X2 = .X1 + 30 '30mmの長さ
End With
End Sub

Private Sub Command2_Click()
Me.ScaleMode = vbTwips 'twips単位
With Line2
    .BorderWidth = 5 '見やすくするため
    .X2 = .X1 + Me.ScaleX(30, 6, 1) '30mmの長さ
End With
End Sub

Private Sub Command3_Click()
Me.ScaleMode = vbTwips 'twips単位
With Line3
    .BorderWidth = 5 '見やすくするため
    .X2 = .X1 + Screen.Width * 30 / (12 * 25.4)  '30mmの長さ
End With
End Sub

そこで3つ目が正しい使い方としたら、ここでの変数の「12」のアプリからの
取得方法が問題になります(今はモニタが15インチであることが分かっています
から、X方向の長さは15*(4/5)=12(インチ)で求まりますが)。

> >疑問1:
> >TwipsPerPixelsXはパソコン(モニタ)によって違うのでしょうか?
> ピクセルあたりのtwip 数だから当然解像度等によって違ってきます。

TwipsPerPixelXは最近知ったことで、これまで「15」という定数を
使っていました。偶然不都合はなかったと言うことでしょう。因みに
手持ちのノートパソコン(Win95、VB6,10インチ、800X600)でも15です。
ただ、上記のコードを実行するとすべてにおいて「正しい長さ」です。
(3つ目において12は8に変更する必要があります)。最初に800という
数値を使ったのはこのノートパソコンでは正しかったためでした。
共通して「正しい」のが3つ目の方法なので、「12(または使用モニタの
大きさ)」の取得方法にこだわっています。

投稿時間:2004/02/29(Sun) 10:47
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^7: 画面に正確な長さの線を引く
> Private Sub Command3_Click()
> Me.ScaleMode = vbTwips 'twips単位
> With Line3
>     .BorderWidth = 5 '見やすくするため
>     .X2 = .X1 + Screen.Width * 30 / (12 * 25.4)  '30mmの長さ
> End With
> End Sub

上記の場合15インチのモニターで 800*600   1280*1024   1400*1050  の解像度
で使用したらどうなりますか?
測定は .BorderWidth = 1  で測ってみて下さい。
Debug.Print Screen.Width / Screen.TwipsPerPixelX で解像度が求まります。
    

投稿時間:2004/02/29(Sun) 12:24
投稿者名:おじん
URL :
タイトル:
Re^8: 画面に正確な長さの線を引く
> 上記の場合15インチのモニターで 800*600   1280*1024   1400*1050  の解像度
> で使用したらどうなりますか?
800*600では正しい(目測)長さになりました。
また、Screen.Width=12000、Screen.TwipsPerPixelX=15でした。
他の解像度については「設定」できませんのでテストしていません。
(設定方法?、ハード的な問題?、、、、)
色々とお手を煩わせ恐縮しております。何事もソフト的に解決しようとする
私、おじんの悲しい性です。
使用するモニターの大きさ(または「解像度*」)を操作者が指定するように
すればいいわけですから。ここでの解像度*とは正しい長さを描くための
都合の良い値をいいます(何のことやら!!)。
不都合な事態が起こるまでこの方法でやります。ありがとうございました。