////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2002 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2002/03/18(Mon) No.149
    配信数： 3750 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００２年３月１８日（月）の更新                */
http://www.kab-studio.com/

・　皆さん、お待たせしました！
　三人合体ホットハーブに１話追加しました。今回は謎の少女登場。そして
その少女の足が……。
[ 三人合体ホットハーブ ]
http://www.kab-studio.com/Comic/HotHerb/


////////////////////////////////////////////////////////////////////
/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2002/03/10 (Sun)
　疲れが時間差で襲ってきた感じ。３時間昼寝したり。新しく発見したソバ
屋はあんま。テレビはちゃんとＮスペ見てますよー。

2002/03/11 (Mon)
　会社で死ぬほど眠かった。へにょへにょ。テストはいい感じだけど。晩ご
飯は介一家のラーメン。猫に逢う幸せ……。

2002/03/12 (Tue)
　資料作り＆客先インタビュー＆客先作業。 ini ファイルでの設定の代わ
りってなんかあるん？　マハラジャのカレーは美味しいけど高い。ジョイス
ティックが壊れつつある……。

2002/03/13 (Wed)
　今日も死ぬほど眠かった。なぜなら昨日３時に寝たから(爆)。寝る前にウ
イイレ禁止……。難しいし〜。やっとイヌっネコっジャンプ！４巻購入。旋
風の用心棒、１０分欠ける……。

2002/03/14 (Thu)
　詳細設計書に doxygen 活躍しそう。コーディングスタイルと合うのもポ
イント高し。客先ではボケたことに気付く。気が回らない……。モスのタン
ドリーチキンバーガーは結構いけるかも。高いけど。唐突にゲンフー攻略。
クリティカル命ですよ？

2002/03/15 (Fri)
　詳細設計書書いてテスト仕様書書いて客先作業して。天ぷら美味しい。
やっぱおねてぃいい感じだ〜。最終回に有休取りたい(爆)。他の理由もある
けど。花粉症対策には甜茶ですな。

2002/03/16 (Sat)
　朝はのんびり。昨日３時まで起きてたんで。午後から会社。やってもやっ
ても減らない……。 CppUnit って VC5 じゃ使えない？　技術者はイチロー
にならない？


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.com/Novel/Fuga/

■　第三章　きもち　−１２−

「その闇とやらがなんなのかも、私達がどういう理由で勝てるのかも判らな
いけど、とりあえずそんなものよりも、あの化け物と一緒にいる少年少女、
が当面の問題かな」
　と、舞はできるだけ自然な感じで話題を振った。
「この前の時のことは憶えているな？　敵は二グループいた」
「舞さんを撃とうとした方と、子供達の方と」
「んとだな……」
　と、誠十郎は手帳を取り出してめくった。
「ひとつはだな、この前のトラックから割り出そうとしたんだが……まだ
判ってないな。もうひとつの方は情報がかなりあったもんでな……これだ」
　誠十郎はにやりと笑った。
「ファインダウト社。外資系企業、海外から電子部品や化学薬品を輸入して
いる会社らしい」
「普通の会社ですか？」
「いや、かなりやばそうな……解りやすく説明すれば、とても棘のある、周
りを寄せ付けない雰囲気の企業だな。やってるこた、普通といえば普通だ
が」
「ん……解りました。今日はありがとうございます」
　と、舞は唐突に立ち上がって、礼をした。俊雄と誠十郎はいきなりで驚い
ていた。気づけば、外はもう真っ暗だった。
「また今度、お願いしますね」
　そう、体をくの字に曲げたまま、顔を上げてそうにっこり言った。
「あ、ああ……」
「じゃ。木村君、行こ？」
　舞はそう言って、バッグとレシートを持って出口へと歩いていった。あっ
けにとられていた俊雄も、そのあとを追おうとした。
「おい」
　席を離れようとした俊雄を、誠十郎は引き留めた。怪訝そうな顔を向ける
が、誠十郎の表情は真面目だった。
「おまえ、あいつに惚れてるのか？」
「そ、それは……」
「あいつには関わるんじゃない」
　誠十郎の口調は強かった。真剣な警告だった。
「俺は、彼女にあいつと同じものを感じた。俺が今日、おとなしく話して
やったのは……」
　その表情は、まさに苦々しそうに見えた。
「怖かったからだ。朴と同じ、とてつもない力を持っているからだ」
　その言葉を聞いて、俊雄はふっと会計を済ませている舞を見て。そして、
優しく笑んだ。
「いえ」
　誠十郎は顔を上げた。
「舞さんは、ごくごく普通の女の子ですよ」
　そう言って、俊雄はその場を立ち去った。ふたりの後ろ姿を見ながら、誠
十郎は、判っちゃいないなぁと思いながらも、うらやましいとも感じてい
た。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『次の水曜は Java メルマガの日！』
「次は〈第１４回  セマンティクスにこだわる〉です」
『何、セマンティクスって？』
「〈意味〉っていう意味」
『いみってゆーいみ？』
「格好いいことを言えば、コードにはプログラマーの気持ちがこもってる」
『格闘家が拳と拳で語り合うみたいな？』
「似てなくもないかも」
『今のあたしには無機質なプログラムって感じにしか見えないけど』
「その一線を超えるか超えないかが」
『超えるか超えないかが？』
「……」
『？』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 8.07
ダイアログを作ろう！

