カスタムコントロール - peace098beat/windows_applicaciton GitHub Wiki

Windows フォームにおけるグラフィックスと描画

https://msdn.microsoft.com/ja-jp/library/a36fascx(v=vs.110).aspx

このセクションの内容
グラフィックスの概要
グラフィックスに関連するマネージ クラスの概要を提供します。
GDI+ マネージ コードについて
マネージ GDI+ クラスに関する情報を提供します。
マネージ グラフィックス クラスの使用
GDI+ マネージ クラスを使用して、さまざまなタスクを完了する方法を示します。
関連項目
System.Drawing
GDI+ の基本的なグラフィックス機能を使用できるようにします。
System.Drawing.Drawing2D
2 次元グラフィックスおよびベクター グラフィックス機能の詳細を提供します。
System.Drawing.Imaging
高度な GDI+ イメージング機能を提供します。
System.Drawing.Text
高度な GDI+ タイポグラフィ機能を提供します。 この名前空間のクラスを使用して、フォントのコレクションを作成して使用することができます。
System.Drawing.Printing
印刷機能を提供します。

方法 : コントロール クラスを継承する

https://msdn.microsoft.com/ja-jp/library/skcysbt2(v=vs.110).aspx

カスタム コントロールを作成するには
1. 新しい Windows アプリケーション プロジェクトまたは Windows コントロール ライブラリ プロジェクトを作成します。
2. [プロジェクト] メニューの [クラスの追加] をクリックします。
3. [新しい項目の追加] ダイアログ ボックスにある [カスタム コントロール] をクリックします。
4. 新しいカスタム コントロールがプロジェクトに追加されます。
5. 7 キーを押してカスタム コントロールのコード エディターを開きます。
6. OnPaint メソッドを見つけます。このメソッドは、基本クラスの OnPaint メソッドの呼び出しを除いて、空白になっています。
7. コントロールで使用するカスタム描画を含むように、コードを修正します。
8. コントロールのグラフィックスを描画するコードの作成については、「コントロールのカスタム描画およびレンダリング」を参照してください。
9. コントロールに含めるカスタム メソッド、カスタム プロパティ、カスタム イベントを実装します。
10. 保存してコントロールの動作確認を行います。

Control.CreateGraphics メソッド ()


private void AutoSizeControl(Control control, int textPadding)
{
   // Create a Graphics object for the Control.
   Graphics g = control.CreateGraphics();

   // Get the Size needed to accommodate the formatted Text.
   Size preferredSize = g.MeasureString(
      control.Text, control.Font).ToSize();

   // Pad the text and resize the control.
   control.ClientSize = new Size(
      preferredSize.Width + (textPadding * 2), 
      preferredSize.Height+(textPadding * 2) );

   // Clean up the Graphics object.
   g.Dispose();
}

グローバル変換とローカル変換

https://msdn.microsoft.com/ja-jp/library/c499ats3(v=vs.110).aspx

ローカル変換 ローカル変換は、描画される特定の項目に対して適用されます。 たとえば、GraphicsPath オブジェクトの Transform メソッドを使用すると、そのパスのデータ点を変換できます。 次の例は、変換せずに四角形を描画し、回転変換を実行してパスを描画します。 ワールド変換は適用されないことを前提とします。

Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);

さまざまな結果を得るために、ワールド変換とローカル変換を組み合わせて実行できます。 たとえば、ワールド変換を使用して座標系を変更し、新しい座標系上に描画されたオブジェクトをローカル変換を使用して回転およびスケーリングできます。 たとえば、クライアント領域の左端から 200 ピクセル、上端から 150 ピクセルの位置にある点を座標系の原点にするとします。 また、単位がピクセル、x 軸が右向き、y 軸が上向きであることを前提とします。 既定の座標系の y 軸は下向きであるため、水平軸を基準とした反転を実行する必要があります。 このような反転の行列を次の図に示します。 変換 次に、右に 200 単位、下に 150 単位の平行移動を実行する必要があるとします。 Graphics オブジェクトのワールド変換を設定することにより、上で説明した座標系を設定する例を次に示します。

Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0); // Y軸反転
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);

左下隅が新しい座標系の原点である四角形 1 つで構成されるパスを作成するコードを次に示します。このコードは、上の例の末尾に記述します。 この四角形は、ローカル変換を適用せずに 1 回、ローカル変換を適用して 1 回塗りつぶされます。 このローカル変換は、水平方向にファクター 2 のスケーリングと、それに続く 30°の回転で構成されます。

// Create the path.
GraphicsPath myGraphicsPath = new GraphicsPath();
Rectangle myRectangle = new Rectangle(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRectangle);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath);

// Set the local transformation of the GraphicsPath object.
Matrix myPathMatrix = new Matrix();
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrder.Append);
myGraphicsPath.Transform(myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath);

新しい座標系と 2 つの四角形を次の図に示します。