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

    KAB-studio.h


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

    送信日： 2003/01/06(Mon) No.188
    配信数： 3420 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                          新年の御挨拶                          */
『新年、あけましておめでとうございます！』
「あけましておめでとうございます」
『去年１年間、ほんとうにありがとうございました！』
「去年は特に変わり映えのしない１年だったけど」
『今年はどう変わるの？』
「たぶん何も変わらない……」
『相変わらずねー』
「ただ、 #pragma twice の過去の分をホームページに掲載する予定です」
『……それってこの読者の皆様にとってどんなメリットが？』
「たぶんないです……」
『……そ、そんな KAB-studio.h を今年もよろしくお願いします！』

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

・１月表紙壁紙！
　毎月恒例の表紙壁紙です。火美ちゃんの晴れ着姿です。晴れ着はほとんど
見えませんが（爆）。ダウンロードは CG Gallery にて。
[CG Gallery]
http://www.kab-studio.com/CG/Gallery/


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

・ほとはー追加！
　三人合体ホットハーブにひさびさ１話追加しました。ちょっと離れちゃっ
たけど前回の続きです。
[ 三人合体ホットハーブ ]
http://www.kab-studio.com/Comic/HotHerb/


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.com/nikki2/

2002/12/22 (Sun)
　ぱにぽに３巻を探してから、午後１時から８時まで休出。帰りにＭＰ３携
帯プレイヤーを物色。今年を振り返る７月８月。 Kanon アニメ版に大はま
り散財モード。自分。

2002/12/23 (Mon)
　靴を新調。ＭＰ３プレイヤーは CNMV128 購入。１時半から４時まで休
出。年賀状作成。今年を振り返る９月１０月。月姫と AIR 中心。そして
ＭＰ３プレイヤーとコピーコントロール。

2002/12/24 (Tue)
　１１時過ぎまでお仕事。お昼休みにぱにぽに３巻初回限定版購入。今年を
振り返る１１月１２月。今年はエロゲーの年。

2002/12/25 (Wed)
　有休取って家族サービスで丸の内を回る。丸ビルと東京ミレナリオへ。食
事はミクニにて。なんかリズム狂ってる？

2002/12/26 (Thu)
　仕事がまだかなり残ってる。シエル先輩のフィギュア購入。今年良かった
キャラベスト１０（ランキング発表は本文にて）。

2002/12/27 (Fri)
　でっかい JSP を読み込むと 64K 制限に引っかかってエラー。納会でピザ
食べて図書券３０００円ゲット。イヤホンとか購入。メルブラｉｎ冬コミ。
そしてそれ散る。色々勧めて〜。

2002/12/28 (Sat)
　表紙壁紙手抜きモード。でもいい感じ？　午後１時から１１時まで休出。
<jsp:include> 使ったら Bean 消えた。ガンダムＳＥＥＤのタイマーを忘れ
て一度家に帰る。「陸まお」。

2002/12/29 (Sun)
　午前中はぐだーっと。「少林寺拳法」。午後１時から１０時まで休出。
帰ってからはのんびり。明日は冬コミ。

2002/12/30 (Mon)
　午前中にぷらとわ１話。午後から冬コミへ。結構空いてた。メルブラ買え
ず（泣）。それ散る系と夏コミ申込書購入。２時過ぎに帰路へ。途中横浜
へ。「ふぉとぐら」。フォトショ７購入。想像以上に違う。プロ仕様な感じ
がいい感じ。

2002/12/31 (Tue)
　風邪。アンソロの整理。かぶスタのバックアップとかをどれみを見つつ。
東大和市の実家へ。着いてからはのんびり。あけましておめでとう。

2003/01/01 (Wed)
　風邪モード。初詣は半吉。コジマ電気で特に目的もなく物色。帰ってから
ものんびり。

2003/01/02 (Thu)
　まだ風邪。かなりのんびりした後江川亭へ。でも休みだった。とんでんで
食べる。「第一デパート」。今年は２日に帰ってきました。 CG Gallery の
更新を忘れてた〜。 Kanon & AIR ＳＳ（青空編）と月姫ＳＳ、やや微妙だ
けどいいのも。

2003/01/03 (Fri)
　風邪治ってない。ぷらとわ２話とほとはー。フォトショいろいろ。年賀
状を今日の一枚で見られます。やっぱり太ってた……。

2003/01/04 (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.10
アクセラレーターふたたび

「前回のメニューに続いて、今回はアクセラレーターを使ってみます」
『 Version 9.07 ( No.168 ) でやったのだね』
「あのときのまとめをすると、」

・アクセラレーターはリソースのひとつ。
　いわゆる「ショートカットキー」のこと。
・操作は HACCEL というアクセラレーターハンドルを使う。
　MFC だと CMainFrame::m_hAccelTable というのを持ってる。
・操作用 API には
　CopyAcceleratorTable() : コピー。
　CreateAcceleratorTable() : 新規作成。
　DestroyAcceleratorTable() : 削除。
・アクセラレーターを動的に追加するのは面倒。

「ってところかな」
『…… MFC の、って書いてあるってことは、今のだとこれは使えないって
ことだよね』
「そういうこと。というより、今の段階だとアクセラレーターそのものが使
えないし」
『げ、そうなの？』
「とりあえずは試してみようか。まずはリソースにアクセラレーターを追加
します。前回のメニューと同じように【 SimpleWindow リソース】の上で右
クリックして【挿入】を選んで」
『んで Accelerator を選んで【新規作成】だね。お、何もないアクセラ
レーター？』
「ここにテスト用のアクセラレーターを追加します。最初の行でダブルク
リックしてプロパティを出して」
『ほい』
「 ID は前回のメニューと同じ ID_MENU_TEST 、あとは好きでいいよ」
『じゃあキーは Ctrl + A っと。タイプは【仮想キー】だよね』
「そう、まぁデフォルトがそうだろうからそのままで。あと、このアクセラ
レーター全体のリソース ID は……」
『デフォルトだと IDR_ACCELERATOR1 だね』
「 IDA_MAIN にしておいた方がいいかな」
『……これ、どう変えるの？』
「ワークスペースの方の IDR_ACCELERATOR1 の上で右クリック」
『あ、プロパティってあった。っていうか、メニューもこうやって変えられ
るんだよね』
「でもメニューバーからの方が楽だし……さて！」
『さて？』
「 Version 9.11 ( No.172 ) で見たように、メニューもアクセラレーター
も、処理としては同じです」
『つまりコマンド系ってことだよね』
「そういうこと。というわけで、前回のメニューの時のをそのまま流用しま
す。ウィンドウプロシージャをこう書き換えて」

// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_DESTROY )
    {
        // ×ボタンが押されました。
        PostQuitMessage( 0 );
        return 0;
    }
    else if( p_uiMessage == WM_COMMAND )
    {
        if( LOWORD( p_wParam ) == ID_MENU_TEST )
        {
            // ID_MENU_TEST メニュー。
            OutputDebugString( "ID_MENU_TEST : 終了します。\n" );
            PostQuitMessage( 0 );
            return 0;
        }
    }

    // 標準的な処理をします。
    return DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam );
}

『……どこが違うの？』
「 OutputDebugString() の行を追加しただけ」
『あー。ってゆーか要らなくない？』
「うん、なくても問題ないかも。成功すればウィンドウが閉じるわけだし」
『ま、とりあえずいーや。で……今までの話を総合すると、まだダメなんだ
よね』
「そうなんです。ちゃんとアクセラレーターが効いていれば、 Ctrl + A を
押したときに、メニューと同じように WM_COMMAND が ID_MENU_TEST を持っ
て送られてくるはずなんだけど」
『ビルドして実行！　やっぱ何も起きないね』
「それはなぜかっていうと、今の段階だと、ただ普通にキー入力されてるっ
てみなされてるから」
『つまり Ctrl + A って入力されたってメッセージが来るだけなのね』
「そう、だからそれを変換する必要があるんです。というわけで、メッセー
ジループをこう書き換えて」

// メッセージループ。
int MessageLoop( HINSTANCE p_hInstance )
{
    BOOL bRes;
    MSG    stMsg;
    int iAclTranslated;

    // アクセラレーターをリソースから読み込みます。
    HACCEL hAccel
        = LoadAccelerators
            ( p_hInstance
            , MAKEINTRESOURCE( IDA_MAIN ) 
            );

    // メッセージループです。
    while( 1 )
    {
        // メッセージをキューから取り出します。
        bRes = GetMessage( &stMsg, NULL, 0, 0 );
        if    ( 
                ( bRes == 0 )
            || 
                ( bRes == -1 )
            )
        {
            // 終了するのでループから抜けます。
            break;
        }

        iAclTranslated
             = TranslateAccelerator( stMsg.hwnd, hAccel, &stMsg );
        if( iAclTranslated != FALSE )
        {
            // 変換したのでメッセージ変換とディスパッチはしません。
            continue;
        }

        // メッセージを変換します。
        TranslateMessage( &stMsg );
        // ウィンドウプロシージャに送ります。
        DispatchMessage( &stMsg );
    }

    return stMsg.wParam;
}

