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

    KAB-studio.h


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

    送信日： 2002/08/12(Mon) No.170
    配信数： 3660 ( 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/08/04 (Sun)
　日曜だけどお仕事。朝はアプリがバグって困る。お昼からお仕事。テスト
中心。 SQL って奥が深い。休出して貯金。 Kanon プレステ２番。佐祐理さ
んシナリオってあるよね……。

2002/08/05 (Mon)
　今日も１０時半まで。いろんな技術が必要って大変。ほとはー人気あって
うれしー。そしてほとはーのぐるぐる。あれはパプリカの髪の毛です。

2002/08/06 (Tue)
　体が残業モードに。 SQL あり JavaScript あり。どうしても遅寝に。ほ
とはーも CG Gallery もヒット数ががくっと……。

2002/08/07 (Wed)
　今日はちょっと早く。寝る前にほとはー禁止。お仕事はテスト中心。加え
て SQL*Plus のカスタマイズ。帰りにビデオテープ購入。金曜と来週月曜の
複雑な事情。どうするー？

2002/08/08 (Thu)
　テストして修正して。明日とかの複雑な事情の解決法。 GBA と F-ZERO 
購入。明日は遅く行けばいいからゆっくりしましょ。

2002/08/09 (Fri)
　派遣先は休みだけど、午前休扱いで午後から出社。疲れた……。飲みに行
くって話も。が、ぽしゃった……。

2002/08/10 (Sat)
　書いてるの日曜お昼の１２時。昨日は６時半まで仕事して、そのあと新宿
で飲み。愚痴聞き大会。朝の６時半に戻ってきて、寝て、って感じ。あとで
会社行きます……。


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

■　第四章　ふたりの勇者　−１６−

「で、えけぇ……」
　ツインローターの大型ヘリの下に、ワイヤで吊された獣がいた。いや、そ
れは「動物」という範疇のものではなかった。雅樹からは背中しか見えない
が、体全体を真黒い毛が被い、所々にこれまた黒い甲羅のような物が生えて
いる。
　遠くでヘリが旋回する。ワイヤが切られ、音もなくＬＷ−９７が降りる。
畑を踏み抜き、土煙が上がり、そして地響きが聞こえる。車も揺れた。
「行って来る！！」
「えっ！？」
　驚いたのは洋一だった。リシュネは大きく跳ね上がり、さらに空を真横に
蹴り飛ばし、ＬＷ−９７へと向かっていく。
「僕はどうすればいい？」
　洋一は思案し、指示する。
「リシュネのフォロー頼む。俺はこのまま帰る。なんならリシュネを連れ帰
して、あいつは放っておいてもいい」
　返事をせずに少年は車を飛び出す。雅樹はその移動を追っていく。とんで
もない速さだった。
「とりあえず、俺達は走ってる車から降りるなんて真似できないな……」
　つい先ほど完勝した気分はすでに失せていた。舞はどう行動すべきなのか
考えあぐねたまま、何もできないでいた。
「ふたりとも無事連れ帰るつもりだが、戦える準備だけは」
　フロントガラスにひびが入り、屋根を銃弾が跳ねる。ガードレールを擦
り、岩肌に正面から突っ込んで車が止まる。エアバッグが開き洋一がそれに
突っ込む。後ろでは雅樹が舞を抱きかかえ、車内を跳ねていた。
「くっ！！」
「きゃぁっ！！」
　車はおもちゃのようにバウンドし、外装がひしゃげた。洋一は一瞬もうろ
うとしたあと周りを見回したが、ガラスがすべて蜘蛛の巣状になっていた。
おはるさんが心配そうに見上げる。
「後続はどうなってる……？　ま、待っていればリシュネが来て……あっ」
　洋一が止める間もなく雅樹が車外へと出る。舞もそれについていく。
「戻れ！！　車の中の方が安全だ！！」
　と言いながら、洋一は邪悪な笑みを浮かべていた。あのふたりの力を見る
ことができる、先ほどとは違った形の――特にあの男の特殊な能力を見られ
るかもしれない――洋一は隠れるようにして車外へと出た。まだ後続は来て
いなかった。戦場ではリシュネがこちらに向かってきているのが見えた。
　雅樹ははた目からはとても不用心に見えた。道路の真ん中でのんびりと構
えているだけだった。そして、不意に大声を出す。
「そんな所でこそこそ狙ってるんじゃねぇよ！！」
　雅樹は木々の茂る山へと見上げ、睨み付けた。
「まさか、ばれるとはね……」
　ハンドガンを構え、迷彩服に身を包んだ男が出てくる。雅樹はあの時の男
だと確信した。
「銃……」
　舞は心音を強く感じていた。先ほどのディルトとの戦いはうまくいった。
けれども、それは相手の攻撃を封じられたからだ。今のこの状況では、それ
は不可能に近い。
　なのに……この目の前の男の自身は何？　不老不死という言葉が浮かぶ。
それを確かめたくはない。けれども……。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『……そこまでして毎週更新にこだわるもんかなー』
「ま、リピーター作りは重要ってことだろうね」
『でもさ、時々更新の方が、気になって何度も見に行ったりしない？』
「う”……確かにそういうのもあるけど……」
『だったらどっちでも関係ないんじゃないの？』
「それは違うような気がする……」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 9.09
ツールバーを使ってみよう！

「今回はツールバーについて見てみます」
『おー』
「ツールバーはメニューの下にある横棒。だけど……えっと、 
Version 9.01 ( No.162 ) の時みたいに Spy++ を起動して、ツールバーに
照準合わせてみて」
『ほいほい。２重なんだよね』
「そう、そこがポイント。【ウィンドウクラス】って憶えてる？」
『 Version 5.23 ( No.088 ) でやったね』
「このウィンドウクラス名を見ると、ウィンドウの素性がだいたい判るんで
す」
『え、そうなの？』
「たとえば、ダイアログコントロールなんかはウィンドウズが提供してくれ
るものだから、あらかじめ全部ウィンドウクラス名が決まってます」
『ボタンが BUTTON とか？』
「そうそう、それ。 MSDN の CreateWindow() のページに書いてあるから一
通り見てみて」
『たいがいのコントロールはちゃんとあるんだね』
「もし他のアプリで〈あれ、このコントロール、動きが変〉とか思ってウィ
ンドウクラス名を調べてみたら標準のコントロールじゃなかった、っていう
ことは結構多いよ」
『そういう意味で素性が判るってわけね』
「そゆこと。というわけで、コントロールバーに照準を合わせて、
【ウィンドウ検索】ダイアログの【クラス】の所を見てみて」
『えっと、外側のが AfxControlBar42d で、内側のが ToolbarWindow32 だ
ね』
「まず、本当のツールバーは内側の ToolbarWindow32 の方」
『本当？』
「つまりこれが、ウィンドウズが用意してくれてるツールバー」
『あー、ツールバーもウィンドウズが用意してくれてるんだ』
「で、外側の AfxControlBar42d は、 MFC が作ったウィンドウ」
『これはウィンドウズのじゃないんだねー』
「そう。だから、 MFC が作ったウィンドウの上に、ウィンドウズのツール
バーが乗ってるって感じかな」
『フレームウィンドウの上にビューウィンドウが乗ってるみたい』
「それに近いかも。ちなみに Afx っていうのは MFC の印だと思って」
『あ！　そういえば Afx ってよく出てきたねー』
「 MFC のマクロや関数の頭に付いてるからね。こういうとこを見れば素性
が判るってこと」
『でもそれを知らないと判らないじゃん』
「だから今憶えて」
『んー』
「さて、今ので判ったように、ツールバー自体はウィンドウズが提供してく
れてるものです」
『例によって、 MFC でも使えるし、 API だけでも使えるって事ね』
「そゆこと。ま、その辺を踏まえつつ、実際に使ってみます」
『ってゆーか、最初から表示されてるよね』
「うん。これは CMainFrame::OnCreate() の中で」

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// 略。
    // 注：横幅を短くするために改行しています。
    if    ( !m_wndToolBar.CreateEx
            ( this
            , TBSTYLE_FLAT
            , WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER
                | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC
            ) 
            ||
            !m_wndToolBar.LoadToolBar( IDR_MAINFRAME )
        )
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // 作成に失敗
    }

