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 プログラムの実行結果