2007. 5.20.
石立 喬

Visual C++ 2005 Express Edition の便利帳

――――構造体、クラスの概念が必要だが、ある程度は鵜呑みにしよう――――


目次

◎Windowsフォーム関係
Form1のタイトルバーにキャプションを入れる
Form1の内部の背景色を設定する
Form1内で用いるフォントを設定する
オープン時のフォームサイズを設定する

◎Windowsフォームへの文字、数値の表示
文字のフォントを設定する
文字を画像としてフォーム画面に出力する
数値を数字(文字列)に変換する
書式を与えて数値を出力する

◎マウス関連操作
マウスクリックの位置を取得する
マウスボタンの左右を調べる

◎定数
データ型定数と、その使用例
数値演算定数と、その使用例

◎配列
配列の宣言と設定

◎画面上へのグラフィック表示
Color構造体を設定する
Penクラスを設定する
Brush基底クラスからSolidBrushオブジェクトを設定する
画面上に点を打つ
画面上に線を引く
画面上に図形を描く

◎Bitmapクラス画像の操作
Bitmap画像として画像ファイルを読み込む
Bitmap画像を画像ファイルとして保存する
Bitmap画像をRGBに分解する
RGBの情報からBitmap画像を設定する
Bitmap画像からRGBの情報を得て、白黒(NTSC規格)のBitmap画像に変換する
Bitmap画像を画面に描画する

◎その他
乱数を発生させる

◎Windowsフォーム関係
Form1のタイトルバーにキャプションを入れる (目次に戻る)
 Form1[デザイン]画面でフォーム内を右クリックし、プロパティの「表示」欄で、Text をForm1 から書き換え、「Enter」をクリックする。

Form1の内部の背景色を設定する (目次に戻る)
 Form1[デザイン]画面でフォーム内を右クリックし、プロパティの「表示」欄で、BackColorをControlからWindowに変更する。「BackColor」をクリックし、右側の「三角」をクリックして、リストから選択する。この背景色は、
   Brush^ brush1=gcnew SolidBrush(this->BackColor);
   g->FillRectangle(brush1,rectangle1);
などを用いて、一部画面の消去などの目的に使用できる。

Form1内で用いるフォントを設定する (目次に戻る)
 Form1[デザイン]画面でフォーム内を右クリックし、プロパティの「表示」欄で、Fontをクリックすると、右側にアイコンが現れるので、これをクリックする。表示された「フォント」ウインドウで、MS GI Gothic, 9ptから「MS ゴシック,12pt」などに変更する。このフォントは、
   g->DrawString("ここへ文字列を入れる",Font,brush1,x,y);
のように使用できる。

オープン時のフォームサイズを設定する (目次に戻る)
 Form1[デザイン]画面でフォーム内を右クリックし、プロパティで、Size を 300,300から希望するサイズに書き換える。これは、フォームの枠の幅(左右で8ピクセル、上下で34ピクセル)を含むので、実際に使用できる範囲は、これより狭い292,266となる。
 Form1.hのコードで、「Windows Form Designer generated code」を、下記の例のように直接書き換える方が良い場合もある。
   this->ClientSize=System::Drawing::Size(670,510);
 「コードエディタで変更しないで下さい」との注意はあるが、特に支障なかった。

◎Windowsフォームへの文字、数値の表示
文字のフォントを設定する (目次に戻る)
 フォントを使用する場合には、下記のようにする。数値を出力するには、可変幅(Proportional)フォントよりも、等幅(Fixed-width)フォントの方がよく、日本語にも対応している「MS ゴシック」を勧める。下記で、「MS」および「ゴシック」は全角であるが、その間のスペースは半角でなければいけない。
     System::Drawing::Font^ font1=gcnew System::Drawing::Font("MS ゴシック",12);
  Form1のプロパティで設定する場合は、その結果をFontで使用することができる。

文字を画像としてフォーム画面に出力する (目次に戻る)
Form1_Paint()メソッド関数の内部で、
      Graphics^ g=e->Graphics;
によってグラフィックを使用できるようにし、
      g->DrawString("ここへ文字列を入れる",font1,brush1,x,y);
と書けば良い。 ただし、xおよびyは、画面上の座標を表わす。
Form1_Paint()以外のメンバ関数に対しては、
      Graphics^ g=this->CreateGraphics();
      g->DrawString("ここへ文字列を入れる",font1,brush1,x,y);
のような手続きが必要である。
フォントは、
      System::Drawing::Font^ font1=gcnew System::Drawing::Font("MS ゴシック",12);
のようにして設定するか、Form1のプロパティで決められているFontを使用する。

数値を数字(文字列)に変換する (目次に戻る)
 数字に変換したい数値をaとすると、
    String^ string1=a.ToString();
または
    String^ string1=Convert::ToString(a);
が使用できる。
 また、
    String^ string1=" "+a;
のように、文字列と「+」記号で結べば、数値が文字列化されるので、下記の方法が可能である。
    String^ string1="A=" + a + ",   B=" + b + ",   A+B=" + (a+b);
 C言語のprintfに似た方法がある。最も簡単なのは、
    String^ string1=String::Format("A={0},   B={1],   A+B={2} ",a,b,a+b);
