#pragma twice

KAB-studio > プログラミング > #pragma twice > 024 Version 2.13 いろんな関数!

#pragma twice 024 Version 2.13 いろんな関数!

前のページへ 表紙・目次へ 次のページへ

 Version 2.13
いろんな関数!

前回の最後でこのプログラムを試してもらったんだけど……

void Test()
{
    MessageBox( "あいうえお" );   // これが……。
}

void CCalcDlg::OnBEqual() 
{
    Test();
}

ビルドエラーが出たよ
というわけで、実は Test() の中では MessageBox() は呼び出せないので
す。ってことは、どういうことだと思う?
……このまえの話の続きで考えると、 MessageBox() が、なんかのクラス
っていうのの、メンバ関数っていうのだから?
大当たり!
でも変よ。っていうか、 MessageBox() なんてメンバ関数、 CCalcDlg の
中にないんだから、CCalcDlg::OnBEqual() の中では呼べるってことが変な
のよ
その気持ちはごもっとも。そこで、クラスの〈継承〉ってことについてま
ず知っておきましょう
けいしょー?
そう。 CalcDlg.h の CCalcDlg クラスの部分、こんなふうになってたで
しょ

class CCalcDlg : public CDialog
{
//  略。
};

うん
ここで重要なのは : public CDialog の部分。これがあると〈このクラス
は CDialog クラスのメンバ関数も使えますよー〉って意味になります
ってことは、 CCalcDlg が持ってるの以外にも、 CDialog のメンバ関数
も使えるってことなんだ
そういうこと。ちなみにたいがいのクラスは最初に C が付いてるから
あ、これで見分けるのね
じゃあ、 CDialog がどんなメンバ関数を持っているのか調べてみようか
どうやって?
前に MessageBox() を調べたときと同じ方法
あ、そっか、MSDNってヤツで調べるのね
 マウスカーソルが CDialog をダブルクリックし選択状態にする。そして
F1キー。MSDNが開き該当するトピックダイアログが表示される。
どれ?
タイトルが〈 CDialog 〉で、場所が〈 Microsoft (略) リファレンス〉
って書いてあるの
これ見分けるのってどうすればいーの?
まず〈場所〉が日本語のもの。あとはタイトルが一番シンプルなのかな。
ちなみに〈 CDialog クラス メンバ〉っていうのはメンバ関数一覧だから、
これでもいいんだけどね
でもとりあえずは〈 CDialog 〉っと
 CDialog というタイトルに続き、階段のようなイラスト。その後に続く解
説。
なんかいっぱい書いてあるね……
暇があったら読んでもいいけど、それよりは、分かりやすい解説書とかの
方を勧めるかな
まーねー、オフィシャルの解説なんてねー
で、まず下の方見て欲しいかな。こんなふうに書いてあるでしょ

#include <afxwin.h>

クラス メンバ |  基本クラス |  階層図

あ、 #include だって。この afxwin.h に、CDialog のこととか書いてあ
るんだ
そういうこと。だから afxwin.h をインクルードすれば使えるってこと
してたの?
もちろんね。今度見るけど、 stdafx.h ってファイルでインクルードして
るから
ふーん
じゃ、今度は〈クラス メンバ〉を見てみようか
はーい、クリック!
 〈 CDialog クラス メンバ〉というタイトル。その下に並ぶ単語。
これって……メンバ関数?
そう。とりあえずなんか見てみれば?
 Create を選ぶ。CDialog::Create というタイトルのページが表示され、
前に見た MessageBox() の時のような、引数や戻り値の説明が書かれてい
る。
でも読んでも分かんない……他の見よっと。〈戻る〉でメンバ関数一覧に
来て……あれ? なんでメンバ関数一覧に MessageBox() がないの?
それは CDialog のメンバ関数じゃないから
へ?
もひとつ戻ってみて
 CDialog の解説のページだよね
そう。このページの最初に、こんなふうに書かれてるでしょ

CObject
  CCmdTarget
    CWnd
      CDialog

うん。なんなのこれ
たとえば下ふたつは、こういうふうになってるってこと

class CDialog : public CWnd

あれ? さっきのと比べてみると……

class CCalcDlg : public CDialog

も、もしかして……
つまり、CDialog は CWnd のメンバ関数が使えるってこと
で、さらに CWnd は CCmdTarget のが使えて、 CCmdTarget は CObject 
のが使えて、……で、 CCalcDlg はそれまでのがぜーんぶ使えるってことな
の?
そういうことなのです
……なんか嫌な予感するんだけど……
それは的中するでしょう。今のページの下の方に、〈基本クラス〉ってい
うののリンクがあるでしょ
 public のあとのクラスを、基本クラスってゆーのね。ってことは CWnd 
クラスなんだ
 【基本クラス】をクリックすると、