「さらに WinMain() で呼んでる部分をこう書き換えて」

    return MessageLoop( p_hInstance );

『あ、インスタンスハンドルをメッセージループに渡すようにしたんだ』
「その理由は、アクセラレーターをリソースから読み込む時に必要だから」

    // アクセラレーターをリソースから読み込みます。
    HACCEL hAccel
        = LoadAccelerators
            ( p_hInstance
            , MAKEINTRESOURCE( IDA_MAIN ) 
            );

「の部分」
『前回の LoadMenu() と似てるね』
「同じリソースを読み込む関数だからね。第１引数にインスタンスハンドル
を、第２引数にアクセラレーターのリソース ID を MAKEINTRESOURCE() に
渡したもの、を渡せばいいから」
『これを使ってるのが……』

        iAclTranslated
             = TranslateAccelerator( stMsg.hwnd, hAccel, &stMsg );

『だね』
「この API は、キー入力されたっていうメッセージを見つけたらそれを変
換してウィンドウプロシージャに送ってくれます」
『キー入力？』
「具体的に言うと、まずキー入力は WM_KEYDOWN 」
『あ、 Version 10.06 ( No.184 ) の TranslateMessage() の話の時に出て
きたのだね』
「そうそれ。このメッセージを受け取ると、アクセラレーターテーブルの中
に登録されているか調べます」
『で、 Ctrl + A だと』
「ウィンドウプロシージャに WM_COMMAND を直接送ります」
『もちろん ID_MENU_TEST を付けてだよね』
「もちろん。だからウィンドウプロシージャでそれを受けてあげれば……」
『そうだ、ビルドして実行、 Ctrl + A っと。おおっ！　ウィンドウが閉じ
た！　アウトプットウィンドウにも【ID_MENU_TEST : 終了します。】って
出てる！』
「というわけです」
『ま、ようするにメッセージを TranslateAccelerator() に渡すようにすれ
ば自動的に変換してくれるってわけね』
「まぁそれでもいいんだけど…… TranslateAccelerator() をもう少し詳し
くみておくね。第１引数は処理するウィンドウのハンドル」
『あ、 MSG 構造体ってウィンドウハンドルも持ってるんだね』
「第２引数はさっきロードしたアクセラレーターのハンドル。第３引数は
メッセージそのもの」
『で、戻り値を』

        if( iAclTranslated != FALSE )
        {
            // 変換したのでメッセージ変換とディスパッチはしません。
            continue;
        }

『って感じにチェックしてるね』
「 TranslateAccelerator() は、メッセージを受け取ってウィンドウプロ
シージャに WM_COMMAND を送ると、それが処理するまで、つまりウィンド
ウプロシージャから抜けるまで返ってきません」
『え？　つまり、メッセージループが止まるっていうこと？』
「そういうこと。で、処理されたあとに戻ってくるんだけど、それってつ
まり WM_KEYDOWN そのものが処理されたってことだよね」
『あ！　そのままだと WM_KEYDOWN をもう一度ウィンドウプロシージャに
送っちゃう！』
「だとまずいからここでチェックしてるんです。 TranslateAccelerator() 
はウィンドウプロシージャに無事遅れたら 0 以外を返すから」
「それを調べて…… continue ってなんだっけ」
『あ、教えてなかった……これは for や while の先頭に戻るものなんだけ
ど……次回に続く！』
「ええっ！？」

/*
    Preview Next Story!
*/
『なんかいきなり続いたね』
「 continue ってちょっとややこしいからね」
『そんなに？』
「そんなでもないんだけど……ちょっとしっかり触れたくて」
『だから延びるのよー』
「ま、いまさらそれは考えないってことで」
『はいはい』
「というわけで次回」
＜ Version 10.11 プログラムの構造を考える ＞
『につづく！』
「そしてさらっと４度目の正月を迎えて……」
『あと何度迎えるやら……』


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

・ほとはー追加の予定
　三人合体ホットハーブに１話追加予定です。やっと３章が完結する……。
[ 三人合体ホットハーブ ]
http://www.kab-studio.com/Comic/HotHerb/


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////

