2006.7.1.
2007.1.13.説明追加
2007.4.26.String::Formatの解説予告
石立 喬
Visual C++ 2005 Express Edition の易しい使い方(2)
――― テキスト入力を使用しないで結果をフォームに出力する―――
ここでは、本格的なWindowsプログラムとは言えないが、簡単なC言語またはC++言語の実習用として使用することができるWindowsプログラムの作成方法を説明する。キーボードからの入力はできないが、出力を画面に表示することができる。これを基礎にして、GUIコンポーネントが利用できる本格的なプログラムに進むことができる。「易しい使い方(1)」で説明した部分は、省略されていることがあるので注意して欲しい。
Windowsアプリケーションは、Mocrosoftの提供する標準的なWindowを使用するのではなく、.NET
Frameworkによる、より汎用的な独自のWindowを使用する。このWindowは「フォーム」と呼ばれ、「メニュー」は自動的には用意されない。ここでは、最も易しい方法として、「フォーム」の全体を描画領域として使用し、ピクチャーボックスを設けない方法について説明する。出力は「フォーム」に対して行い、Graphicsを使用する。すなわち、文字や数値は、画像として「フォーム」に描画する。
Wisual C++ 2005 Express Edition を使用するが、ここでは、Visual
C++ 2005と略称する。
ウインドウ出現(再描画)時に実行する方法の比較
プログラムを起動した直後や、ウインドウが隠れていたのが戻った場合に呼び出される関数(メソッド)が用いられ、簡単なプログラムでは、ほとんど全てのコードが、ここに記述される。
◎従来のVisual C++の場合
Visual C++ 6.0で(Visual C++ 2005でMFCを使う場合も同じ)は、
void C*********View::OnDraw(CDC*
pDC){ }
の形の関数で演算処理と描画を行なった。
◎Javaの場合
Javaのアプレットでは、
public void paint(Graphics g){ }
を用いる。
◎Visual C++ 2005の場合
これに対し、Visual C++ 2005で.NET Frameworkを使う場合には(Form1上に描画するとして)、
private: System::Void Form1_Paint(System::Object^
sender, System::Windows::Forms::PaintEventArgs^
e){ }
が用いられ、Visual C++ 2005はJavaに似ている。
文字を出力(描画)する方法の比較
◎従来のVisual C++の場合
Visual C++ 6.0で(Visual C++ 2005でMFCを使う場合も同じ)は、
pDC->TextOut(x,y,"文字列");
の形で文字の描画を行なった。フォント、色は別途設定。
◎Javaの場合
Javaでは、
g.drawString("文字列",x,y);
であり、これもフォント、色は別途設定する。
◎Visual C++ 2005の場合
これに対し、Visual C++ 2005で.NET Frameworkを使う場合には、
g->DrawString("文字列",font,brush,x,y);
が用いられ、フォント、色(brushで定義)を常に同時に含む。x、yはint型ではなく、float型であるのは不思議である。int型を使用すると、ビルド時に警告が発せられるが、無視しても実行できる。
ここでも、Visual C++ 2005はJavaに似てきたことになる。
数値を文字化する方法のいろいろ
◎ToString()を使う
変数(オブジェクト)を文字化する場合、
int n=10;
double d=3.14159;
String^ string1=n.ToString();
String^ string2=d.ToString();
の方法がある。そして、
g->DrawString("n="+string1+"
d="+string2,font,brush,x,y);
のように「+」演算子で連結する。
◎String::Format()を使う
別の方法に、
String^ string1=String::Format("n={0}
d={1}",n,d);
g->DrawString(string1,font,brush,x,y);
もある。
ただし、このままの単純な使い方では作表などには向いていない。詳しくは、「易しい使い方(5)」で紹介する。
◎sprintf_sを使う
C言語での懐かしい方式を用いるには、
char buf[80];
sprintf_s(buf,80,"n=%d d=%f",n,d);
String^ string1=gcnew String(buf);
g->DrawString(string1,font,brush,x,y);
が使える。sprintf_sはsprintfのsecure化(セキュリティの強化)されたもので、最大文字数の指定が要求される。ただし、ヘッダファイルstdafx.hに
#include <stdio.h>
を追加しておく必要がある。
プロジェクトの新規作成とフォームの準備
1)デスクトップから、「Visual C++ 2005」のアイコンをダブルクリックする。
2)「スタートページ」のウインドウが開く。
3)メニューから「ファイル」→「新規作成」→「プロジェクト」を選択する。
4)「新しいプロジェクト」ウインドウが開くので、
プロジェクトの種類-------- CLR
テンプレート ------------- Windowsフォームアプリケーション
プロジェクト名 ----------- (入力する)
ソリューションのディレクトリの作成
------ (チェックをつける)
として、「OK」をクリックする。
5)「フォームデザイナー」ウインドウが開き、「Form1」ができている。サイズは、白い四角形のハンドルをドラッグして変更することができるが、今回はデフォルトサイズのまま使用する。
図1で、左側は「ソリューションエクスプローラ」、右は「フォームデザイナー」の一部である。
図1 「新しいプロジェクト」ウインドウで「OK」をクリックすると現れる画面の一部
6)「フォームデザイナー」上の「Form1」の中央部で右クリックし、「プロパティ」を選択すると、図2に示す「プロパティ」ウインドウが現れるので、「BackColor」を探し、クリックする。
7)右側にプルダウンメニューの矢印が現れるので、それをクリックし、「Window」を選択する。これにより、「プロパティ」ウインドウの「BackColor」の右に「Window」と表示され、「Form1」の中央部の色が白色に変わる。
「プロパティ」ウインドウで、「BackColor」のプルダウンリストを開き、「Window」を選択した状態を図2に示す。

