vissuuaall cc ++基基礎礎知知識識junko036.html.xdomain.jp/school/cpp/vcpp1.pdfvisual c++ 2010...
TRANSCRIPT
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-1-
■ Visual C++の概要 ■
■ VC++のメリット
視覚的で有る
Visual C++は、Windowsアプリケーションの開発環境で有る。Windowsアプリケーションは、独自の
画面を持って居り、此の画面は、一般に、Graphical User Interface(GUI)と呼ばれる。
最も解り易い Visual C++のメリットは、此の GUIを非常に簡単に作れる事で有る。慣れると、1~3日
で其れ成りの GUIを作れる様に成る。
C/C++の知識が役に立つ
普通の C/C++と Visual C++の関係が解らない人も居るかも知れないが、車で例えるなら、普通の C/C++
は「エンジン」担当で、Visual C++は「ボディ」担当に成る。
下図のアプリケーションの場合、Visual C++はボディ(詰まり外装)担当なので、ボタンの配置や画面
の大きさ、画像の表示等、GUIレイアウト全般を行って居る。
C/C++はエンジン(詰まりプログラムの動作)担当なので、ボタンを押した時の具体的な計算処理や通
信処理を記述して居る。
実際に作らないと実感が沸き難いと思うが、今迄の C/C++の知識が無駄に成る事は無い。
プログラムの本質はエンジン(何をするか)で有り、実際の作業も、エンジン部分の作成時間が殆どで
有る。亦、GUI 部分に付いても、基本は飽く迄 C++なので、C/C++に詳しい人程、Visual C++をより
高度に使い熟す事が出来る。
VViissuuaall CC++++基基礎礎知知識識
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-2-
全部理解しなくても良い
Visual C++独自のルールや API を憶えられるか不安な人も居ると思う。併し、此処も心配する必要は
無い。個々のルール、APIを完全に理解しなくても GUI作成は出来るからで有る。
C 言語を初めて学んだ時、「#include <stdio.h>」の意味を知らなくてもプログラムは動いた筈で有る。
Visual C++でも、「TextOutで文字出力」程度に APIの使い方を理解をして居れば充分で有る。
本稿では、GUI 作成に必要なルールや API に付いて代表的な物は紹介するので、旨く切り貼り、編集
すれば、其れ丈で GUIアプリケーションは作れる。
詳しく知り度い人
詳細を理解したい人には、色々調べる手段が有る。先ずは、API名を検索すれば、解説サイトが色々出
てくる筈で有る。併し、正式な仕様は、MSDN で調べて欲しい。猶、初心者には若干敷居が高いが、
市販の書籍等では入手できない知識を得る事が出来る。
■ MFCとは
MFC はWindwosアプリケーションの基本
Visual C++には便利な機能を纏めたMFCと呼ばれるクラス群が有る((MFC:Microsoft Foundation
Class)。MFCは、プログラマに対し、Windowsアプリケーション開発に必要な機能を色々提供して下
れる。
1 つの具体例が、GUI作成用の API で有る。他にも沢山機能が有るが、初めは知らなくても問題無い。
ポイントはMFCを使うと簡単に GUIアプリケーションを作れると謂う事で有る。
MFC が難しそうだと感じる人も居るかと思うが、結論から謂えば、初心者の内は「MFCを使ってプロ
グラムして居るな」と感じる事は余り無い。勿論、結果と仕て使って居るのだが、使い熟して居る実感
が沸くのは、Visual C++に或る程度慣れてからで有る。
初心者の内は、「決まった場所に、決まった API」を貼り付ける作業が中心に成る。前述した様に、
「#include <stdio.h>」の意味が解らなくても C言語が使える様な物で有る。
亦、残念ながらMFCを座学で理解する事は難しいので、「取り敢えず作って観て慣れてから考える」ア
プローチが良いと思う(MFC アプリケーションの作り方は、アプリケーションの種類以降で具体的に
解説する)。
■ Main関数
Mainの意味を考える
Visual C++の「main」は何処に有るのかと良く聞かれるが、結論から謂えば、mainは Visual C++プ
ログラミングに関係無い(MFCアプリケーションを作る場合)。
普通の C/C++でアプリケーションを作る場合、mainに「printf("Hello World");」と書き込み、実行す
ると、画面に「Hello World」が表示される。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-3-
此処で重要なのは、「Hello World」を表示する画面と、作成した自作アプリケーションが夫々独立した
プログラムと謂う事で有る。
mainには、プログラム全体を記述しなくては成らない。自作アプリケーションは「Hello World」を画
面に表示させる以外に何の機能も持たないので、main の中に「printf("Hello World");」丈を記述すれ
ば良い事に成る。
一方、Windowsアプリケーションでは何うで有ろうか。Windowsアプリケーションは、自分自身の画
面(GUI)を持って居る。
mainには、プログラム全体を記述しなくては成らないので、mainの中には、当然「Hello World」の
コード丈ではなく、GUI用のコードも含まれて居なくては成らない。
Main(全体)を意識しなく良い
今迄、Main(全体)を意識しなくても良い普通の C/C++しか使って居ない人が、いきなり Visual C++
で GUIのコードを書けるで有ろうか。可成り難しい事は容易に想像出来る。
其処で、Visual C++は、開発者の GUI作成負荷を軽減する為、MFCテンプレートが自動的に GUIの
初期コードを作成して下れる(アプリケーションの種類参照)。此の時、mainに付いても、Visual C++
が自動的に作成して下れて居る。
其の為、開発者が、此のmainを変える必要は殆ど無い。開発者は、main(プログラム全体)を意識す
る事無く、「文字を表示する機能」や「計算処理を行う機能」等、必要な機能而巳に注力してプログラ
ミングを行えば良いので有る(具体的にはイベントハンドラと仕て各機能を実装する)。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-4-
■ VC++基礎知識 ■
■ アプリケーションの種類
3種のアプリケーション
Visual C++では、MFCを使用した 3種のアプリケーションテンプレートが用意されて居る。夫々特色
が有るので、簡単に概要を説明する。各テンプレート毎に画像を載せて居るが、此の図は、自動的に作
成された初期コードの実行結果で有る。何も仕無いでも、此処迄は Visual C++が作成して下れる。
MFC アプリケーションの作り方
MFC を使ったアプリケーションは、ウィザード形式で作成する。Visual C++を起動して、「ファイル」
→「新規制作」→「プロジェクト」と選ぶと、下図の様なダイアログが表示される(6.0、.Net、2005
とバージョンに依り異なるが、内容は粗同じで有る)。
此処で「MFC」→「MFC アプリケーション」と選択し、適当なプロジェクトを作成すると、下図のダ
イアログから「アプリケーションの種類」を選択出来る。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-5-
以下、3つのアプリケーションの種類に付いて簡単に説明する。
① ダイアログベース
ダイアログベースは 3 種の中では、一番簡単に
Windows アプリケーションを作る事が出来る。コン
トロールを追加し乍ら GUI を直接編集出来るので、
最初は、此れから始めるのが良いと思う。
② シングルドキュメント
シングルドキュメントはメニュー表示等が有るので、
よりWindows風なアプリケーションが作れるが、ダ
イアログベースと比べると、デバイスコンテキストを
深く理解する必要が有り、Doc-View アーキテクチャ
と謂う概念も知って置く必要が有る。
尤も、デバイスコンテキストは、其れ程難しい概念で
は無く、Doc-View も画面表示処理とデータ処理を分
離してプログラムをする丈なのだが、先ずダイアログ
ベースを確り理解した後に学べば良い。
③ マルチドキュメント
マルチドキュメントは、3種の中では一番複雑なテン
プレートで有る。1つのメインウィンドウ(プログラ
ム全体の画面)に複数の子画面を持つ事が出来る。
此処で謂う「ドキュメント」は「データ」と謂う様な
意味で、
子画面毎に異なったデータを表示出来ると謂う事で
有る。
実際には、余りマルチドキュメントを使用する事は無い。個人アプリケーションレベルだと、シングル
ドキュメントやタブコントロールを使えば充分だからで有る。
然う謂う訳で、本稿では、マルチドキュメントアプリケーションの作り方は説明しないが、基本的には
シングルドキュメントを理解して居れば対応出来るので、自分で色々勉強して観て欲しい。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-6-
■ コントロール
画面構成アイテム
コントロールは、GUI用の画面構成アイテムで有る。ダイアログ上に色々GUI
用の部品をドラッグアンドドロップで貼り付ける事が出来る。
コントロールには、関数を起動する為のボタンやテキスト表示用の領域、プ
ログラムの進捗状況を表示する為のバー等色々な物が用意されて居る。
Visual C++での編集画面は、下図の様に成って居る。画面中央が編集対象の
ダイアログで、此の上に右側の「ツールボックス」から必要なアイテムを貼
り付けて行く。
コントロールの種類
此処では、頻繁に使用するコントロール Button、Edit Control、Picture Controlを簡単に解説する。
Button
ボタンを押した時に対応したイベントハンドラ関数を呼び出す。
Edit Control
文字列や数字データの入出力を行う
Picture Control
線で囲まれた四角形領域を指定する。
独立したデバイスコンテキストと仕て使用する。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-7-
■ デバイスコンテキスト
具体的にコントロールで GUI を作成して観る事にする(下図のダイアログベースのアプリケーション
にコントロールを追加して観る)。
下図が、アプリケーション例で有る。此れ丈で可成り Windows アプリケーションらしく成った気がす
ると思う(ツールバーからコントロールをピックアップして貼り付ける丈なので、此の程度の GUI な
ら 1~2分位で作れる)。
因みに、上図のアプリケーションは、Button と ListBox と CheckBox を上段に並べ、中央の大きな部
分は Edit Controlを貼り付けて居る。猶、「OK」「キャンセル」ボタンは場所を移動させた丈で有る。
コントロール変数
コントロールで GUI(外装)を作るのは簡単だが、実際には、コントロールとプログラムの中身を関連
付けなくては成らない。
此の為、GUI と仕て貼り付けたコントロールには、変数を追加する事に成る(Button には、イベント
ハンドラを追加する)。変数には、「Control」タイプと「Value」タイプの 2種類が有る事を憶えて置い
て欲しい。
上図のダイアログの Edit Control(大きな白い部分)に変数を追加して観る(Edit Controlは、文字列
を表示したり、数字データの入出力を行う為に使用する)。
先ず、Valueタイプの変数だが、此れは、所謂普通の変数で有る。Edit Controlに CString(文字列)
型の変数を追加して観る事にする。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-8-
ダイアログ上の Edit Control の上で「右クリック」し、「変数の追加」を選択すると、下図の様なダイ
アログが表示される。
右側のカテゴリを「Value」に仕て、左側の変数の種類を「CString」にする。変数名は「m_edit」に
仕て、右下の完了ボタンを押せば変数が追加される(プロジェクト名 Dlg.hに追加されて居る)。
必要な操作は此れ丈で有る。後は、プログラムの中からm_editに値を入力すれば、Edit Controlに文
字が表示される。例えばプログラム中で「m_edit="Hello World";」とすると、画面上に「Hello World」
が表示される(正確にはUpdateDataと謂う関数が必要だが、詳しくは計算処理に記述して居る)。
勿論、変数の種類は、double や int と謂う数値タイプにも出来るので、「m_edit=1.234;」とか
「m_edit=15;」と謂う数字の入力も出来る。此処迄は解り易いと思う。Valueタイプの変数は、普通の
C/C++の変数と謂う事で有る。
次に、Controlタイプの変数だが、此のタイプの変数は値の入力丈で無く、GUI表示を変更させる事が
出来る。先ず、Edit Control を例に Control変数を追加して観る事にする。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-9-
右側のカテゴリを「Control」にすれば、左側の変数が「CEdit」に成る。変数名は「m_edit」に仕て、
右下の完了ボタンを押せば、変数が追加される。
Control タイプの変数で文字を表示する場合、「m_edit="test";」ではなく、「m_edit.SetWindowText
("test");」と成る。詰まり、CEditクラスのメンバ関数を使って文字を表示する訳で有る。
亦、「m_edit.MoveWindow」、「m_edit.ShowWindow」といったメンバ関数を使えば、Edit Controlの
表示位置・大きさを変えたり、表示/非表示を切り替えたり出来る(詳しくは動的レイアウト参照の事)。
VC プログラムを始めて直ぐの頃は、Value タイプの変数の方が使い易いかも知れないが、洗練された
GUI作成には Controlタイプの変数を使い熟す必要が有る。
コントロールプロパティ
コントロールの細かい見た目は「プロパティ」で調整する。コントロールの上で右クリックして、メニ
ューからプロパティ表示を選択する。
例えば、Edit Control の場合では、下図に示す様なプロパティが有り、「MultiLine」と謂う欄の値を
「True」にすれば複数行表示が可能に成ったり、「Border」と謂う欄の値を「False」にすれば枠線が無
く成ったりする。
此処では、Edit Controlを例に解説したが、他のコントロールにも、様々な型、プロパティが有る。各
自で色々調べて研究して観て欲しい。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-10-
■ デバイスコンテキスト
描画キャンパス
デバイスコンテキストは GUI 用の描画キャンパスで有る。デバイスコンテキストには、図形を描画し
たり画像を表示させたり出来る。
コントロールは、ダイアログベースのアプリケーションが中心だが、デバイスコンテキストは、ダイア
ログベースでもシングルドキュメントでも使用する。
シングルドキュメントの画面編集
下図は、シングルドキュメントの初期コードの状態で有る。白い空間が有るが、此処にはダイアログベ
ースの様にコントロールを貼り付ける事は出来ない(CFormView を使えば出来るが、一先ず基本で説
明する)。
此処で登場するのが「デバイスコンテキスト」と謂う概念で有る。白い空間をキャンパスとして、関数
(API)を通じて図形や文字を書き込むので有る。
下図は、背景全体をデバイスコンテキスト(キャンパス)に仕て文字や図形を書き込んだ例で有る。背
景をグレイに仕て、赤い文字や丸(○)や四角(□)を書いて居る。
デバイスコンテキストへの図形描画は APIを通じて行われる。詰まり、ソースコードに直接描画用のプ
ログラミングコードを書き込むので有る。
具体的には、Viewクラスに OnDrawと謂う関数が有り、其処に以下のコードを書いて居る。下記コー
ドの①~⑤に注目して欲しい。pDC と謂うのがデバイスコンテキストを表すポインタで、pDC(描画
キャンパス)に直接「Ellipse」や「Rectangle」を使って○や□を描いて居る。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-11-
// 文字変数
CString str1;
str1=_T("背景(グレイ)、文字(赤)、線(青)、塗りつぶし(白)");
// ペン(線用)とブラシ(塗潰し用)作成
CBrush brWhite(RGB(255,255,255));
CPen penBlue(PS_SOLID,1,RGB(0,0,255));
// デバイスコンテキストの線、塗潰しの色設定
pDC->SelectObject(&brWhite);
pDC->SelectObject(&penBlue);
// TextOut関数の文字の色、背景を設定
pDC->SetBkColor(RGB(200,200,200));
pDC->SetTextColor(RGB(255,0,0));
// ①背景を白色で塗りつぶす
CRect rect;
GetClientRect(&rect);
pDC->FillSolidRect(&rect,RGB(200,200,200));
// ②文字を書く
pDC->TextOutW(10,10,str1);
// ③線を書く
pDC->MoveTo(0,40);
pDC->LineTo(rect1.Width(),40);
// ④円を描く
pDC->Ellipse(40,50,140,150);
// ⑤四角形を書く
pDC->Rectangle(150,50,250,150);
ダイアログベースの画面編集
ダイアログベースでは、此のデバイスコンテキストと、先程のコントロールを組み合わせてアプリケー
ションを作成する。
下図のアプリケーションの場合、上半分がコントロールを貼り付けた部分で(白い範囲も Edit Control
で有る)、下半分がデバイスコンテキストに書き込んで表示して居る部分に成る。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-12-
此のデバイスコンテキストは、Picture Controlと謂うコントロール中に作って居る。Picture Control
は、ダイアログ内の四角形領域を指定する為に使うが、此の領域中をキャンパスと看做して書き込んで
居るので有る。
Picture Controlを複数配置すれば、其の中に夫々独立したデバイスコンテキストを作る事が出来る。
デバイスコンテキスト内の線や塗潰しの色は簡単に変える事が出来る。背景色や文字のフォント等も同
様で有る(詳しくは図形描画に記述して居る)。
取り敢えず、Visual C++で GUI を作るには、コントロールとデバイスコンテキストが大事だと理解し
て置いて欲しい。
■ イベントハンドラ
総ての操作はイベントで有る
イベントハンドラとは、「イベント」が起きた時に呼ばれる対象を謂う。此れも、具体的に観て行く事
にする。
Visual C++の GUI を作るには、コントロールとデバイスコンテキストが重要だと説明した。其れでは
ボタンを押した時に、此の GUIの内容を変更するのは何うすれば良いのだろう。
此処で登場するのが「イベント」と謂う概念で有る。イベントと謂うと難しく聞こえるが、要はユーザ
がアプリケーションに何か操作をする事で有る。閉じるボタンを押したり、最大化ボタンを押したり、
自作のボタンを押したり、此等総てがイベントで、Windows アプリケーションの中では、其の動作に
対応した処理が行われて居る。
閉じるボタンや最大化ボタンを押した時に呼び出される関数は予め決まって居る。此の様な共通動作に
付いてはMFCが準備して下れて居るので有る。
併し、自作のボタンを押した時に呼び出される関数には、予め決められた処理と謂うのは無い。其処で
自作のボタンを押すと謂うイベントに対応した関数を自作する事に成る。
此の様な関数を自作の「イベントハンドラ関数」と謂い、此のイベントハンドラ関数の中でデータ処理
や GUI表示の処理を記述する。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-13-
ダイアログベースのイベントハンドラ
デバイスコンテキストの説明で使用したアプリケーションに、イベントハンドラ関数を追加して観る事
にする。具体的には、Button1にイベントハンドラ関数を設定して観る。
ダイアログ編集画面上の Button1 の上で右クリックし、「イベントハンドラの追加」を選択すると、下
図の様なダイアログが表示される。
■ Doc-View
メッセージの種類が「BN_CLICKED」で、クラスの一覧が Cプロジェクト名 Dlgに成って居る事を確
認する。
関数ハンドラ名は「OnBnClickedButton1」の儘、「追加して編集」を押す。然うすると、プロジェク
ト名 Dlg.cppに、下記の様な関数が出来て居る筈で有る。
void CdialogDlg::OnBnClickedButton1()
{
// TODO: 此処にコントロール通知ハンドラコードを追加する。
}
此の関数がイベントハンドラ関数に成る。プログラムを実行して画面のボタンを押すと此の関数が呼ば
れる。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-14-
試しに「MessageBox(_T("Hello World"));」を TODO コメントの下に記述して観る。Button1 押すと
「Hello World」と謂う小さいダイアログが出て来る筈で有る(MessageBox は、此の様なダイアログ
を表示させる為の APIで有る)。
此の様に、イベントハンドラ関数を作成し、後は、此の関数内にコントロールやデバイスコンテキスト
を操作する為の処理を記述する丈で有る。
詳細は「文字表示」「計算処理」「図形描画」「画像表示」に纏めて居るので、参照して欲しい。
シングルドキュメントのイベントハンドラ
ダイアログベースでは、ボタンを直感的に配置して、イベントハンドラを設定した。シングルドキュメ
ントのイベントハンドラは、何の様に作成するので有ろうか。
シングルドキュメントでは、「メニュー」と「ツールバー」にイベントハンドラを設定する。下図のア
プリケーションを観て欲しい。「Hellow World」がメニューに、「HW」と謂うアイコンがツールバーに
追加されて居る。
此の様なメニューやツールバーは、Visual C++のリソースビューから追加する事が出来る。
先ず、下図は、「HelloWorld」をメニューに追加する場合で有る。IDR_MAINFRAMEと謂うメニュー
リソースを選択する。「此処へ入力」と書いて有る処に新しい項目を追加する事が出来るので、上段に
「HelloWorld」を追加し、其れをクリックした時に「HelloWorld(H)」が出て来る様に仕て居る。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-15-
イベントハンドラは此の「HelloWorld(H)」に対して行う。メニュー上で右クリックを仕て、「イベン
トハンドラの追加」を選択すると下のダイアログが表示される。
メッセージの種類から「COMMAND」、クラスの一覧から「C プロジェクト名 View」を選択して「追
加して編集」を押せば、プロジェクト名 View.cpp に、下記の関数が追加される。後は、TODO コメン
トの下に必要な処理を記述すれば良い。
void CString2View::OnHelloworldHelloworld()
{
// TODO: 此処にコマンド ハンドラコードを追加する。
}
亦、「HW」のアイコンをツールバーに追加するのもリソースビューから行う。IDR_MAINFRAME を
選択し、空白のアイコン(下の図だと右端)に「HW」アイコンを作成する。作成したアイコンは、ド
ラッグで位置を変更出来るので、先頭に持って来る。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-16-
此の「HW」アイコンの ID を確認して欲しい。恐らく「ID_BUTTON…」と謂う名前が付いて居る筈
で有る。
此の「HW」アイコンは、先程作成した「HelloWorld(H)」のイベントハンドラを呼び出す丈で有る。
プロジェクト名 View.cppの BEGIN_MESSAGE_MAP と謂う処を探し、下記の記述を追加する。
ON_COMMAND(ID_BUTTON…, &Cプロジェクト名 View::OnHelloworldHelloworld)
BEGIN_MESSAGE_MAP(CString2View, CView)
// 標準印刷コマンド
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_COMMAND(ID_HELLOWORLD_HELLOWORLD,
&CString2View::OnHelloworldHelloworld)
ON_COMMAND(ID_BUTTON_HW, &CString2View::OnHelloworldHelloworld)
END_MESSAGE_MAP()
此れで「HW」のアイコンから「HelloWorld(H)」のイベントハンドラを呼び出す事が出来る様に成る。
具体的なイベントハンドラの記述に付いては Doc-Viewを参照して欲しい。
■ Doc-View
データ処理と描画処理を分ける
Visual C++には、Doc-Viewアーキテクチャと謂う概念が有る。此れは、主にシングルドキュメントア
プリケーションを開発する時に必要と成る概念で有る(ダイアログベースに付いては、此の項の一番下
を観て欲しい)。
此の Doc や View と呼ばれる物は、Doc クラス、View クラスの略で、シングルドキュメントでは、此
のクラス、関連ファイルが自動生成される。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-17-
Doc-Viewアーキテクチャを簡単に説明すると、Docクラスはデータ処理丈、Viewクラスは描画処理丈
を行うと謂う事で有る。
例えば、コントロールやデバイスコンテキストと謂ったGUIに関する操作は、描画処理に当るのでView
クラスに記述する。
一方、イベントハンドラの中では、様々なデータ処理が必要に成る。此の時、イベントハンドラ関数自
体は Viewクラスに作成するが、データ処理は、Docクラスのメンバ関数を呼び出して行う。
簡単なルール
Doc-Viewは作って観ないと解り難い概念で有る。先ずは、下記の 3条のルールに気を付けると良い。
① 画面表示に関係する変数は、総て Docクラスのメンバ変数にする。
Viewクラスのイベントハンドラ関数内に閉じた変数には仕無いと謂う事。
② データ処理は Viewクラスに記述しない。
Docクラスのメンバ関数を呼び出して行うと謂う事。
③ 描画処理は Viewクラスの OnDrawに総て記述する。
Viewクラスのイベントハンドラ関数内に描画処理を記述しないと謂う事。
イベントハンドラでは Invalidate、UpdateWindowを使って OnDrawを呼ぶ丈。
具体例
此処では、イベントハンドラの項で作成したシングルドキュメントアプリケーションに、実際に
Doc-Viewアーキテクチャに従った記述を加えて行く事にする。画面上の白い領域に「Hello World」と
表示させる様にして観る。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-18-
先ずは、出力する文字列用の変数と仕て、「CString」型のメンバ変数「m_str」を Docクラスに設定す
る(文字列は表示する「データ」で有る。表示に関する「データ」は総て Docクラスのメンバにする)。
次に、Viewクラスの OnDraw関数に移動する。OnDraw関数は、描画の基本と成る関数で有る(描画
処理の度に此の関数が呼ばれる)。必要な描画処理は、総て此の関数に書き込む。
void CString2View::OnDraw(CDC* pDC)
{
// ①Docクラスのポインタ取得
CString2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 此の場所にネイティブ データ用の描画コードを追加する。
// ②文字表示
pDC->TextOutW(0,0,pDoc->m_str);
}
最初の行(①)に「CString2Doc* pDoc = GetDocument();」と記述して有る。此処は、非常に大事で
有る。
GetDocument は、Doc クラスのポインタを取得する為の API で有る。此処では「pDoc」が Doc クラ
スのポインタに成るので、View クラスは pDoc を通じて Doc クラスのメンバにアクセスする事が出来
る。
TODOコメント以下には、②の「pDC->TextOutW(0,0,pDoc->m_str);」を追加して居る。此れは、pDC
(シングルドキュメントのデバイスコンテキスト)に、変数「pDoc->m_str」に記述された文字列を表
示すると謂う意味で有る。
若し、m_strに何も文字が入力されて居ない場合は何も表示されず、文字が入力されて居る場合には文
字が表示される事に成る。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-19-
次に、m_str に文字列を入力する為のイベントハンドラを設定する。View クラスに追加したイベント
ハンドラ関数に移動する。
void CString2View::OnHelloworldHelloworld()
{
// TODO: 此処にコマンド ハンドラ コードを追加する。
CString2Doc* pDoc = GetDocument();
pDoc->SetString();
Invalidate(TRUE);
}
此の関数は、Viewクラスの関数なので、直接m_strに文字を入力する処理を書いては成らない。
面倒だが、一度 GetDocument で Doc クラスのポインタを取得し、メンバ関数(SetString)を呼び出
して処理させる様にする。猶、最後の Invalidateは再描画命令で有る(OnDraw を呼び出して居る)。
Docクラスでは、Viewクラスから呼ばれるSetStringの中身を記述する。此処では、単純に"Hello World"
と謂う文字列をm_strに足して居る丈で有る。
void CString2Doc::SetString()
{
m_str+=_T("Hello World ");
}
此処迄記述し、プログラムを実行すると、「HelloWorld」と謂うメニューか「HW」と謂うアイコンを
押す度に、「Hello World」と謂う文字列が表示される様に成る。
Doc-Viewの意義
Doc-View はプログラミングして観ないと理解し難い概念だと思うが、何んと無くのイメージは伝わっ
たで有ろうか。
何故、此の様なアーキテクチャを取って居るのか疑問に思う人も居ると思うが、実際にアプリケーショ
ン開発を進めると、此の重要性が解って来る。
Visual C++ 2010 【電脳梁山泊 烏賊塾】
-20-
最も意義が有るのは、データを保存するアプリケーションを作る時で有る。整然とデータが Docクラス
に纏まって居ると、データの保存、展開が楽に成る。
GUI処理に関して謂うと、再描画処理には Doc-Viewが不可欠で有る。単純にイベントハンドラに総て
の描画処理とデータを書いて了うと、適切な再描画が行われない。
負荷の高いアプリケーションをマルチスレッドにする場合も、此の概念は役に立つ。データ処理と画面
表示を夫々独立したスレッドにする事が出来るからで有る。
ダイアログベースでの Doc-View
ダイアログベースでは Doc-View を意識しなくても簡単なアプリケーションを作れるが、中級者以上を
目指すなら Doc-Viewの概念は重要で有る。
ダイアログベースの留意点は、シングルベースと粗同じで有る。
① 画面表示に関連するデータは、Cプロジェクト名 Dlgクラスのメンバ変数にする。
② イベントハンドラも、C プロジェクト名 Dlgクラスに出来るので、直接メンバを処理しても良い。
③ 描画処理は、Cプロジェクト名 Dlgクラスの OnPaintに総ての処理を記述する。
本稿の「初めの一歩」、「初級アプリケーション」の処では、敢えて Doc-View に従わず、ダイアログア
プリケーションを作成して居り、「中級者への道」では、此の時生じる問題点を解説して居る。
http://www.t-recipe.com/vc/