SHOEISHA iD

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

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

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

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

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


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

 次は、多角形の描画法を示すためにサンプルプロジェクトPolygonSampleを用意したので、実行してみてください。

 このサンプルでは、画面半分の左側に三角形の輪郭を描画し、右半分に塗りつぶした三角形を描画しています。また、2つの三角形のサイズが見やすいように、基準となる縦線を描画しています。描画場所は、画面の中央・左側の中央・右の中央の三点です。このサンプルで重要なのは次の部分です。

2つの三角形を描画するサンプル(C#)
//重要な部分だけ抜粋
public partial class Form1 : Form
{
    private void Form1_Paint( object sender, PaintEventArgs e )
    {
        //描画する間隔
        float addX = 10; 
        float addY = 10;

        //三角形を描画
        Graphics grfx = e.Graphics;
        Pen pen = new Pen( Color.Red );
        pen.Width = 10;
        float half = ( this.ClientSize.Width ) / 2; //画面の半分
        float height = this.ClientSize.Height - pen.Width - ( addY * 2 ) - 1; //画面の高さ
        PointF[ ] drawPoints = new PointF[ ] { 
            new PointF( half / 2 , ( pen.Width * 3 )+ addY ),  
            new PointF( pen.Width + addX, height ), 
            new PointF( half - pen.Width - addX, height )  
        };
        grfx.DrawPolygon( pen, drawPoints );

        //基準線を引く
        Pen pen2 = new Pen( Color.Blue );
        float clientHalf = this.ClientSize.Width / 2;
        float clinetQuarter = this.ClientSize.Width / 4; 
        grfx.DrawLine( pen2, clientHalf, 0, ClientSize.Width / 2, this.ClientSize.Height );
        grfx.DrawLine( pen2, clinetQuarter, 0, clinetQuarter, this.ClientSize.Height );
        grfx.DrawLine( pen2, clientHalf + clinetQuarter, 0, clientHalf + clinetQuarter, this.ClientSize.Height );

        ////塗りつぶした三角形を描画(極力左側に合わす)
        height = this.ClientSize.Height - ( addY * 2 ) - ( pen.Width / 2 ) - 1;
        float penHalf = ( pen.Width / 2 );
        SolidBrush brush = new SolidBrush( Color.Black );
        PointF[ ] fillPoints = new PointF[ ] { 
            new PointF( drawPoints[0].X + half + ( addX / 2) - penHalf , addY + ( float )( pen.Width * 1.5 ) ),  
            new PointF( drawPoints[2].X + pen.Width + ( addX * 2 ) + penHalf, height ), 
            new PointF( this.ClientSize.Width - ( addX * 2 ), height )  
        };
        grfx.FillPolygon( brush, fillPoints );
    }
}
サンプル実行画面
サンプル実行画面

 多角形を描画するには、DrawPolygonメソッドもしくはFillPolygonメソッドを使用します。この2つのメソッドには、座標を任意の数指定します。このサンプルでは三角形を描画したいので3つの座標を指定しています。今回も両メソッドに引き渡す値が異なっている点に注意してください。極力合わせていますが、ピクセル単位のズレが生じているかもしれません。

 あと、FillPolygonメソッドはもう1つ注意するべき点があります。それはSystem.Drawing.Drawing2D.FillModeです。FillPolygonメソッドにFillModeを指定すると塗りつぶす領域を変更できます。サンプルプロジェクトFillModeSampleを用意したので、このサンプルを実行して2つのモードを試してください。

フィルモードの効果を確認するサンプル(C#)
//重要な部分だけ抜粋
public partial class Form1 : Form
{
    private void Form1_Paint( object sender, PaintEventArgs e )
    {
        //位置に関する情報を設定
        float half = ( this.DrawResion.Width ) / 2;
        float addX = half / 4;
        float addY = this.DrawResion.Top;
        float left = this.DrawResion.Left + 1;
        float width = this.DrawResion.Width - 1;
        float height = this.DrawResion.Height;
        float height1 = ( float ) ( height * 0.35 ) + addY;

        //モードを指定して星型を描画
        Graphics grfx = e.Graphics;
        SolidBrush brush = new SolidBrush( Color.Black );
        PointF[ ] drawPoints = new PointF[ ] { 
            new PointF( half, addY + 1 ),  
            new PointF( left + addX, height + addY - 1 ), 
            new PointF( width,  height1),
            new PointF( left, height1 ),
            new PointF( width - addX, height - 1 + addY)
        };
        FillMode mode = ( FillMode ) this.FillModeList.SelectedIndex;
        grfx.FillPolygon( brush, drawPoints, mode );
    }
}
サンプル実行画面
サンプル実行画面

 以上で図形の描画に関する解説は終わりです。次項では、Graffitiプロトコルについての解説を進めます。

次のページ
Graffitiプロトコルとポート番号

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング