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

    KAB-studio.h


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

    送信日： 2001/12/10(Mon) No.136
    配信数： 3790 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

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

・１２月表紙壁紙登場！
　１週間遅れで１２月表紙壁紙登場！　今月は当然クリスマス！　元気な火
美ちゃんと憂いの火美ちゃんをどうぞ！　ダウンロードは CG Gallery に
て。
[ CG Gallery ]
http://www.kab-studio.com/CG/Gallery/


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

2001/12/02 (Sun)
　昨日徹ゲーしたから眠い。まったりして、貯まってたビデオ見ただけ。ア
ニメは旋風の用心棒が良かったです。 GGX Plus は特殊モードのキャラが強
くて面白いです。そして昨日の日記は寂しかったらしい……。

2001/12/03 (Mon)
　ソルパック月例会議。お仕事はちょっと残業。 Ginger どんな感じ？　そ
してデバイスコンテキストとウィンドウクラスの関係。つい最近知ったの
よ〜。

2001/12/04 (Tue)
　資料作って客先へ。そして会社戻って残業。疲れた〜。 GGX Plus はディ
ズィーの ED3 が出ない……。セグウェイって実はすごい？

2001/12/05 (Wed)
　今日も残業。遅れてるようなそうじゃないような。こういう不確実なのは
ホントはいけないんだろうけど。医療系のを参考にしたい……。そして
BADTRANCE.B 。もう４２通……。

2001/12/06 (Thu)
　寝る前にゲーム禁止(爆)。お仕事は今日も残業。資料作りが面倒。天使の
しっぽがなぜかお気に入り……。そして BADTRANCE.B って結構面白い？

2001/12/07 (Fri)
　お仕事はちょっと遅れ気味？　ベースシステムはできたけど、機能拡張で
不安定になるのが怖い……。松屋の麻婆丼が結構美味しい。ヴァンドレッド
はどんどんキャラが成長していくのがなんかすごい。１２月は忙しい。予定
がどんどん……。

2001/12/08 (Sat)
　１２月表紙壁紙セカンド！　前より良くはなったけど……。セル塗りだと
難しいけど、やっぱりセル塗りが好き。それで時間が潰れた……。ココロ図
書館いい感じ〜。そしてシステムフックの謎。別 exe がいいかな？　そし
てにゃーだにゃー。


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

■　第二章　青年ふたり　−１６−