「前回はリソーススクリプトを作ってみました」
『作ったってほどじゃないけどねー』
「で、そのリソースを作った理由は？」
『ダイアログを作る！』
「そう、ダイアログを表示するためには、まずリソースにダイアログを作ら
なきゃいけないからね」
『……なんかそのふたつダイアログって出てくるとわかんない……』
「んー、そうだね、〈ウィンドウとしてのダイアログ〉を作るためには、ま
ず〈リソースとしてのダイアログ〉を作る必要がある、ってとこかな」
『リソースのダイアログが元になって、普通のダイアログができるってこと
ね』
「そゆこと。じゃ、まずはコードを見てもらおうか」

#include <Windows.h>
#include <stdio.h>

// リソースをインクルードします。
#include "resource.h"

// ダイアログプロシージャ。
BOOL CALLBACK DialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    return FALSE;
}

// WinMain() 。
int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    int iRet
        = DialogBox
            ( p_hInstance
            , MAKEINTRESOURCE( IDD_MAIN )
            , NULL
            , DialogProc
            );

    return 0;
}

『うお、ちょっと長い！　関数がふたつになったね。ひとつは前と同じ 
WinMain() だけど』
「関数ひとつひとつも、改行多くしてあるだけで」
『中身はかなりシンプルね……』
「あ、とりあえず実行してみて」
『ほい実行。お、さっき作ったダイアログが表示された！』
「とういうわけで、こうすればダイアログは表示できます。……表示はね」
『む、その思わせぶりな口調は何？』
「とりあえず閉じて」
『ほい。……閉じねぇ！』
「そう、閉じないんです」
『 OK もキャンセルも、右上のペケボタンもタスクバーで閉じるもダメ！』
「 VC で【デバッグの中止】させるしかないかな」
『永久ループしたわけでもないのにこのボタン押すハメになるなんて……』
「そういうわけで、今の段階では表示するだけってこと」
『ってゆーか、ボタン押したら閉じるとかっていうのはデフォルトの機能
じゃないの？？』
「じゃないんです」
『 MFC 使わないとかなり面倒そうね……』
「じゃ、その面倒なのを見ていきましょう。まずは WinMain() から見てい
こうか」
『 DialogBox() って関数呼んでるね。まさにダイアログを表示する！　
って感じ』
「だね。抜き出してみると」

    int iRet
        = DialogBox
            ( p_hInstance
            , MAKEINTRESOURCE( IDD_MAIN )
            , NULL
            , DialogProc
            );

「この DialogBox() って API 、正確にはマクロがダイアログを表示しま
す」
『マクロなの？』
「うん、ほとんど同じ DialogBoxParam() って API を呼ぶだけだけどね。
英文の方のリファレンスを見ると書いてあるよ」
『うん、色々書いてある。ダイアログ閉じるには EndDialog() を使うと
か。これ使わないとダイアログは閉じないのねー』
「ただ呼ぶだけじゃダメだけどね」
『そなの？』
「そうなの。それはあとでね。まずは引数をひとつずつ見ていきましょう」
『第１引数はただのインスタンスハンドルね』
「これはいつものだね」
『第２引数は……マクロっぽいのと、ダイアログの ID 、ってことは、ここ
でどのダイアログリソースを使うかって指定してるんだ』
「そゆこと。 MAKEINTRESOURCE は昔と今との違いを吸収するためのマク
ロってとこかな」
『リファレンス見ると第２引数は LPCTSTR 、ってことはホントは文字列渡
すの？』
「なんだけど、今はホントに文字列を渡すことはないかな。この例みたいに 
MAKEINTRESOURCE 使ってリソース ID 渡すのが普通」
『第３引数は NULL だね』
「これは〈親ウィンドウ〉を指定するところ。元々のウィンドウがあって、
そのダイアログとして表示するときには」
『ここにその元々の方のウィンドウハンドルを渡せばいいわけね。でもこれ
はそういうのないから』
「 NULL にしておけば大丈夫」
『第４引数が……？？？　DialogProc って……上にある関数だよね』
「そう、これ」

// ダイアログプロシージャ。
BOOL CALLBACK DialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    return FALSE;
}

