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); と種を与える形式で記述する。