　舞は依然として下を見降ろしていた。洋一の不敵な眼差しを感じて、動く
ことのできない自分があった。
　少年とリシュネのふたりは、何とかなりそうな気がしていた。子供なのだ
から、何とかなるはず……でも、あの男の人は……。
　しかし、持久戦に持ち込めるほど舞には余裕がなかった。勢いよく出した
水の塊は宙に浮いたままだった。それだけでも舞の精神力を少しずつ削って
いた。
　とりあえず――仕掛ける！
　舞は体を構え、眼下に見える三人目掛けて集中した。指先に水が流れ込ん
でいく。
「舞！　左ぃ！！」
　一瞬、自分の名前と、それと並んで下に立つ男の名前が呼ばれたのだと
思った。雅樹は舞に飛び掛かり、押し倒した。
　ぱん、乾いた銃声が響き渡った。
　舞はそれが銃声だと一瞬で悟った。が、雅樹に強く抱きしめられて自由は
利かなかった。雅樹は宙に飛ぶような形で斜面を駆け下り、一瞬だけ地面を
蹴ってさらに跳び上がった。
　当然、下にいた三人は抱き合う男女が華麗に宙を舞う姿など見ていなかっ
た。少年とリシュネは強い警戒心を露わにして発砲したその男を睨み付けて
いた。
　洋一のみが、やれやれといった感じで苦笑いを浮かべていた。見上げるそ
の先にいる男は、これ以上ないというような喜びを感じさせる笑みを浮かべ
て黒々としたハンドガンを三人へと向けていた。
「あいつかよ、また……」
　反射的に少年はリシュネを護り、リシュネは洋一を護ろうとした。男は断
続的にトリガーを引き、シグは薬莢を吐き出していく。弾丸は僅かにその弾
道を歪められ外れていく。アスファルトにめり込み、民家の塀を砕き、泥の
斜面を崩す。一発が手すりに当たり、跳弾が洋一の左肩を貫き空へと消え
た。
「！！」
　少年が一番冷静だった。雅樹は舞を護ることで精一杯だった。舞は洋一の
右肩から溢れ出る鮮血に口を覆った。リシュネは反射的に飛び出していた。
「リシュネ！」
　少年の言葉も聞かずにリシュネは斜面を蹴った。一瞬で丘の四分の一が吹
き飛び土煙が立ちこめた。赤土の雨が舞う中男は落ちながら冷静にマガジン
を交換していた。笑みを消すことなく、不鮮明なリシュネの姿を捉え、機械
的な填弾音を楽しんでいた。
「この化け物がッ」
　銃口をリシュネに向け、トリガーを引こうとした瞬間、遠くから来るト
ラックを確認していた。
「ちっ」
　少年は洋一を抱えて大きく跳び退き、リシュネは高々とジャンプしてト
ラックはその下を通過する。トラックは止まることなく走り去っていった。
リシュネは宙に浮きながら、側に漂う石端を掴み、振りかぶった。
「引くぞ！！」
　そう叫んだのは洋一だった。少年が押さえつけても止めどもなく吹き出る
出血が信じられないほどの大声だった。
「はい」
　洋一の声を聞いて、リシュネは自由落下に任せて下へと降りていく。
「！！」
　舞は三人が去ろうとしていることに気づいたが、それでも、何をしようと
は思いつかなかった。
　ただ、呆然としながら、土の雨が降る中を見つめていた。三人は、いつの
間にか消え、あとには消えることのない土煙と大きな傷跡を残した公園が
残っていた。
「終わった……わね」
「……！！」
　雅樹は、まだ終わっていないことを思い出してしまった。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『 Java メルマガ、購読登録数減っちゃったね』
「２１にね……難しいね」
『うちは上がったり下がったりだね』
「実際には下がってないかも」
『え？　数字は減ってるでしょ』
「まぐまぐが、届かない分を減らした減らした分だから」
『自分で解除したのじゃないってことね』
「毎週微増してるから、人気はあるって事かも」
『やっぱタダは強い？』
「元々タダだからなー」
『タダより高い物はない、なんてもう死語かも』
「でもホームページはちょっと落ち気味かも」
『そりゃ、 Codian とか辞書とか全然更新してないじゃん』
「有料にできれば更新とかできるんだけど」
『そしたらお客さん減っちゃよね』
「難しいね……」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 7.16
再描画させる！

「前回は再描画の方法を紹介しました」
『再描画する時には CAnimeDlg::OnPaint() が呼ばれるから、その中でデバ
イスコンテキスト使えばいいって話だったよね』
「そのときのルールは？」
『 BeginPaint() と EndPaint() を使うってことだったよね』
「そうそう。それさえ守ればこれまでと同じ。でも」
『でも？』
「これまでの〈ボタンを押した時に描画〉してたわけでしょ。つまりいつで
もできるっていう」
『うん。そっか、再描画だと再描画する時に描くから、好きなタイミングで
描くってできないんだ』
「でも、ボタン押した時だと」
『再描画したら消えちゃう』
「というわけで方針は、まず最初は再描画時に何も描かないようにします」
『まっさらにするわけね』
「次に、ボタン押したら〈再描画時に描く〉ように設定を変えます」
『どうやって？』
「メンバ変数を使うことになるかな」
『なんだか面倒なことになりそう……』
「で、これだけだと再描画しないと反映されない」
『わざとウィンドウ後ろに隠す？』
「そんなことしなくても〈再描画するように指示する〉ことができるから」
『そういう API があるわけね』
「そういうこと。今回はその辺を紹介しましょう。まずは、 
Ver 7.14 ( No.134 ) のままなら、 AnimeDlg.h の部分が」