『つまり、この関数の戻り値を渡してるんだよね。でもそれならわざわざ関
数作る必要ないか』
「そう、それなら必要ないでしょ。そうじゃなくて、この第４引数は〈関数
そのもの〉を渡してるんです」
『？？？』
「関数そのものってのはおかしいか。どう進めようかな……そうだね、まず
MFC の時を思い出してみようか。 MFC の時、ボタンを押した時に呼ばれる
関数とかがあったでしょ」
『うん、イベントハンドラとかだよね』
「そうそう。 MFC を使わない場合、それと同じ機能を持っているのが
〈ウィンドウプロシージャ〉っていうものなんです」
『ウィンドウプロシージャ？　あ、上の関数に〈ダイアログプロシージャ〉
って書いてあるね』
「そうそう、ダイアログプロシージャはウィンドウプロシージャのダイアロ
グ版。ほとんど同じって思って」
『ってことは、この DialogProc() が、ボタンを押したときに呼ばれる？』
「そう、呼ばれます。それだけじゃなく、ウィンドウプロシージャはどーん
なイベントが起きたときでも呼ばれます」
『どんなイベント？』
「マウスがクリックされた、移動した、キー入力があった、ウィンドウが隠
れた」
『再描画の指示とかもあるよねー。む、 MFC はそれ全部別々の関数だった
けど、このウィンドウプロシージャはぜーんぶ送られてきちゃうの！？』
「そゆこと。もう少し説明すれば、 MFC もちゃんとウィンドウプロシー
ジャを持っていて、イベントに合わせてそれぞれの関数を呼び出すってこと
をしてるんです」
『だからイベント毎の関数、イベントハンドラがあったわけね』
「その辺はこれからに取っておくとして、第４引数の話」
『そうそう』
「今言ったように、ダイアログでイベントが起きた時にダイアログプロシー
ジャが呼ばれるわけだけど、そうしてもらうようにダイアログを作るときに
ウィンドウズに登録する必要があるんです」
『それがあの第４引数？』
「そゆこと。あの第４引数で、何かイベントが起きたら DialogProc() を呼
び出してくださいって登録してるんです」
『なるほどねー、第４引数で関数を渡してるっていうのはそういうことなの
ね』
「で、最後にどうやって登録してるかって話。ちょっとだけコード追加し
て」

// WinMain() 。
int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
// 以下３行追加。
    char pchFuncPointer[1024];
    sprintf( pchFuncPointer, "DialogProc : %x", DialogProc );
    MessageBox( NULL, pchFuncPointer, "WinMain()", MB_OK );
// あとはそのまま。

『むむむ？　何やってんの？』
「実は関数は、 () を付けないと〈関数のアドレス〉になるんです」
『関数のアドレス？』
「 Version 8.02 ( No.144 ) で言ったように、プログラムはメモリに置か
れてるわけでしょ」
『そっか、なら関数も置かれてる、関数のアドレスもある！』
「 DialogBox() の第４引数にもこれを渡してるでしょ。これを実際に見て
みようって話」
『ほいほい。まず実行。 DialogProc : 411005 って出た』
「次に DialogProc() の return 0; にブレークポイント」
『ほい』
「そしたら【混合モード】表示させて」
『あれ？　メモリじゃないの？』
「うん、今回は混合モードで。表示させたらダイアログ閉じて」
『ほい。ブレークポイントで止まった』
「混合モードで上の方へ遡っていって、アドレスが 00411005 のとこを見て
みて」
『ほい〜ってあれ？　 DialogProc() っぽいとこがあるけどそれはいい
の？』
「うん、それは無視してもっと上へ」
『ほいほい。あったよ。結構それらしい感じ』

00411005 E9 16 00 00 00       jmp         DialogProc (00411020)

「 jmp ってあるでしょ」
『ジャンプ？』
「そう！　これは右端の 00411020 ってアドレスに飛びなさいって命令」
『今度は下の方……あ、これがさっきの DialogProc() っぽいとこなん
だ！』
「整理すると、 DialogBox() の第４引数に DialogProc() のアドレス、
00411005 を渡すと、ウィンドウズは 00411005 を関数って見なして呼び出
します」
『イベントが起きたときにね』
「そうそう。で、このジャンプを経由して」
『実際の DialogProc() が呼ばれる！』
「そういうこと。ま、これだけじゃ分かんないとこもあるかもしれないけ
ど、とりあえずこんなところで」

/*
    Preview Next Story!
*/
『ってゆーか、これじゃあ引数渡すのとか理由付かないし』
「その辺はおいおいね」
『げ、そーゆーのも勉強しなきゃいけないの？』
「 C++ 使いはその辺も知ってなきゃいけないんだよねー」
『こーゆーメモリの話から』
「メッセージの処理の仕方まで」
『というわけで次回』
＜ Version 8.08 ダイアログプロシージャ ＞
「につづく！」
『なんてゆーか、憶えること多すぎ！』
「そうかなぁ」
『……このプログラミングバカは……』


////////////////////////////////////////////////////////////////////
/*                ２００２年３月２５日（月）の更新                */
http://www.kab-studio.com/

・更新なしの予定
　なんかいつものいいわけだけど、その次の週は表紙壁紙ってことで。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.com/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.com/Info/MailMagazine/

    (C)KAB-studio 1999 - 2002 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////

