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

    KAB-studio.h


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

    送信日： 2001/12/03(Mon) No.135
    配信数： 3780 ( 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/nikki2/

2001/11/25 (Sun)
　基本はのんびり。ビデオテープが売ってない(泣)。通販で買うか？　ハイ
ブリッドデッキは思ったよりも安いかも。テレビはこの前見逃したシュガー
がやっぱいい感じ〜。そして Rez のビデオ録画。そういえば前に F-ZERO 
を録画した記憶が……。

2001/11/26 (Mon)
　お披露目前日、プロトタイプ完成。そしてビデオテープはメーカーで切れ
てました(泣)。なんか疲れましたよ……。

2001/11/27 (Tue)
　午前中はプロトタイプの準備、午後はプロトタイプお披露目、戻ってから
は課題の整理。ああっ、 RUP とかできてれば〜(泣)。さらに帰ってからは
中間派遣先に書類出して、なんかもー疲れましたよ。そして買い物。多く買
うと使い切れないからねー。

2001/11/28 (Wed)
　Badtrans.B 猛威！　１日で８通は異常。感染はしないだろうけど。お仕
事はサブアプリ作り。ウィンドウで受け取ったデータをコンソールに出力す
るログツール。仕事は定時で上げて、帰ってからは KSK の書類を速達で送
付。だが、明日は GGX Plus の発売日！　これで疲れを取るのさ〜。

2001/11/29 (Thu)
　仕事は慣れない PC 組み立てで無茶苦茶苦労！　トラブル発生、訪れる恐
怖、そして……。ごたごたした中、 GGX Plus 購入！　ストーリーモードの
絵が酷すぎ(泣)。でもそれ以外は結構いい感じ。個人的には１万円分の価値
あり。うう〜、 Libretto に Linux プレインストールモデルが！？　惹か
れるけど高い……。

2001/11/30 (Fri)
　この日の日記は土曜お昼に(汗)。前日のお仕事は眠かった……。そのあと
徹ゲー。サッカーやテニスはＰＣエンジン版以来。懐かしい〜。んで７時に
寝てって感じ。最終兵器彼女、厚い……。おとといの改札での無茶苦茶恥ず
かしい出来事。そしてビデオデッキ代わりになるサーバー。これってもしか
してかなり良くない？

2001/12/01 (Sat)
　仕事メールに資料作りに実家と電話にかぶヘッダーにカレーにくじ引きに
Ｎスペ。それだけ。


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

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

　はじめ、それらはすべて同じように見えていたが、よく見ればそれぞれ違
う形をしていた。雅樹の上を飛び跳ねるもの以外にも、比較的鈍重なもの
や、最初に飛び込んできたときに着地に失敗してそのまま動かないものまで
いる。見かけも、それぞれ大きく違っていた。
　だが、残りの二体は相当の早さで飛び回っていて、雅樹はかなり苦戦して
いた。
「ったくっ！」
　橙色の炎が無数に飛んでいく。が、残った二体は耐久力も相当のものらし
く、一、二発当たっていても全く動きが衰えていなかった。その上、黄炎に
よるめくらましさえ効いていなかった。
「なんなのよー、もう」
　恭子と信吾はひとつ所に集まり、その脇で俊雄が立っていた。
「一発必中――行くか？」
　雅樹は二体のうち一体を選んで、右手を構えた。その右腕に青い炎が点っ
た。続いて左手も構える。橙色の炎が点る。その左腕をゆっくりと振るう
と、軌跡に小さな炎が三つほど残る。
「そこの三人！」
　数秒経つ。
「……？　僕達？」
「誰がいんだよ。残った一匹、そっちに行くかもしんないからな」
「一匹倒せたら、でしょ？」
「信じろって、俺を」
　不敵な笑みを浮かべて、雅樹は構え、精神集中を始める。俊雄は、なんで
あんな挑発的なことを言ったのだろうと自分でも驚きながら、後ろにいるふ
たりを必死にかばっていた。
　沈黙が、続いた。
『――橙炎！』
　ふたつの橙色の炎が同時に撃ち出される。一発が一体ずつに飛んでいき、
二体は飛び上がった。
『焦炎――』
　振りかぶり――
『槍射！！』
　一瞬だった。俊雄はその軌跡を目で追えなかった。ガスレンジから吹き出
すような蒼い炎の塊まりは雅樹の手から放たれ放物線も描かずに一体を炎で
包み込んだ。
　蒼い炎で包まれた一体は、何か叫んだのかもしれない。だが、それ以上に
燃え焦がすその音が公園中に響きわたった。一瞬宙を舞ったそれは、放物線
を描きもせず、錯覚かと思わせるほどの滞空時間を要して落下した。落下し
たそれは、音も立てずに落ち、黒い消し炭が粉々になって風に舞って消え
た。
　地面には、泥にこびりついた炭だけが残っていた。
　雅樹はもう一体を睨み付ける。この一瞬の攻防を、残りの一体は恐怖にお
びえた目で見ていた。今地面にいるそれは、怯えきって今にも逃げ出しそう
だった。
　だが、それは逃げ出さなかった。雅樹から目を逸らした先には、三人の人
間がいた。視線はそれに集中し始めていた。
「こっちに……来るっ」
　俊雄は身構え、最後の一体を睨み付ける。恭子と信吾は立ち上がろうとし
ていたが、すでに足がすくんで動けなかった。
「ラストワン、ってとこかな」
　ぽうと雅樹の右腕に蒼い炎が点る。三人の方へと足を進めようとしそのと
き、雅樹は、声を聞いた。
「な……！！」
　後ろを振り向き走り出した雅樹の注意から、すでに三人は消えていた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『今週の水曜日は Java で納得オブジェクト指向プログラミングね』
「次の第７回は【ポリモーフィズムの実例 】です」
『前回言ってたポリモーフィズムね』
「どんなものも、実際に使えなきゃ意味がないから、その実践編」
『デバイスコンテキストの API も、知ってても使えなきゃね』
「でも使えるだけじゃ仕方がない、それが前回のかな」
『ちゃんと意味を知ってなきゃってやつね』
「そう、僕はそこが大事だと思うから。ただ使えるだけじゃ意味がない！」
『だから〈納得〉ねー。でも２１人じゃ、使える方が重要なんじゃない？』
「かもね……」
http://www.kab-studio.com/Programing/JavaOOP/
_______________________________________________________________[KCM]


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

　Version 7.15
再描画できるように

「ごめんなさい！」
『な、なに？』
「これまでのプログラムでミスがありました。まずその訂正から」
『行き当たりばったりでやってるから……』
「う”。えーっと、これまでウィンドウのデバイスコンテキストを GetDC() 
で取得してました。これはいいんですが、実は、これを呼んで描画したあと
は ReleaseDC() という API を呼ぶ必要がありました」
『げ、そなの？』
「そうなの。 GetDC() 読めば載ってるんだけど、気付かなくて……という
わけで、 Ver 7.01 ( No.121 ) なら」

void CAnimeDlg::OnBDraw() 
{
    COLORREF dwColor = RGB( 255, 0, 0 );
    HDC hDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    ::SetPixel( hDC, 10, 10, dwColor );
    // 下の１行を追加。
    ::ReleaseDC( m_cCanvasStatic.GetSafeHwnd(), hDC );
}

「って感じに、後片付けをする部分で ReleaseDC() を呼んでください。第
１引数に GetDC() に渡したウィンドウハンドル、第２引数に GetDC() の戻
り値として返ってきたデバイスコンテキストのハンドルを渡してください」
『後片付けってことは、最後に元のペンとかに SelectObject() した後に呼
べばいいんだよね』
「そういうこと。ま、小規模なアプリならこれくらい問題ないけど、描画処
理を長時間行うアプリとかだと問題が出るかもしれないから忘れないでね」
『で、今日は？』
「今日は〈再描画〉について」
『再び描く、ってことよね』
「文字通りならね。でもむしろ、本当は〈描画せずに再描画だけする〉って
いうのが普通の処理」
『？？？』
「うん、この辺の考え方が難しいかもね。まずは、 Ver 7.12 ( No.132 ) 
で教えた文字列の描画から。あ、前回の CAnimeDlg::OnInitDialog() の部
分はナシにしてね」

void CAnimeDlg::OnBDraw() 
{
    HDC hCanvasDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    const char pchText[] = "あいうえお";
    ::TextOut( hCanvasDC, 0, 0, pchText, strlen( pchText ) );
    ::ReleaseDC( m_cCanvasStatic.GetSafeHwnd(), hCanvasDC );
}

『 ReleaseDC() が入ってる以外は同じだけど』
「そう同じ。別に文字列じゃなくても、 SetPixel() でもなんでもいいんだ
けど分かりやすそうだし簡単だからこの例。で、この文字列を描画して」
『描画して』
「この【Anime】ダイアログを別のウィンドウで隠して」
『隠して』
「もう一度表示すると」
『げ！　文字列が消えてる！　なんで？』
「これが再描画。ウィンドウが〈隠れてまた表示される〉時には、もう一度
ウィンドウ全体が描画されなおすんです。でもこの文字列はボタン押した時
にしか描かれないから」
『消えちゃうってゆーの！？　なんか変！　一度描いたら、それが残ってて
もいいじゃん』
「確かにねー。この辺はデバイスコンテキスト、というよりは、画面の仕組
みの問題かも」
『画面の仕組み？』
「画面にいっぱいウィンドウあるけど、描画する時は、ウィンドウごとじゃ
なくて、画面全体って形になるんだよね」
『そういえばクリッピングしないとはみでちゃうけど、それと同じ？』
「そうそう。感覚的にはウィンドウが〈重なってる〉ように見えるけど、そ
れはそう見せかけてるだけ。ウィンドウを描画する時は画面に直接描いてる
わけ。立体的に見えるけど、実は平面のキャンバス一枚、って言った方がい
いかも」
『だから消えちゃう？』
「〈ダイアログに描いた〉って思っても実際には画面に描いただけ。だから
それが〈ダイアログに描いた〉ってふうにウィンドウズシステムには伝わっ
てないから」
『描いたこと憶えてくれない』
「後ろに隠れた時にも〈元々ダイアログに描かれてたもの〉とか憶えてもら
えてないしね。今の〈あいうえお〉って描いた部分、半分だけ他のウィンド
ウで隠してみると」
『隠したとこだけ消えちゃうね』
「上に乗っけたウィンドウを描画しちゃうから、今の文字列の部分が消え
ちゃう。で、そこは憶えてもらってないから」
『消えちゃうのねー』
「あと、これを試してみようか」

void CAnimeDlg::OnBDraw() 
{
    // 画面のデバイスコンテキストを取得。
    HDC hCanvasDC = ::GetDC( NULL );
    const char pchText[] = "あいうえお";
    ::TextOut( hCanvasDC, 30, 30, pchText, strlen( pchText ) );
    ::ReleaseDC( NULL, hCanvasDC );
}

『ん？　ほとんど変わらないけど』
「とりあえず試してみて」
『ほい実行。げ！　画面左上にあいうえおが！』
「 GetDC() にはこれまでウィンドウハンドルを渡してたけど、これに NULL 
を渡すと画面全体のデバイスコンテキストが取得できます」
『画面全体……』
「むしろ、ウィンドウズシステムはこれにだけ描画してるって考えた方がい
いかもね」
『はー。なんかすごいかも』
「というわけで、一度隠れると消えちゃう理由は分かったと思います」
『不便なのに代わりはないけどね。っつーか、どうやって解決するの？』
「そこがポイント。〈ボタンが押された〉時に CAnimeDlg::OnBDraw() が呼
ばれるように、再描画が必要な時に関数が呼ばれれば」
『そこで描画すればいい！』
「そういうこと。これが再描画。〈さっき描画したのを描画して〉ってウィ
ンドウズが求めてきた時に、それに応えればいいわけ」
『で、それはどうやって？』
「実はその関数は元々用意されてるんです。 AnimeDlg.cpp の真ん中あたり
に」

void CAnimeDlg::OnPaint() 
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 描画用のデバイス コンテキスト

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // クライアントの矩形領域内の中央
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // アイコンを描画します。
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

『あるある！　これがそうなの？』
「そう。たとえば」

void CAnimeDlg::OnPaint() 
{
    if (IsIconic())
    {
// 略。
    }
    else
    {
        TRACE( "再描画！\n" );
        CDialog::OnPaint();
    }
}

『 TRACE() を入れてみるわけね』
「これでさっきみたいに隠してみれば」
『表に出すたびに〈再描画〉って出るね。ここでボタン押した時と同じよう
に』
「やっちゃダメ」
『げ、そなの？』
「最初のごめんなさいと関係するのはこの辺。このときには、描画する時に
ルールがあるんです。ま、それはソースを見てもらってってことで」

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

        const char pchText[] = "あいうえお";
        TextOut( hDC, 0, 0, pchText, strlen( pchText ) );

        ::EndPaint
            ( m_cCanvasStatic.GetSafeHwnd()
            , &stPaintStruct 
            );

        // 追加ここまで。
        CDialog::OnPaint();
    }
}

『 API 的には BeginPaint() と EndPaint() ね』
「この再描画時には、 GetDC() と ReleaseDC() の代わりに BeginPaint() 
と EndPaint() を呼ぶって憶えれば大丈夫かな」
『 PAINTSTRUCT は？』
「これは構造体で、描画する時の情報が入ってるんだけど、特に重要なもの
は入ってないから放っといていいかも」
『で、これで挟む他はいつも通りでいいんだよね』
「そゆこと。 BeginPaint() の戻り値に描くためのデバイスコンテキストが
返ってくるから、それを使って描画すればＯＫ」

/*
    Preview Next Story!
*/
『あれ？　でもこれなんか……』
「ぎく！」
『……なーんかアヤシイわねー』
「……僕だって分からないことや知らないことも結構あるんだから！」
『げ、開き直りやがったこいつ！』
「というわけで次回」
＜ Version 7.16 再描画させる！ ＞
『につづく！』
「でも火美ちゃんよりはずっとずっと知ってるんだけどねー」
『がーっムカツク！！』


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