class CAnimeDlg : public CDialog
{
    CRgn m_cRgn;
    CFont m_cFont;
// 以下略。

『うん、このまま』
「このふたつのメンバ変数を取り除いて、ひとつメンバ変数を追加してくだ
さい」

class CAnimeDlg : public CDialog
{
    // 以下１行追加。
    BOOL m_bDrawOk;
// 以下略。

『これ何に使うの？』
「これは〈再描画するかしないか〉のフラグに使います。これが FALSE な
ら〈描画しない〉、 TRUE なら〈描画する〉ってことにします」
『ふむふむ』
「で、このままだと m_bDrawOk の中には何も入ってません。最初は〈描画
しない〉ってことにしたいから、最初は FALSE を入れておきます。ダイア
ログが開く時に呼ばれるメンバ関数は？」
『 CAnimeDlg::OnInitDialog() ！　いつもどーり // TODO: のあと？』
「そう。これも Ver 7.14 ( No.134 ) のが残ってたら削除していいから」

BOOL CAnimeDlg::OnInitDialog()
{
// 略。
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    // 以下から追加。
    m_bDrawOk = FALSE;
    // 追加ここまで。
    return TRUE;  // TRUE を返すとコントロールに設定した（略）。
}

『ダイアログが開くのは最初の一度だけ、だからここで FALSE を入れちゃ
えばいいわけね』
「そゆこと。で、最後に描画部分。前回最後のとこをこう変えます」

void CAnimeDlg::OnPaint() 
{
    if (IsIconic())
    {
// 略。
    }
    else
    {
        PAINTSTRUCT stPaintStruct;
        HDC hDC
             = ::BeginPaint
                    ( m_cCanvasStatic.GetSafeHwnd()
                    , &stPaintStruct 
                    );

        // m_bDrawOk が FALSE じゃない時だけ描画します。
        if( m_bDrawOk != FALSE )
        {
            const char pchText[] = "あいうえお";
            ::TextOut( hDC, 0, 0, pchText, strlen( pchText ) );
        }

        ::EndPaint
            ( m_cCanvasStatic.GetSafeHwnd()
            , &stPaintStruct 
            );
        CDialog::OnPaint();
    }
}

『前回のと比べると、 TextOut() 呼ぶとこが if に囲まれて、それがさっ
きのフラグで決められてる、ってとこかな』
「とりあえずこれで実行してみて」
『え？　だって、これじゃフラグが TRUE にならないから、絶対に描かれな
いけど』
「うん、その確認」
『あ、そっか。ビルドして実行。うん、何も描かれないね』
「ならオーケー。それじゃ、今度は〈ボタンを押したら描画する〉ようにし
ます。いつものボタンのメンバ関数を次のようにしてください」

void CAnimeDlg::OnBDraw() 
{
    m_bDrawOk = TRUE;
    ::InvalidateRect( GetSafeHwnd(), NULL, FALSE );
}

『まずフラグを TRUE にして、で、初めて見る API だね』
「 InvalidateRect() は〈更新する領域〉を変える API 」
『？？？』
「うん、それはあとでね。とりあえずここでは〈再描画を命令する〉って機
能だけ憶えればいいかも」
『そっか、これを呼べばウィンドウを隠したりしなくても再描画される、つ
まり CAnimeDlg::OnPaint() が呼ばれるんだ』
「そゆこと」
『んじゃビルドして実行。最初は何も出ないけど、ボタンを押すと……あい
うえおって出た！』
「で、一度隠して」
『表に出させて、再描画させてもちゃんと出る！』
「こうすれば、好きなタイミングで描画できて、しかも再描画できるわけ」
『なるほど。あ！』
「な、なに？」
『この前さ、〈描画せずに再描画だけする〉ってのが本当だって言ってたの
はこれなんだ！』
「前回のだね。そうそう、こういうふうに再描画で描画するのが基本。そう
しないと再描画したら消えちゃうからね」
『ほー。あと質問』
「はい火美ちゃん」
『前回からなんだけど、 BeginPaint() と EndPaint() 使って描くと、背景
の色が消えちゃうんだけど』
「ぎく！　それ、なんでだろうね……」
『水希ちゃんも知らないわけぇ？』
「うん……。でも、こっちのダイアログの色と同じ、っていう方がたぶん正
しい色だと思うから、今回みたいに BeginPaint() と EndPaint() をいつも
呼ぶようにしといて」
『この前の事もあるし、なーんか最近頼りないってゆーか』
「う”……は、話を変えよう！」
『また強引に』
「さっきの InvalidateRect() の話。 CAnimeDlg::OnPaint() の中に次の
TRACE() を加えて」

void CAnimeDlg::OnPaint() 
{
    if (IsIconic())
    {
// 略。
    }
    else
    {
        PAINTSTRUCT stPaintStruct;
        HDC hDC
             = ::BeginPaint
                    ( m_cCanvasStatic.GetSafeHwnd()
                    , &stPaintStruct 
                    );
        // 以下を追加。
        TRACE
            ( "%d, %d, %d, %d\n"
            , stPaintStruct.rcPaint.left
            , stPaintStruct.rcPaint.top
            , stPaintStruct.rcPaint.right
            , stPaintStruct.rcPaint.bottom
            );

        // 略
    }
}

『 stPaintStruct のメンバ変数を表示してるんだね』
「これでビルドしてから、ダイアログの上を他のウィンドウで少しだけ隠し
たりしてみると」
『あ、値が変わる！』
「このメンバ変数は RECT 型なんだけど、この中に更新領域、つまり〈どの
領域が新しく見えるようになったか〉が入ってるんです」
『つまり、他のウィンドウで隠してどけるってした時に出た部分が入ってる
んだ。でもそれ、何に使うの？』
「グラフィックアプリだと、再描画に時間がかかる場合があるから」
『そっか、これ使えば毎回全部再描画しなくて済むんだ！』
「そのための情報がここに入ってるわけ。で、さっきの InvalidateRect() 
はその指定もできるんです。あ、一応今のままでボタン押してみて」
『ほい。更新領域は何度押しても変わらないね』
「うん、変わらないのは当たり前。ダイアログのクライアント部分全体だか
らね」
『全体が再描画するからそうなるんだ』
「で、それを変えてみます」

void CAnimeDlg::OnBDraw() 
{
    m_bDrawOk = TRUE;
    CRect cRect( 30, 0, 200, 200 );
    ::InvalidateRect( GetSafeHwnd(), &cRect, FALSE );
}

『 CRect 作って InvalidateRect() の第２引数に渡すわけね』
「そうすると、さっきの領域が」
『値変わった……けどなんか変？』
「まず、 InvalidateRect() の第１引数は」
『 GetSafeHwnd() ……あれ？　いつもの m_cCanvasStatic.GetSafeHwnd 
じゃない』
「確かに再描画したいのは IDC_S_CANVAS だけど、再描画するコードが入っ
てるのは CAnimeDlg::OnPaint() 、だから再描画の命令は」
『ダイアログの方に送らなきゃいけないんだ！』
「そういうこと。さっき InvalidateRect() 使った時もそうだったけどね」
『気付かなかった……』
「で、この更新領域の指定もダイアログに対してしてるんだけど、更新領域
を調べるのは」
『 BeginPaint() で渡してるのは m_cCanvasStatic.GetSafeHwnd() だから
ダイアログの内側、だからちょっと値が違うんだね。なるほどー』
「あ、あともうひとつ。ボタン押したらどうなる？」
『そりゃもちろんあいうえおって……あれ？　なんか左が欠けてる！』
「更新領域の指定、つまり CRect 作った時の値の左上隅のが」
『 left が 30 ってことは、少し右にずれてる……』
「この範囲が〈更新すべき範囲〉だから、逆にその外は〈更新できない範
囲〉になるわけ」
『だから欠けちゃったわけねー』

/*
    Preview Next Story!
*/
『再描画されるようになると、ちょっとまともなアプリって感じ』
「ウィンドウを隠すと消えちゃうんじゃね」
『でもまだまだ、普通のアプリと違う感じかなー』
「でもちょっとしたことで見栄えは変わるもんだよ」
『たとえば？』
「たとえば、押すと色が変わるボタンとか」
『あ、それいい感じ！』
「というわけで次回」
＜ Version 7.17 オーナードローでカッコヨク！ ＞
『につづく！』
「でも、ちょっと寄り道っぽい話だから要らないかなぁ」
『いるいる絶対いるっつーか教えろ！』


////////////////////////////////////////////////////////////////////
/*              ２００１年１２月１７日（月）の更新                */
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 - 2001 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////