で、{0} {1} {2} の順に、後に続く変数a,bなどに対応する。ここでは、実際に書式は与えていない。
文字列の表示は、
    g->DrawString(string1,font1,brush1,x,y);
で行う。

書式を与えて数値を出力する (目次に戻る)
 C言語のprintfに相当する方法には、下記の例がある。
    String^ string1=String::Format("A={0,12:F5}   B={1,12:F5}   C={2:D4}" ,a,b,c);
{0,12:F5} は %12.5f に相当し、{2:D4} は %4d に相当する。

◎マウス関連操作
マウスクリックの位置を取得する (目次に戻る)
 XY座標が必要な場合には、
    int x=e->X;
    int y=e->Y;
を用い、Point構造体を取得するには、
   Point point1=Point(e->X,e->Y);
または、単に
   Point point1=e->Location;
で良い。
 マウスクリックが特定のRectangleの内部にあるかどうかは、
    Rectangle rectangle1=Rectangle(X0,Y0,WIDTH,HEIGHT);
    if(rectangle1.Contains(point1))
で判定する。

マウスボタンの左右を調べる (目次に戻る)
左ボタンの場合には、
   if(e->Button==System::Windows::Forms::MouseButtons::Left)
を用い、右ボタンには、
   if(e->Button==System::Windows::Forms::MOuseButtons::Right)
を使用する。

◎定数
データ型定数と、その使用例(目次に戻る)
特に何かをインクルードする必要なく、以下を利用できる(一部のみを紹介)。
    Int32::MaxValue ------ 2147483647(=0x7FFFFFFF)
    INt32::MinValue ------ -2147483648(=0x80000000)
    Double::MaxValue ---- 1.79769313486232e308
    Double::MinValue ---- -1.79769313486232e308
    Double::Epsilon ------ 0に最も近い0でない値 4.94065645841247e-324

C言語で定義され、インクルードが必要であるが、下記のデータ型定数を利用できる(一部のみを紹介)。
 #include <limits.h>
    INT_MAX ---- 2147483647
    INT_MIN ---- -2147483648
 #include <float.h>
    DBL_MAX --------- 正の最大値 1.7976931348623158e+308
    DBL_MIN --------- 正の最小値  2.2250738585072014e-308
    DBL_EPSILON ----- 0に最も近い0でない値 2.2204460492503131e-016

 整数の最大値、最小値を求める際、
    int data_max=Int32::MinValue;
    int data_min=Int32::MaxValue;
と初期設定しておき、
    if(d>data_max) data_max=d;
    if(d<data_min) data_min=d;
とする。

 実数がゼロに収束するのを判定する際、
    if(Math::Abs(v)<Double::Epsilon)
を使う。

数値演算定数と、その使用例(目次に戻る)
特に何かをインクルードする必要なく、以下を利用できる。
    Math::E ------ 自然対数の底ε 2.7182818284590452354
    Math::PI ----- 円周率π 3.14159265358979323846

C言語で定義され、インクルードが必要であるが、下記の数値演算定数を利用できる(一部のみ紹介)。
 #define _USE_MATH_DEFINES
 #include <math.h>
    M_E -------- 自然対数の底ε 2.7182818284590452354
    M_LOG2E --- 2を底としたεの対数 log2e
    M_LN2 ----- 2の自然対数 ln2
    M_PI ------ 円周率π 3.14159265358979323846
    M_PI_2 ---- 円周率πの1/2
    M_1_PI ---- 円周率πの逆数
    M_SQRT2 ---- 2の平方根 √2

 使用例としては、
 角度からラジアンを求める、
    radian=Math::PI/180*degree;
 ラジアンから角度をもとめる、
    degree=180/Math::PI*radian;
がある。

◎配列
配列の宣言と設定 (目次に戻る)
一次元配列の場合は、
   array<int>^ data=gcnew array<int>(10);
 三次元配列の場合は、
   array<double,3>^ data=gcnew array<double,3>(10,10,10);
 同時に値を与える場合は、
   array<int>^ data={0,1,2,3,4,5};
   array<double,2>^ data={{1.2,1.3,1.2},{0.3,0.4,0.6},{2.3,1.3,1.5}};
などとする。
グローバル変数として配列を設定する場合には、共通部に
   array<int>^ data;
とし、Form1_Load()に、
   data=gcnew array<int>(100);
とする。
なお、配列の表記方法は、
   data[i,j,k] であり、data[i][j][k] でないことに注意する。

◎画面上へのグラフィック表示
Color構造体を設定する (目次に戻る)
 Color構造体のコンストラクタには、直接色の名前を指定するものと、RGB値で設定するものとがある。
    Color color1=Color::Black;
    Color color1=Color::FromName("Blue");
    Color color1=Color::FromArgb(r,g,b);

Penクラスを設定する(目次に戻る)
 Penの設定には、
    Pen^ pen1=gcnew Pen(color,width);
が一般的で、widthを省略すると、太さが1ピクセルになる。widthはfloat型が要求されるが、int型でも問題はない。
colorは、もちろん、Color::Redなどを使っても良い。
 他に、
    Pen^ pen1=gcnew Pen(Brush^,width);
