SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

仮想ネットワークの実装で学ぶTCP/IP

仮想ネットワーク実装でTCP/IPを学ぼう(7)
― GDI+と独自プロトコルの定義

仮想ネットワーク実装でTCP/IPを学ぼう(7)


  • X ポスト
  • このエントリーをはてなブックマークに追加

ペンオブジェクトの概要

 ペンオブジェクトの使い方は、基本的にブラシオブジェクトと同様です。ペンオブジェクトとブラシオブジェクトは関連性があり、ペンオブジェクトのコンストラクタには、ブラシオブジェクトを指定できます。

 ペンオブジェクトとブラシオブジェクトの違いは、ペンオブジェクトはDraw系メソッド(DrawRectangleDrawPolygonなど)で使用し、ブラシオブジェクトはFill系メソッド(FillRectangleFillPolygonなど)で使用する点です。

 また、ペン独自のプロパティがありますので、これからサンプルを交えて、ペンオブジェクト独自のプロパティについて解説します。ペンが描画する線はただの直線だけではなく、点線を描きたい場合もあります。GDI+では直線の種類を変えたい場合、ペンオブジェクトのDashStyleプロパティを設定します。次に、サンプルプロジェクトDashStyleSampleのコードを掲載します。

ダッシュスタイルの効果を確認するサンプル(C#)
//重要な部分だけ抜粋
public partial class Form1 : Form
{
    private void Form1_Paint( object sender, PaintEventArgs e )
    {
        //基本的な設定
        Graphics grfx = e.Graphics;
        Pen pen = new Pen( Color.Black );
        pen.Width = 20;
        float addY = pen.Width + 10; //描画間隔
        float x = pen.Width;
        float y = addY;
        float endX = this.ClientSize.Width - pen.Width - 1;

        //ダッシュスタイルが違う直線を描画
        Array styles = Enum.GetValues( typeof( DashStyle ) );
        for ( int i = 0; i < styles.Length - 1; i++ ) {
            pen.DashStyle = ( DashStyle ) styles.GetValue( i );
            grfx.DrawLine( pen, x, y, endX, y );
            y += addY;
        }
    }
}
サンプル実行画面
サンプル実行画面

 このサンプルは、全ダッシュスタイルの線を確認するものです。実行すれば、ダッシュスタイルの効果を確認できます。ペンオブジェクトのDashStyleプロパティを変更するだけでさまざまな直線が描かれている点に注目してください。

 次に紹介するプロパティは、StartCapEndCapです。このプロパティにLineCap列挙体を設定することにより、開始部分と終了部分が変化します。これは見ないと分かりませんので、サンプルプロジェクトLineCapSampleを用意しました。

ラインキャップの効果を確認するサンプル(C#)
//重要な部分だけ抜粋
public partial class Form1 : Form
{
    private void Form1_Paint( object sender, PaintEventArgs e )
    {
        //基本的な設定
        Graphics grfx = e.Graphics;
        Pen pen = new Pen( Color.Black );
        pen.DashStyle = DashStyle.DashDotDot;
        pen.Width = 20;
        float addY = pen.Width + 30; //描画間隔
        float x = pen.Width;
        float y = addY;
        float endX = this.ClientSize.Width - pen.Width - 1;

        //ラインキャップが違う直線を描画
        Array styles = Enum.GetValues( typeof( LineCap ) );
        for ( int i = 0; i < styles.Length - 1; i++ ) {
            pen.StartCap = pen.EndCap = ( LineCap ) styles.GetValue( i );
            grfx.DrawLine( pen, x, y, endX, y );
            y += addY;
        }
    }
}
サンプル実行画面
サンプル実行画面

 このサンプルでは、すべての System.Drawing.Drawing2D.LineCap列挙体の値を使用して直線を描画しています。なお、見やすくするためにStartCapEndCapの値を同じとしました。実行するとその効果が確認できます。注目するべき箇所は、直線の開始部分と終了部分です。StartCapプロパティとEndCapプロパティの値を変えることにより、特色ある図形が描画できることが分かります。

 最後に紹介するプロパティはLineJoinです。このプロパティにSystem.Drawing.Drawing2D.LineJoin列挙体の値を指定すると、連続する直線の結合部分の描画を指定できます。以下に、サンプルプロジェクトLineJoinSampleを用意しました。

ラインジョインの効果を確認するサンプル(C#)
//重要な部分だけ抜粋
public partial class Form1 : Form
{
    private void Form1_Paint( object sender, PaintEventArgs e )
    {
        //ペンを設定
        Pen pen = new Pen( Color.Black );
        pen.Width = 20;
        pen.LineJoin = ( LineJoin ) this.LineJoinList.SelectedItem;

        //四角形を描画
        Graphics grfx = e.Graphics;
        grfx.DrawRectangle( pen,
            this.DrawrRgion.Left + pen.Width,
            this.DrawrRgion.Top + pen.Width,
            this.DrawrRgion.Width - ( pen.Width * 2 ) - 1,
            this.DrawrRgion.Height - ( pen.Width * 2 ) - 1 );
    }
}
サンプル実行画面
サンプル実行画面

 このサンプルでは、指定したLineJoinに応じて四角形を描画してします。このサンプルを実行すれば、どのように描画されるのか視覚的に理解できます。コンボボックスコントロールの値を変えて、角がどのように変化するのかを見てください。 これでペンについての解説は終わりです。次項から文字列や図形を描画する方法について解説します。

次のページ
文字列の描画

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
仮想ネットワークの実装で学ぶTCP/IP連載記事一覧

もっと読む

この記事の著者

インドリ(インドリ)

分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5170 2010/06/17 10:35

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング