
/*
    KAB-studio.h
        　ＫＡＢ−ｓｔｕｄｉｏで先週更新した内容
        が格納されたヘッダーファイルです（笑）。

    (C)KAB-studio 1999 ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp

    送信日： 1999/11/22(Mon) No.033
    配信数： 3160（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/


/*                        今週の「どう？」                        */

『じゃ、次のお便り』

ずいぶん前から読んでたんですが、
火美ちゃん最高ーーーーー
素晴らしいキャラクターです。（ツボですね）
これからも火美ちゃんのキャラクターを壊さないように（オイ！）
頑張ってください。・・・変な感想ですいません。
こういう人間もいるんです。

『あたしみたいなののどこがいーんだか』
「自分で言ってどーすんの。でもホント、火美ちゃんのどこがいいんだろう」
『なんやとコラ、ケンカ売っとんのかコラ』
「って自分で言ったんじゃないか〜。よくそんな言葉づかいで人気出るね」
『これがいいんじゃない？』
「そうかな〜」
『それか、表紙に出てくるあたしのないすばでーに魅了されたか』
「皆さんの KAB-studio.h や #pragma twice についてのご意見ご希望ご感
想をお寄せください」
『コラー！！』
http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/Impression/
「のページで送ってくださいね」
『お、お待ちしてますぅ……』


/*              １９９９年１１月２２日（月）の更新                */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・更新やっぱなし。
　時間ねー！（爆）


/*                        チョー普通な日記                        */
http://www2.justnet.ne.jp/~kabstudio/nikki2/

１９９９年１１月１４日（日）：
　昔々その昔、「超光戦士シャンゼリオン」とゆー素晴らしい番組があった
とさ。まる。

１９９９年１１月１５日（月）：
　人の「意識」に感染するものも一種の「ウィルス」なのかも、とゆー話。

１９９９年１１月１６日（火）：
　ゲームしたり勉強したりアニメ見たりといつも通りの１日。たぶん。

１９９９年１１月１７日（水）：
　おうちでプログラミング。ガッコの計算機室でもコンパイルしなきゃいけ
ないから大変なのよとゆー話。

１９９９年１１月１８日（木）：
　先週はおいしいカレー屋さん。今週はラーメン屋。やはり食ですよね。

１９９９年１１月１９日（金）：
　今日は学際休み〜。しかーし勉強やら１２月表紙やらでなかなか忙しい感
じです。ふぅ。

１９９９年１１月２０日（土）：
　そして１２月表紙の背景完成。今回はいい感じにできそうです。たぶん。


/*                       #pragma twice                            */


　Version 3.8
ＭＦＣとハンドル


「今回は重要だからしっかり聞くようにねー」
『応！！』
「……えっと、まずこれまでをまとめてみましょう。最初はハンドル」
『ウィンドウのとかアイコンのとかあるんだよね』
「そう。ウィンドウもアイコンも、基本的に〈ウィンドウズのもの〉だから、
直接変数として持つことはできなくて、代わりに〈ハンドル〉を使ったんだ
よね」
『そう、HWND とかの変数をＡＰＩに渡したりするんだよね』
「で、ハンドルはとりあえず置いといて」
『おいといて』
「今度はクラスについて考えてみましょう」
『クラスは int や HWND とかと同じ〈型〉ってので、変数を作るもの』
「そうそう。で？」
『えっと、メンバ関数ってゆー関数を持ってて、あとメンバ変数って変数も
持ってるんだよね』
「そんな感じかな。メンバ関数の中から、同じクラスのメンバ変数を使うこ
とができるんだったよね」
『それがこの前したのだよね』
「で、ここでさっきの〈ハンドル〉と組み合わせて考えてみると」
『みると？』
「SetWindow() って関数、憶えてる？」
『ウィンドウの名前変えるの！』
「そう。これのＡＰＩの方は、Ver 3.5（ No.30 ）で見たように……」

void CCalcDlg::OnBEqual() 
{
    HWND hWnd;
    hWnd = GetSafeHwnd();
    ::SetWindowText( hWnd, "あいうえお" );
}

「みたいに呼び出したよね」
『で、ＭＦＣはVer 3.2（ No.27 ）でやったよーに』

void CCalcDlg::OnBEqual() 
{
    SetWindowText( "あいうえお" );
}

『って感じ？』
「そんな感じ。ＭＦＣの方は CWnd のメンバ関数 CWnd::SetWindowText() 
を呼び出してるわけだけど」
『やっぱ違いは、ウィンドウハンドルを渡すか渡さないかよねー』
「そう、ここが注目点。というわけで、今のＭＦＣの方のプログラムを書い
て」
『下の方のね。コピー＆ペーストっと』
「そしたら CWnd::SetWindowText() を呼び出してる行にブレークポイント
をセットして」
『あ、中に入るんだ。この行クリックして、ツールバーの手のひらボタンを
押して、あ、左っかわに丸が出た』
「じゃ、ビルドして実行して【＝ボタン】押して」
『ビルドして……ビルド終了、実行してボタン押して、うん、今の行で止ま
ったよ』
「ここまでの手順が分かんないって人は Ver 2.5（ No.16 ）を見てくださ
いね」
『見てくださーい。で、中にはいるんでしょ？』
「そ。ツールバーから【中カッコに入る】ボタンを押して」
『押すと、CWnd::SetWindowText() の中身に行って……』

（以下 ＭＦＣより引用）
void CWnd::SetWindowText(LPCTSTR lpszString)
{
    ASSERT(::IsWindow(m_hWnd));

    if (m_pCtrlSite == NULL)
        ::SetWindowText(m_hWnd, lpszString);
    else
        m_pCtrlSite->SetWindowText(lpszString);
}
（引用 ここまで）

『そうそう、ＭＦＣの中で同じ名前のＡＰＩを読んでるんだよね……あ！』
「ん？」
『……なんか術中にはまってるみたいでやだなー』
「何を今さら」
『うー。よーするにこの m_hWnd ってのが注目点ってことねー』
「そ。この関数の中にない変数、ってことは？」
『CWnd のメンバ変数ってこと？』
「そういうこと！　ＡＰＩを呼び出したときは、ウィンドウハンドルを渡し
てました。で、ＭＦＣのを呼び出したときに渡さなくてよかったのは」
『代わりに CWnd が渡してくれてたからってこと、か』
「この辺を徹底的に調べておこうか。まずこのプログラム書いて」

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

『あ、もしかして GetSafeHwnd() に入るってこと？』
「そういうこと」
『じゃ、これ書いて、ブレークポイント付けて、ビルドして実行してボタン
押して、止まったから中カッコの中ボタンっと』

（以下 ＭＦＣより引用）
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
    { return this == NULL ? NULL : m_hWnd; }
（引用 ここまで）

『？？』
「これは分かりやすく書き直すとこうかな」

HWND CWnd::GetSafeHwnd() const
{
    return m_hWnd;
}

『ホントにぃ！？』
「う”、まぁかなりはしょっちゃったけどね。でも基本的にはこういうこと」
『CWnd::GetSafeHwnd() からもらってたウィンドウハンドルは、こんなふう
に CWnd の m_hWnd ってメンバ変数をもらってただけってことなのねー』
「だから、ＡＰＩを呼び出したときも、ＭＦＣを使ったときも同じってこと
だね」
『あ、そういえばそうかも』
「とどめに CWnd のクラスの中を見て、m_hWnd があるかチェックしておき
ましょう」
『って、 CWnd のクラスって、つまり class CWnd とかって書かれてるとこ
ってことでしょ。それ見つけろって言うの？』
「じゃ、全文検索を使ってみようか」
『ぜんぶんけんさく？』
「プログラミングしていくといろんなところにいろんなプログラムが散っちゃ
うから、その中から欲しいプログラムを探すための機能がちゃんと付いてい
るわけ」
『あ、そういえばそんなこと前に言ってたね』
「えっと、まずメニューの【編集】−【ファイルから検索】」
　【ファイルから検索】ダイアログが表示される。
『この前のフツーの検索に似てるね』
「使い方は似てるかな。まず【検索文字列】は【class CWnd】にして」
『なんかそのまんまね』
「ま、見つからなかったら変えて検索し直せばいいし。あと【検索するフォ
ルダ】をセットして」
『……って、これが分かんないって話じゃなかったっけ？』
「そういえばそうかも。ま、たいがいは」

C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\MFC

「のフォルダにＭＦＣのファイルがあるから、これにすればいいかな」
『なかったら？』
「自分でインストールしたんだったら、ＶＣのある場所は分かると思うから、
あとはその辺を手当たり次第調べるとか。それと、インストールした時の設
定で〈ＣＤ−ＲＯＭに置いておく〉を選んだときにはＣＤ−ＲＯＭにある場
合もあるかも」
『なんかあいまいねー』
「ま、確実なのはウィンドウズの検索ダイアログで *.cpp ってファイルを
全ドライブから検索することかな。VC98\MFC ってフォルダが見つかったら
それがそうってことで」
『やっぱあいまいねー』
「実際そうかも。ホントのことを言えば、この辺は〈もちろん知ってるよ〉
ってくらいが一番いいんだけどね」
『なんで？』
「それはまたあとで。さ、検索しちゃおう！」
『おー！　【検索フォルダ】をさっきのにして、検索！』
　アウトプットウィンドウが開き、次のように表示される。

'class CWnd' を検索中...
c:\（略）\MFC\Include\AFXCMN.H(680):    friend class CWnd;
c:\（略）\MFC\Include\AFXSTAT_.H(169):class CWnd;
c:\（略）\MFC\Include\AFXWIN.H(86):        class CWnd;
c:\（略）\MFC\Include\AFXWIN.H(1899):class CWnd : public CCmdTarget
c:\P（略）\MFC\Include\AFXWIN.H(3273):    friend class CWnd;
5 個、検索されました。

『だって。どれ？』
「最後にセミコロンが付いてないの。付いてないってことは、そのあとにク
ラスの中身があるってことでしょ」
『あ、そっか。えっと【ファイル】−』
「ちょっと待った！　ダブルクリックするだけでファイルを開けるから」
『ダブルクリックって、どこを？』
「この検索結果。だから……」

c:\（略）\MFC\Include\AFXWIN.H(1899):class CWnd : public CCmdTarget

「って書かれてる行をダブルクリックするだけでいいわけ」
『へー。よく考えてみると、この仕組みとか、全文検索とか、かなり便利よ
ね……ま、それはともかくダブルクリック！』
　AFXWIN.H が開き、その中程が表示される。

（以下 ＭＦＣより引用）
class CWnd : public CCmdTarget
{
    DECLARE_DYNCREATE(CWnd)
protected:
    static const MSG* PASCAL GetCurrentMessage();

// Attributes
public:
    HWND m_hWnd;            // must be first data member
// （以下略）
（引用 ここまで）

『あ、この HWND m_hWnd; がさっき使ったメンバ変数だよね！』
「そういうこと。ちゃーんと CWnd の中にあったでしょ」
『うん、あったあった！』
「ＭＦＣを理解する１番の近道は、こうやって中身を見ること」
『それってもしかしてさっきの話？』
「そうそう。ＭＦＣが勝手にしてくれてる、じゃなくて、どんなふうになっ
てるのか見ることで、プログラミングの理解が進むわけ」
『あれほど〈ＭＦＣはダメ！〉とか言っといて？』
「ギク、まぁとりあえず一番手っ取り早いし、反面教師ってのもあるし〜」
『ふーん』
「で、ホントは、僕があれこれ言う前に自分で勝手にこういうところ見て欲
しいかなー」
『好奇心旺盛であれ！　みたいな？』
「そういうこと！！　もちろんＭＦＣだけじゃなく、いろんなライブラリを
見るのが一番だけどね」


/*
    Preview Next Story!
*/
『いろんなライブラリって、どんなのがあるの？』
「まー、実際のところＭＦＣほど広まってるのは少ないんだよね」
『つまり他のライブラリは勉強するの難しいってこと？』
「爆発的に広まる気配はあるけどね」
『というわけで次回』
＜ Version 3.9 ラッパークラス！ ＞
「につづく！！」
『そーゆーんが、ＭＦＣから勉強する理由ってこと？』
「ＭＦＣだってライブラリのひとつ、こんくらい軽くこなせなきゃね」
『はっ、オチがない！！』
「なくたっていいやん……」



/*            １９９９年１１月２９日（月）の更新予定              */
http://www2.justnet.ne.jp/~kabstudio/Info/News/

・更新きっとなし。
　ちょうど学園祭の休み明けに当たるんですが、どーも更新は無理っぽいで
す（泣）。色々予定してたんだが……やっぱ実験は手強かった（泣）。と
ゆーわけで１２月中旬まで待ってね。


/*                          ご注意！！                            */

・このメールを返信しないでください。
・感想はこのページから送ってください。
http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/Impression/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www2.justnet.ne.jp/~kabstudio/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

    (C)KAB-studio 1999 ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp
*/


/*                      See you next week!!                      */