もある。Brush^ には、もちろん、Brushes::Redなどを使っても良い。
 Penクラスを使わないで、
    Pens::Redなどを直接使うこともできる。

Brush基底クラスからSolidBrushオブジェクトを設定する (目次に戻る)
Brushは基底クラスなので、直接オブジェクトを作ることはできない。実質的には、Brushクラスを継承した
    Brush^ brush1=gcnew SolidBrush(color);
が一般的で、Brushes::Redなどを使っても良い。

画面上に点を打つ (目次に戻る)
 pen1を設定しておき、
    g->DrawRectangle(pen1,x,y,1,1);
または、
    g->DrawLine(pen1,x,y,x+1,y+1);
とする。ピクセル一個の点を打つことはできないので、不便である。
 Javaからの連想で、
    g->DrawRectangle(pen1,x,y,0,0);
    g->DrawLine(x,y,x,y);
が使えそうだが、残念ながら点を打ってくれない(Javaと異なる)。

画面上に線を引く (目次に戻る)
 pen1を設定しておき、
    g->DrawLine(pen1,x1,y1,x2,y2);
または、
    g->DrawLine(pen1,point1,point2);

画面上に図形を描く (目次に戻る)
 ここでは、例として、緑色の図形を描く場合を述べる。
     g->DrawRectangle(Pens::Green,x,y,width,height);
または、
     g->DrawRectangle(Brushes::Green,rectangle1);
塗りつぶし図形の場合には、
     g->FillRectangle(Pens::Green,x,y,width,height);
または、
     g->FillRectangle(Brushes::Green,rectangle1);
とする。

◎Bitmapクラス画像の操作
BitmapまたはImage画像として画像ファイルを読み込む (目次に戻る)
Bitmapクラスとして読み込む場合には、
   Bitmap^ bmap1=gcnew Bitmap("A:/sample.jpg");
とし、Imageクラスとして読み込む場合には、
   Image^ img1=Image::FromFile("A:/sample.jpg");
を用いる。
 Imageは抽象基底クラスのため、
    Image^ img1=gcnew Image("A:/sample.jpg");
は使えない。

Bitmap画像を画像ファイルとして保存する(目次に戻る)
 bmap1がBitmapクラスの画像である場合、
    bmap1->Save("A:/sample1.jpg",System::Drawing::Imaging::ImageFormat::Jpeg);
でファイルに保存する。ファイルの種類としては、Png、 Gif、 Bmpなども使用できる。

Bitmap画像をRGBに分解する (目次に戻る)
 bmap1がBitmapクラスの画像である場合、Color構造体のcolor1を取得してから、下記のように分解する。
     Color color1;
     Byte r,g,b;
     for(int i=0;i<WIDTH;i++)
            for(int j=0;j<HEIGHT;j++){
                 color1=bmap1->GetPixel(i,j);
                 r=color1.R;
                 g=color1.G;
                 b=color1.B;
                 ---- ここに処理を書く ----
            }

RGBの情報からBitmap画像を設定する (目次に戻る)
 Bitmapクラスの画像bmapを、下記のようにあらかじめインスタンス化しておき、
     Bitmap^ bmap=gcnew Bitmap(width,height);
RGBの各データから作成したColor構造体のcolor1を下記のように用意し、
     Color color1=Color::FRamArgb(r,g,b);
bmapのピクセル位置i、 jに対して、
     bmap->SetPixel(i,j,color1);
で設定する。

Bitmap画像からRGBの情報を得て、白黒(NTSC規格)のBitmap画像に変換する (目次に戻る)
 作成する白黒画像をbmap1としたとき、下記により生成できる。
     Bitmap^ bmap1=gcnew Bitmap(width,height);
     Color color1;
     Byte r,g,b,d;
     for(int i=0;i<WIDTH;i++)
            for(int j=0;j<HEIGHT;j++){
                 color1=bmap1->GetPixel(i,j);
                 r=color1.R;
                 g=color1.G;
                 b=color1.B;
                 ---- ここに処理を書く ----
                 d=(int)(0.299*r+0.587*g+0.114*b);
                 color2=Color::FromArgb(d,d,d);
                 bmap1->SetPixel(i,j,color2);
            }

Bitmap画像を画面に表示する (目次に戻る)
 Bitmap画像bitmap1を表示するには、下記を使用する。
      g->DrawImage(bitmap1,x,y,width,height);
 width,heightを指定しないと、サイズが小さくなることがある。
 x,yなどの代わりにPointクラスやRectangleクラスを用いても良い。

◎その他
乱数を発生させる (目次に戻る)
 Random^ rand=gcnew Random();で乱数randを生成しておき、
1) 0以上1未満の間の乱数を発生したい場合には、
       x=rand->NextDouble();
2) 0以上A未満の乱数を発生したい場合には、
       x=rand->Next(int A);
3) AからBまで(Bを含む)の乱数を発生したい場合には、
       x=rand->Next(int A,int B);
とする。
 発生する乱数系列を変えるためには、
       Random(int a); と種を与える形式で記述する。