トップ回答者
Graphics.PageScale の動作について

質問
-
VB2005のWindowsFormにて Graphics.PageScaleにて倍率を変えても 描画に変化が内容なのですがどうしてでしょう?
Private Sub Button1(引数省略)
Dim g as Graphics = Me.CreateGraphics()
Dim rc as New Rectange( 50, 50, 100, 100 )
g.PageScale = 2.0F
g.TarnslateTransForm(10,10)
g.DrawRectangle( Pens.Aqua, rc )
End Sub
Private Sub Button2(引数省略)
Dim g as Graphics = Me.CreateGraphics()
Dim rc as New Rectange( 50, 50, 100, 100 )
g.TarnslateTransForm(10,10)
g.PageScale = 1.0F
g.DrawRectangle( Pens.Aqua, rc )
End Sub
[/code]
とこのようなコードで Button1とButton2の描画結果が重なってしまいます
g.TransFormを使って
[code langeage="VB"]
Private Sub Button3(引数省略)
Dim g as Graphics = Me.CreateGraphics()
Dim rc as New Rectange( 50, 50, 100, 100 )
Dim mx as new System.Drawing.Drawing2D.Matrix()
mx.Scale( 2.0, 2.0 )
mx.Tanslate( 10, 10 )
g.TransForm = mx
g.DrawRectangle( Pens.Aqua, rc )
End Sub
Button3ですと 2倍にされた四角を描画します
Graphics.PageScale プロパティ (System.Drawing)にあるサンプルでも
最初に描画する四角と2番目に描画する四角でPageScaleを変更していますが
実際には同じ大きさで描画されているようです
回答
-
Graphics.PageScale プロパティ (System.Drawing)
こちらのサンプルでは Form の Paint イベントで処理を行うことを想定しています。
Paint イベントでの e.Graphics.PageUnit の値を見てみてください。
「GraphicsUnit.Pixel」 になっていると思います。
次に Button1~3 での Me.CreateGraphics で生成した
g.PageUnit を見てみてください。
「GraphicsUnit.Display」になっていると思います。
PageScale では
このプロパティは、この Graphics のワールド単位とページ単位の間のスケーリングの値を指定します。 つまり Me.CreateGraphics での PageUnit が Display のため、ワールド単位(Display)とページ単位(Display)が同じだった。
そのため PageScale を設定しても変化がない。
しかし、Form の Paint イベントでの e.Graphics.PageUnit は Pixel のため
ワールド単位(Display)とページ単位(Pixel)が違うため、PageScale が適用できた。
ということではないでしょうか。
実際に Me.CreateGraphics の PageUnit を Pixel に設定してみたところ
PageScale が適用されました。
説明がうまくないと思いますが、少しでも解決の糸口となれば幸いです。
すべての返信
-
Graphics.PageScale プロパティ (System.Drawing)
こちらのサンプルでは Form の Paint イベントで処理を行うことを想定しています。
Paint イベントでの e.Graphics.PageUnit の値を見てみてください。
「GraphicsUnit.Pixel」 になっていると思います。
次に Button1~3 での Me.CreateGraphics で生成した
g.PageUnit を見てみてください。
「GraphicsUnit.Display」になっていると思います。
PageScale では
このプロパティは、この Graphics のワールド単位とページ単位の間のスケーリングの値を指定します。 つまり Me.CreateGraphics での PageUnit が Display のため、ワールド単位(Display)とページ単位(Display)が同じだった。
そのため PageScale を設定しても変化がない。
しかし、Form の Paint イベントでの e.Graphics.PageUnit は Pixel のため
ワールド単位(Display)とページ単位(Pixel)が違うため、PageScale が適用できた。
ということではないでしょうか。
実際に Me.CreateGraphics の PageUnit を Pixel に設定してみたところ
PageScale が適用されました。
説明がうまくないと思いますが、少しでも解決の糸口となれば幸いです。
-
おぉ そのようですね ...
PageUnitが Displayの場合は変換されないみたいです
Document,Inch,Millimeter,iPont,Pixel に設定すると 変換されるようです
Worldを設定すると "System.ArgumentException"が発生するようですこの場合 TranslateTransFormの引数も PageScaleの影響を受けるようですね
'先にスケール設定
g.PageUnit.Pixel
g.PagScale = 2.0F
g.TranslateTransForm( 320, 240 )
'後でスケール設定
g.PageUnit.Pixel
g.TranslateTransForm( 320, 240 )
g.PagScale = 2.0F
どちらも同じ結果でした