// 略
}

「ってしてるでしょ。ここでツールバーを作ってます」
『確かに CreateEx() ってなんか作ってる感じ……だけどちょっと複雑ね』
「これは悪いプログラムの書き方かも。まず if を取ると」

         !m_wndToolBar.CreateEx
            ( this
            , TBSTYLE_FLAT
            , WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER
                | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC
            ) 
            ||
            !m_wndToolBar.LoadToolBar( IDR_MAINFRAME )

『んーと、小カッコがこうだから……』

         !m_wndToolBar.CreateEx
            ( this
            , TBSTYLE_FLAT
            , WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER
                | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC
            ) 

『と』

            !m_wndToolBar.LoadToolBar( IDR_MAINFRAME )

『に分かれてるんだよね』
「そう、それを || で継ないでるだけ」
『 || って、どっちかが 0 以外なら 0 以外になるんだよね』
「そうそう。 Version 6.10 ( No.110 ) を参照ってことで、でもここでは 
! が付いてるから」
『な、なんか複雑……』
「まず最初の m_wndToolBar.CreateEx() を呼んでるところから」
『 m_ ってことはメンバ変数なんだね』
「そう、 m_wndToolBar は CMainFrame のメンバ変数。 MainFrame.h の方
を見れば分かるからあとで見ておいて」
『はーい』
「この m_wndToolBar は CToolBar 型」
『まさにツールバーって感じね』
「で、 CToolBar::CreateEx() でツールバーを作ります。それが最初の部
分」
『 this って……なんだっけ、自分自身のポインタとかなんとかなんだよ
ね』
「やっぱ this って難しいかもね……今呼ばれてる 
CMainFrame::OnCreate() ってメンバ関数も、どこかで 
m_wndToolBar.CreateEx() みたいな感じに呼ばれてるはず」
『はずよね』
「その m_wndToolBar にあたる変数があるわけでしょ。そのポインタ」
『……まだよく分かんない』
「だね……これは後でちゃーんと説明するから、それまでは。あ！」
『な、なに？』
「んー、ちょっと間違った説明の仕方かもしれないけど、 
CToolBar::CreateEx() の第１引数にはツールバーを置くウィンドウのポイ
ンタを渡す必要があるんです」
『ツールバーを置くウィンドウ、つまりフレームウィンドウ……あー、って
ことは CMainFrame のポインタを渡すわけだから』
「だから this 」
『だまされてる気がする……』
「うん、ちょっと間違ってる部分もあるし、今のところはそのくらいって事
で」
『えっと、２番目の引数は、なんかのフラグみたいだけど』
「これはツールバーのスタイルを決めるフラグ」
『あれ？　でも３番目の引数もそんな感じっぽいけど』
「うん、こっちもスタイル。ものすごく分かりにくいんだけど……第２引数
のは本当のツールバーにだけ渡したいスタイル、第３引数はツールバー全体
にも渡したいスタイル、ってところかな」
『……なんかよくわかんないね』
「僕も分からない」
『何それ』
「一応関数の中を見ればそうらしいっていうのは分かるんだけどね。 MSDN 
の方には詳しく書かれてないし。ま、この辺はパスってことで」
『テキトーねー』
「で、次に」

            !m_wndToolBar.LoadToolBar( IDR_MAINFRAME )

