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

    KAB-studio.h


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

    送信日： 2002/12/16(Mon) No.186
    配信数： 3450 ( 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/12/08 (Sun)
　１２月表紙壁紙。かなり苦労して、出来もあまり？　顔はうまく描けたけ
ど、それ以外が……。解像度が低いのがいけないのかなぁ。着色もあんま。
そのあとかぶヘッダー書いてへろへろ。「ほとはー」第４章。毎月恒例バッ
クアップ。こみパのすばるシナリオ。南さんて……。

2002/12/09 (Mon)
　雪。珍しい。 Java の「命名規則」をどうするか。 CG Gallery のヒット
数がいまいち高くない……。

2002/12/10 (Tue)
　てんてこまい。本プロジェクトに他のプロジェクトが平行して走っちゃっ
て。ボーナスはフォトショに消えそう。フィギュアって良くないの多い。
「守護月天」。灰羽連盟は引き続きいい感じ、でも最終回が近い。

2002/12/11 (Wed)
　秀丸の便利感高し。ウイイレ６ＦＥ、全然違うゲーム。すげぇ。明日買う
予定。「ＧＧＸＸ」と一緒に。すばるシナリオで光るちゃん様。

2002/12/12 (Thu)
　お仕事が忙しい。 Java って「シャローコピー」が簡単にできていい。昼
休みにウイイレ６ＦＥとＧＧＸＸを購入。 Kanon の特典ＣＤの申し込み。
あとはＤＶＤ売るか……。そして VC から Excel を操作する方法って？　 
COM まわりを調べるのがいいかも。

2002/12/13 (Fri)
　８時半までお仕事してから横浜へ。お仕事はあまりはかどらなかった。い
そがしすぎるんで Adobe Web Collection の購入はパス。

2002/12/14 (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 10.08
ウィンドウクラスとアトム

「今回は重要じゃないけど気を付けなきゃいけないことを紹介します」
『またそーゆー面倒そうなのを……』
「まぁね、しかも MFC 使ってるときには関係ないことだし」
『げ』
「で、今回はウィンドウクラスの話」
『そういえば Version 10.02 ( No.10.02 ) でなんか言ってたね』
「というわけで、まずはちょっとだけ修正してもらいます」

// ウィンドウクラスを登録します。
bool RegistWndClass
    ( const char *const p_pchWndClassName
    , HINSTANCE p_hInstance
    )
{
    // ウィンドウクラス登録用構造体。
    WNDCLASSEX stWndClassEx;
    stWndClassEx.cbSize = sizeof( stWndClassEx );
    stWndClassEx.style
        = CS_BYTEALIGNWINDOW | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
    stWndClassEx.lpfnWndProc = WndProc;
    stWndClassEx.cbClsExtra = 0;
    stWndClassEx.cbWndExtra = 0;
    stWndClassEx.hInstance = p_hInstance;
    stWndClassEx.hIcon = LoadIcon( NULL, IDI_EXCLAMATION );
    stWndClassEx.hCursor = LoadCursor( NULL, IDC_ARROW );
    stWndClassEx.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    stWndClassEx.lpszMenuName = NULL;
    stWndClassEx.lpszClassName = p_pchWndClassName;
    stWndClassEx.hIconSm = LoadIcon( NULL, IDI_EXCLAMATION );

    // ウィンドウクラスを登録します。
    ATOM wAtom = RegisterClassEx( &stWndClassEx );
    if( wAtom == 0 )
    {
        // 失敗しました。
        return false;
    }

    return true;    
} 

『ウィンドウクラスを登録する関数だよね』
「そう。この RegisterClassEx() を呼んでる部分をちょっと変えました」
『戻り値を変数に入れてるね。でもこの ATOM ってなに？　アトム？　あの
アトム？』
「あのアトムがなんのアトムかはとりあえず置いとくとして、このアトムは
ウィンドウズシステム内で使う特殊なもののひとつ」
『特殊？』
「そう、特殊なもの。今回はこれが鍵。まずは…… Spy++ を見て」
『ほい』
「ウィンドウ一覧って」

0003008A "たすかぶ" TasKABWClass

「って行毎に書いてあるでしょ」
『 "" ってなってるのもあるけど』
「それはウィンドウ名がついてないウィンドウ」
『あ、これってウィンドウ名なんだ。ってことはその右側のは……』
「ウィンドウクラス」
『つまりさっきの RegisterClassEx() で登録したのね』
「ウィンドウクラス自体って実はそれほど重要じゃないんだけど、こういう
ふうに〈もうひとつのウィンドウ名〉になってるから、そういう意味では登
録するときのウィンドウクラス名は重要だから」
『ってことは、もしかして他とかぶっちゃいけない！？　めんどくさー』
「あ、かぶっても大丈夫。たとえば……」

// 最初に呼ばれる関数です。
int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // 下の行だけ修正。
    const char pchWndClassName[] = "BUTTON";
    
    bool bRes
        = RegistWndClass( pchWndClassName, p_hInstance );
    if( bRes == false )
    {
        return -1;
    }
    
    bRes
        = CreateAndShowWnd
            ( pchWndClassName 
            , p_hInstance
            , p_iCmdShow
            );
    if( bRes == false )
    {
        return -1;
    }
    
    return MessageLoop();
}

「って感じに pchWndClassName 、つまりウィンドウクラス名を BUTTON に
してみて」
『って、 BUTTON ってボタンのウィンドウクラスじゃない！』
「 Version 5.25 ( No.090 ) でボタンを実際に作ってると、無理そうで
しょ」
『だってそうでしょ？　ボタンとしてもうウィンドウクラスが登録されてる
……けど大丈夫なの？』
「そう。試してみて」
『ほい、ビルドして実行。あ、全然問題ないや』
「これは、ウィンドウクラス名には〈グローバル〉なのと〈ローカル〉なの
があるから」
『グローバルとローカル？』
「普通に登録したウィンドウクラスは、実は〈ローカル〉なウィンドウクラ
スで、そのアプリ専用のものなんです」
『ってことは、他のウィンドウクラスとかぶってもいいんだ』
「逆に被っちゃいけないのは〈グローバル〉なウィンドウクラス。 BUTTON 
みたいにウィンドウズシステム全体で使うようなウィンドウクラスはグロー
バルなウィンドウクラスとして登録されてるから」
『でもアプリだけで使うときには問題ない、と』
「まぁね。でもかぶっちゃうのはかぶっちゃうから。 Spy++ でこのアプリ
のウィンドウクラスを見てみて」
『普通に BUTTON になっちゃってるね。なんか混乱の元になりそう』
「でしょう。これはこれでね。だから、MFC のアプリは……たとえば VC++ 
のウィンドウクラスは」
『げ、 AFX:なんたらかんたらってわけ分かんないのになってる』
「こういうふうにして他と被らないようにしてるんです」
『でもこれはヤダな……』
「まぁでもある程度長くてアプリ名に近いものならたぶん被らないだろうだ
ろうけどね。かぶるのが怖い場合には、グローバルのウィンドウクラスを登
録してみるって方法もあるよ」
『もしグローバルで BUTTON を登録しようとすると？』
「エラーになるから。試してみようか」

// ウィンドウクラスを登録します。
bool RegistWndClass
    ( const char *const p_pchWndClassName
    , HINSTANCE p_hInstance
    )
{
    // ウィンドウクラス登録用構造体。
    WNDCLASSEX stWndClassEx;
    stWndClassEx.cbSize = sizeof( stWndClassEx );
    stWndClassEx.style
        = CS_BYTEALIGNWINDOW | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW
        | CS_GLOBALCLASS;    // 追加。
    stWndClassEx.lpfnWndProc = WndProc;
    stWndClassEx.cbClsExtra = 0;
    stWndClassEx.cbWndExtra = 0;
    stWndClassEx.hInstance = p_hInstance;
    stWndClassEx.hIcon = LoadIcon( NULL, IDI_EXCLAMATION );
    stWndClassEx.hCursor = LoadCursor( NULL, IDC_ARROW );
    stWndClassEx.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    stWndClassEx.lpszMenuName = NULL;
    stWndClassEx.lpszClassName = "BUTTON";    // 変更。
    stWndClassEx.hIconSm = LoadIcon( NULL, IDI_EXCLAMATION );

    // ウィンドウクラスを登録します。
    ATOM wAtom = RegisterClassEx( &stWndClassEx );
    if( wAtom == 0 )
    {
        // 失敗しました。
        OutputDebugString( "ウィンドウクラス登録に失敗！\n" );
        return false;
    }

    return true;    
} 

「まず WNDCLASSEX::style に CS_GLOBALCLASS を追加します。すると」
『ウィンドウクラスがグローバルに登録される、と。で、 BUTTON ってウィ
ンドウクラス名で登録すると……あ、ビルドして実行。うん、〈ウィンドウ
クラス登録に失敗！〉って出た』
「って感じになります。グローバルにしたいなら CS_GLOBALCLASS を追加す
ればいいってこと」
『ウィンドウを作る方は？　CreateWindow() は何もしなくていいんだ』
「ウィンドウクラスはローカルなのから検索して、見つからなかったらグ
ローバルを探す、っていう仕組みになってるから」
『あー。……でもさ、実際、かぶっちゃうときってどうすればいいの？』
「そういうときは、プログラム側でかぶってるかどうか調べればいいんで
す。ここで ATOM が出てきます」
『やっと出てきたね、 RegisterClassEx() の戻り値』
「これはウィンドウシステム内で使われる整数値で、〈たったひとつしか存
在しちゃいけないもの〉に与えられる数字です」
『？』
「たとえば、ボタンのウィンドウクラス BUTTON が登録された時、 
RegisterClassEx() の戻り値として、 BUTTON に割り当てられた ATOM 整数
値が返ってきます。これは GlobalFindAtom() で取得できます」

    ATOM wButtonAtom = GlobalFindAtom( "BUTTON" );

「こう登録すれば、ウィンドウズシステム内で同じ BUTTON って名前で登録
できなくなります。そして、 BUTTON って文字列から必ず同じ ATOM 整数値
を取得できます」
『あー、よーするにウィンドウクラスの ID ナンバーなんだ』
「そういうこと。だから、この関数を呼んでもし登録済みだったら」
『……だったら？』
「ウィンドウクラス名をちょっとだけ変えて、また同じ関数で検索して、見
つかったらちょっと変えて、見つからなかったら登録」
『め、めんどくさ……』
「だからまぁ、普通はローカルなウィンドウクラスで十分だと思うよ」
『はーい』
「あ、そうそう、今回修正は全部始めの状態に戻しておいてください」
『ぅ”そうしないとアプリが動かないし……って、 ATOM の話ってそれだ
け？』
「実はこれだけ。アトムって、まぁ、本当はウィンドウクラス以外にも使わ
れてるんだけど、それでも使う事ってかなり少ないから……」

/*
    Preview Next Story!
*/
『そんな、ほとんど使わないものも知らなきゃいけないの？』
「うーん、そんなこと言ったら MFC だけ使ってればいいことになるし」
『それじゃダメだの？』
「やっぱり、 MFC を使わなくてもアプリを作れないと」
『なんか、ものすごく大変なことをしようとしてる気がしてきた……』
「というわけで次回」
＜ Version 10.09 メニューふたたび ＞
『につづく！』
「メニューも MFC 使えば簡単だしね」
『そうよそうよー！！』


////////////////////////////////////////////////////////////////////
/*                ２００２年１２月２３日（月）の更新              */
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
*/
////////////////////////////////////////////////////////////////////

