none
Graphics.PageScale の動作について RRS feed

  • 質問

  • 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を変更していますが
    実際には同じ大きさで描画されているようです

    2006年10月13日 11:51

回答

  • 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 が適用されました。

     

    説明がうまくないと思いますが、少しでも解決の糸口となれば幸いです。

    2006年10月13日 13:56

すべての返信

  • 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 が適用されました。

     

    説明がうまくないと思いますが、少しでも解決の糸口となれば幸いです。

    2006年10月13日 13:56
  • おぉ そのようですね ...
    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

     

    どちらも同じ結果でした

     

    2006年10月13日 15:17