「を呼んでます。この CToolBar::LoadToolBar() を呼ぶと、ツールバーを
実際に作ります」
『へ？　さっき作ったんじゃないの？』
「さっきはウィンドウとしてのツールバーだけ。ここでは、リソースの 
IDR_MAINFRAME からツールバーのボタンひとつひとつを読み込んで追加して
いるんです」
『あら、面倒そう』
「確かに。で、このふたつでツールバーは完成。めでたく表示されるという
わけです」
『あ、ちょっと試していい？』
「どうぞ」
『この部分をコメントアウトすると……げ！　エラーになっちゃった』
「 ASSERT() しちゃったね。これは、下の方に」

    // TODO: ツール バーをドッキング可能にしない場合は以下の３行を
    //       削除してください。
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);

「ってあるでしょ、こっちもコメントアウトしないとダメだから」
『あ、こっちもしたら大丈夫だね。うん、ツールバーないし』
「この部分でツールバーを実際にウィンドウにくっつけてるんです。で、
その時にツールバーが作られてないと」
『くっつけるものがないんだ』
「そゆこと。あ、ちなみに ASSERT() って憶えてる？」
『 Version 6.17 ( No.117 ) でやったね。あっちゃいけないのを網に掛け
るってゆーの。そっか！　ここだと、ツールバーが作られてないのにウィン
ドウにくっつけようとしたから！』
「そゆこと。つまりこの ASSERT() は〈まずツールバーを作って、そのあと
ウィンドウにくっつける〉っていう手順を守らせるためのものってこと」
『……でも今の ASSERT() だけでそれってわかるもん？』
「うーん、ちょっと難しいかもね……」
『あ、あとひとつ質問！　さっきの if の ! とか || とかっていまいち分
かんないんだけど』
「そうだねそれはちゃんとやっておこうか。さっきのをはしょって書くと」

    if    ( 
            !m_wndToolBar.CreateEx() 
            ||
            !m_wndToolBar.LoadToolBar()
        )

『だいぶはしょったね……』
「で、この if の中をひとつひとつ見ていきます。 CToolBar::CreateEx() 
は、作れたら 0 以外、作れなかったら 0 を返します」
『それが ! で逆になるんだから、 作れたら 0 、作れなかったら 0 以外
ね』
「で、次の CToolBar::LoadToolBar() も、うまくいったら 0 以外、ダメ
だったら 0 」
『これも逆になるから、うまくいったら 0 、ダメだったら 0 以外ね』
「 || は〈どっちかが 0 以外なら 0 以外、両方とも 0 の時だけ 0 〉だか
ら」
『えっと……あ、両方うまくいった時だけ 0 になるんだね』
「言い換えるとどっちかがダメだったら 0 以外。で、 if の中に入って 
return しちゃうから、ダイアログは作られません」
『ほー。つまりツールバーがちゃんと作られてるかどうか調べてるのね』
「でも実は CToolBar::CreateEx() がエラーだと CToolBar::LoadToolBar() 
は呼ばれないんだけどね」
『え？　なんで？？』
「というわけで次回に続く！」

/*
    Preview Next Story!
*/
『なんかここ最近、いろんな話が出てくるね』
「そうだね、文法的なこととかウィンドウズのこととか」
『まとめて教えた方がいくない？』
「火美ちゃんは API かたっぱしから教わりたい？」
『それなんかヤダ』
「というわけで次回」
＜ Version 9.10 ショートサーキット ＞
『につづく！』
「飽きないためにもいろんなことを少しずつ、ってことで」
『にしても話が飛びすぎのよーな……』


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

・ KAB-studio.h 縮刷版更新
　１７０号に達したので KAB-studio.h と #pragma twice の縮刷版を更新
します。


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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
*/
////////////////////////////////////////////////////////////////////

