Version 3.2
クラスを見渡そう!
「と、いうわけで今回はクラス特集!」
『おー!』
「……そのオヤジくさい歓声やめたら?」
『イヤっす!』
「……えっと、まずライブラリについての復習から」
『はーい。たしかMFCとかAPIとかだよね』
「そうそう。まずウィンドウズプログラムを作るのに絶対必要なのが、
API。これがなきゃウィンドウズアプリは作れないってこと」
『でも使ってないよね』
「APIの代わりにMFCを使ってるからね。MFCが間接的にAPIを呼
び出すことで、ダイアログ表示したりしてるわけ」
『でもさ、MFCとAPIって似てるって言ってたよね。わざわざMFCを
使う必要ってあるの?』
「それが最初の注目点。このページ見てみて」
『あ、かぶスタのホームページだね』
http://www.kab-studio.biz/Programing/Codian/MxA/02.html
「この中に書いてあるプログラムは、〈MFCを使わないで、APIだけで
作った、ウィンドウを表示するプログラム〉だけど……感想は?」
『……なんか長いねー』
「そう。APIだけで作ると、かなり大変なんだよね、ウィンドウズアプリ
を作るのって」
『だからMFCを使うと』
「そゆこと。ちなみにAPIだけでアプリを作る方法が【猫でもわかるプロ
グラミング】 ってホームページに書いてあるから参考にしてみてね」
http://www.kumei.ne.jp/c_lang/
『ってなにライバルのページ勧めてんのよ!?』
「ふっ、かぶスタの7倍のヒット数を稼ぐ大人気ホームページと、なに張り
合おうっていうの……」
『あ、遠い目……』
「ま、APIだけでプログラム作るのってとっても役立つから、暇なときに
読んでみるといいよ。僕もかなり参考にしたしね」
『へー』
「話を戻すと……」
『APIだけだと面倒だからMFCを使うってことよね』
「そうそう。MFCには、アプリそのものを管理する CWinApp や、ダイア
ログを管理する CDialog とかのクラスが用意されています。この中に、さっ
き以上のながーいプログラムが詰まってるから、楽ができると」
『確かに楽ねー、なんもしてないんだから』
「さて、ここまでが〈MFCに用意されているクラス〉」
『あのいーっぱいあったクラスの表の中のふたつ、ってことね』
「ここで、自分でダイアログ作って、ボタンをひとつ付けました。さて、こ
のボタンを押したときに計算をしたい、そういうときどうするか」
『確かイベントとかゆーのだよね』
「詳しくは Ver 2.0( No.11 )とかを見てねってことで。そう、〈ボタン
を押した〉っていう〈イベント〉に対処するメンバ関数を作ればいいんです。
でもこれはどんなクラスのメンバ関数でもできるわけじゃなくて、 CDialog
じゃないとできないことなんです」
『へー、CDialog ってそういうこともしてるんだ』
「でもさ、CDialog に直接〈計算機能〉とか付けられないでしょ」
『CDialog ってどこにあんのかも、どーやって作り替えればいいのかも分か
んないし、確かに無理っぽいよね』
「そこで、VCが自動的に〈好きなように書き換えても、メンバ関数を追加
してもいいクラス〉を作ってくれます」
『それってもしかして CCalcDlg とかのこと?』
「そう! プロジェクトを作るとき、VCは自動的にクラスを作ります。ア
プリの中心を管理するクラスとダイアログを管理するクラスをね。でもただ
のクラスじゃ役に立たないでしょ。そこでこの作ったクラスに〈MFCのク
ラスの機能〉を与えるわけです。それが」
『継承!』
「そういうこと! 継承を使うと、特定のクラスが持っているメンバ関数を
そのまま使えるクラスを作れる、そこで、主要な機能をMFCのクラスで、
特別なアプリ独自の機能をプロジェクトのクラスでっていうふうに分業する
わけだ」
『つまり背後霊よね!』
「はいごれい??」
『あったまいー男の子と元気な女の子がいてさー、女の子がピンチになると
男の子の魂が女の子に乗り移って、バツグンの運動神経+天才の頭脳でピン
チを乗り切るのよ!!』
「はぁ……まあそんか感じって言われればそうかもしんないけど……」
『その2人って相思相愛なんだけど、お互いのこと解り過ぎちゃってかえっ
て近づきにくかったりしてなんかじれったいのよ〜』
「かーみーちゃーんー」
『はいっ! すみませ〜ん……今度コミックス読む?』
「読みません。さてイメージしましょう。右側に大きな塊、左側に小さな塊、
間にはスペース」
『うんうん』
「右側の大きな塊には、MFCのクラスがいっぱい詰まってる。この中のク
ラスはとっても便利だけど、簡単には書き換えられない」
『左側は Calc とかのプロジェクトのクラスが詰まってる。こっちは新しく
作ったのだから、自由に書き換えられ、でしょ?』
「このふたつの間を継なぐものは?」
『継承! 左側の〈自分で作ったクラス〉は、継承ってので右側のMFCの
クラスの機能が使える、だよね!』
「ちゃんとわかってんね。さらに……えっと、VCで【ワークスペース】を
開いて、一番左のタブ、【ClassView】をクリックして」
『あ、これって初物だね。クリックと……あ!』
おなじみのツリー表示。一番上には【Calc クラス】、その下に CAboutDlg,
CCalcApp, CCalcDlg が表示されている。
『これって全部クラス!』
「ここに表示されてるのは、今のプロジェクトに含まれているクラス」
『こんなふうに、プロジェクトのクラスを見られるってことね』
「それだけじゃないよ。 CCalcDlg をダブルクリックして」
『ぱちぱちっと』
テキストエディタが開き CalcDlg.h ファイルの中身が表示される。
「拡張子が【 .h 】のファイルにクラスの情報や、メンバ関数の宣言が入っ
てる、憶えてるね?」
『憶えてるよー。これが〈 CDialog から継承してる〉って意味でしょ?』
class CCalcDlg : public CDialog
{
「そうそう。で、次。さっきの【ClassView】で、 CCalcDlg のツリーを開
いて」
『田をぽちっと』
田をクリックすると、変なアイコンと文字が並ぶ。
『あ、これって CCalcDlg のメンバ関数だ! えっと、=ボタンを押したと
きのは、OnBEqual() っと!』
OnBEqual() をダブルクリックすると、テキストエディタに CalcDlg.cpp
が表示され、CCalcDlg::OnBEqual() の行にカーソルが合っている。
『こーゆーふーにも開けるんだー』
「拡張子が【 .cpp 】のファイルにメンバ関数の定義、つまり中身が入って
る」
『はい憶えてまーすヘッダーファイルとインクルードファイルがペア、で
しょ?』
「大丈夫そうだね。さてもう一度復習! MFCのクラスから継承したクラ
スを作ってもらって、そのなかに自分が必要とする機能を埋め込む!」
『それが基本! って感じ?』
「MFCアプリを作るときは、ね。最後に確認ってことで、いくつかメンバ
関数を使ってみようか」
『使ってみる?』
「繰り返しになるけど、CCalcDlg なら……」
class CCalcDlg : public CDialog
{
「って書いてあるから、 CDialog のメンバ関数はぜーんぶ使えるし、さら
に CDialog が継承してる CWnd のメンバ関数も使えるんだったよね」
『う”、MSDNの CWnd のあの膨大なメンバ関数が目に浮かぶ……』
「その中からひとつ使ってみようか。 CWnd クラスってどんなクラスだっけ」
『確かウィンドウを操作するクラスだったよね』
「そうそう。ダイアログもウィンドウのひとつだから、 CDialog を CWnd
から継承して、ウィンドウの操作もできるようにしてるわけ」
『へ〜、そういう意味もあるんだ』
「そこで、ウィンドウとして操作してみましょう。今日最初のプログラム。
いつもの〈ボタンを押したとき〉メンバ関数を書き換えてください」
void CCalcDlg::OnBEqual()
{
SetWindowText( "あいうえお" );
}
『SetWindowText() って?』
「分からなかったらまずMSDN」
『教えてくれてもいーのに、ケチ。えっと、ダブルクリックしてF1。みっ
つ出てきたけど……とりあえず CWnd::SetWindowText かな』
void SetWindowText( LPCTSTR lpszString );
『引数は、LPCTSTR だから文字列よね。あ、ちゃんとそうしてるね。えっと
説明は……ウィンドウのタイトルを変える?』
「試してみれば?」
『ビルドして実行、【=】ボタンを押して……あー!! ダイアログのタイ
トルが〈あいうえお〉になった!!』
「これが〈ウィンドウを操作する〉ってこと。こーゆーことができるように
するために、継承してるってわけだ」
『確かに、これならダイアログは表示できるし、ウィンドウのタイトルも変
えられるよね』
「他にも色々できるから、暇なときに CWnd のメンバ関数一覧を眺めてみる
のもいいかも」
/*
Preview Next Story!
*/
『それにしても、こんな簡単に予定変えちゃっていいの?』
「いいんじゃないの?」
『軽いわねー』
「レスポンスの良さは重要だよ?」
『これだからホームページあがりは……』
「というわけで次回」
< Version 3.3 ダイアログができるまで >
『につづく!!』
「というわけで少しスローダウンして、ゆっくりいきましょう」
『あ、また少しタイトル変わった……』