CWnd

CObject
  CCmdTarget
    CWnd

で、メンバ関数っと
 下の【クラス メンバ】をクリックする。CWnd クラス メンバのペー
ジに表示される、膨大なメンバ関数!
ああああああ……
大丈夫だって、別にこれ全部憶える必要なんてないんだから
ホント?
少なくとも僕は憶えてない
おじいちゃんが言ってた。〈少なくても僕は〉とかって言い回し、信用さ
れてる人なら決め台詞だけど、そうでないんなら〈あーそれで?〉ってだけ
だって
うっ
ま、いーけどねー……あ、 MessageBox() あった
このメンバ関数を呼び出してたってことだね
ふーん
ちなみに……この一番下に〈階層図〉っていうリンクがあるでしょ
ぽちっと。げげ!
 階層図 Microsoft Foundation Class ライブラリというタイトルの下
に、たくさんのクラスがツリー形式で書かれている。
も、もしかしてこれ全部クラス!?
そういうこと。下の方にあるクラスは、上にたどっていく途中のすべての
クラスのメンバ関数を使えるってわけ
クラクラきちゃう……
さて、こんなふうに関数やクラスをまとめたものを〈ライブラリ〉ってい
います
らいぶらり、って図書館って意味の?
そうそう。プログラムの図書館って感じかな。火美ちゃんのプログラムは、
この Microsoft Foundation Class っていうライブラリのクラスとか関数、
つまり CDialog や TRACE() を使わせてもらってたわけだ
そういえば、前に〈いろんなサポートがあって、プログラムは作られてる〉
なんてこと言ってたもんね
で、 Microsoft Foundation Class 略してMFC
えむえふしー、ね
このライブラリは、ウィンドウズ用のプログラムを作るための、一番有名
でよく使われてるライブラリ
へ〜
 Foundation 、つまり〈基礎〉になるクラスが集まってるってことだね
そのMFCってゆーのの手助けを借りて、プログラムは作られてるってこ
となのね〜
そういうことになるね。当面は、このMFCの使い方に慣れることが、プ
ログラミング上達の近道になるかな
ってことはやっぱ憶えるんじゃないの?
当面は、だから。少ししたらMFCから離れるから
どういうこと?
そのまえに、このプログラム、試してみて

void Test()
{
    ::MessageBox( NULL, "あいうえお", "かきくけこ", MB_OK );
}

void CCalcDlg::OnBEqual() 
{
    Test();
}

なに言ってるの、MessageBox() は CWnd ってクラスのメンバ関数なんで
しょ? 全然関係ない Test() 関数から呼び出せるわけが……あれ? ビル
ド成功しちゃったよ?
さらにこれ

void CCalcDlg::Test()
{
    MessageBox( "あいうえお" );   // ここにブレークポイント。
}

 MessageBox() の行にブレークポイントをセットして、中に入ってみて
えっと、手のひらマークで赤丸付けて、実行、ここで止まったら……
中カッコの中に入る、みたいなアイコン
 をクリックすると、 CWnd::MessageBox() が表示される。
あ、これが MessageBox() の定義、なんだよね。前に一度見てるけど、今
度はちゃんと CWnd のメンバ関数なんだって分かるね
上達してるってことだよ?
……まあ、ね……。で?
照れてる照れてる。で、この3行目に、こんなのがあるでしょ

int nResult = ::MessageBox(GetSafeHwnd(), lpszText, lpszCaption, nType);

あ、また MessageBox() だ……ん?
なんか分かる?
えっとまずねー、この ::MessageBox() っての、引数の数が違うじゃん。
それに、もしこれが CWnd::MessageBox() のと同じだったら、なんどもなん
ども自分を呼ぶわけだから、とまんなくなっちゃって……
うんうん
あとさっきのと比べると……たぶんメンバ関数じゃない、普通の関数で、
::MessageBox() っていうのがあるんじゃない?
そういうこと! やっぱ上達してるよ!
やっぱしやっぱし?
じゃあまず、 MessageBox() をダブルクリックしてF1
はーい
 該当するトピックダイアログが表示される。
このまえは CWnd::MessageBox() を選んだけど、今度は、タイトルが
〈 MessageBox 〉、場所が〈プラットフォーム SDK〉を選んで
ぷらっとふぉーむえすでぃーけー、っと
 MessageBox というタイトルのページが表示される。
あ、なんか違うページ
実は、これがホントの〈ダイアログを表示する関数〉なんです
??
というわけでつづく!

/*
    Preview Next Story!
*/
なんか、いよいよ核心に近づく感じ
盛り上げといてなんだけど……
げ! 次で……?
というわけで次回
< Version 2.14 いろんなライブラリ! >
なんか順序、変じゃない?
もともとそう言ってたし
開き直るし……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。