図2 「プロパティ」ウインドウで、「BackColor」の候補を開いた状態
7)同様に、「プロパティ」ウインドウの下部にある「Text」を探し、これをクリックして選択し、右にある「Form1」を「Back
space」キーで消し、代わりに「三角関数表」と入力し、「Enter」を押す。図3は、「プロパティ」ウインドウの下端を示したもので、「Text」が選択されている。

図3 「プロパティ」ウインドウの下方にある「Text」欄
プログラムの作成
1)「フォームデザイナー」上の「Form1」の中央部で右クリックし、「プロパティ」を選択すると、「プロパティ」ウインドウが現れるので、「イベント」アイコンをクリックし、「表示」の下の「Paint」をダブルクリックする。
図4は、「イベント」アイコン(稲妻の形)をクリックした後の「プロパティ」ウインドウを、中間を省略して示したものである。「Paint」をクリックすると、メソッド「Form1_Paint」が生成される。
図4 「プロパティ」ウインドウ下部の「Paint」をクリックした後の画面(一部省略)
2)「コードエディタ」が開き、「Form1_Paint()」メソッドのスケルトンができるので、図3のように入力する。
String^などの「^」は使用終了後に自動的にガーベージコレクション(garbage
collection、メモリ領域の開放)されるオブジェクトに対するポインタで、Visual
C++ 2005で採用されたものである。また、gcnewは、garbage
collection対象の領域にメモリを確保するnew演算子である。自動的なガーベージコレクションは、以前からJavaにある機能である。「"MS
ゴシック"」を入力する場合、「MS」と「ゴシック」は全角で、その間は半角のスペースにしないと、異常が発生する。
図5 コードを書き込んだForm1_Paintメソッド
3)「sprintf_s」と「M_PI」(定数π)を使用するので、ヘッダファイルstdafx.hに、
#include <stdio.h>
#define _USE_MATH_DEFINES
#include <math.h>
と記載する。
プログラムのビルド
「統合開発環境」のメニューから、「ビルド」→「C701のビルド」を選択し、「出力」ウインドウの「正常終了」を確認する。
プログラムの実行
「統合開発環境」のメニューから、「デバッグ」→「デバッグなしで開始」を選択すると、「フォーム」が画面上に表示され、期待通りの表が得られる。図6は、プログラムの実行結果を示す。
図6 プログラムの実行結果