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

    KAB-studio.h


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

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

////////////////////////////////////////////////////////////////////
/*                       次号はお休みします                       */

　次号、１２月３１日配信分はお休みします。
　理由は色々ありますが、 Pubzine さんがお休みなのがとりあえずの理由
ってことで。


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

・Java メルマガページを更新。
　「 Java で納得オブジェクト指向プログラミング」に「バックナンバーの
読み方」を追加！　これで「今から購読登録してもなー」「あの号だけ欲し
い」って願いもかないます！
　あと価格を税込み価格に変更（爆）。
[ Java で納得オブジェクト指向プログラミング]
http://www.kab-studio.com/Programing/JavaOOP/


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

2001/12/16 (Sun)
　ビデオテープとバッグを買ったら、ビデオデッキが壊れてた(泣)。そこで
ハードディスクビデオデッキ購入！　画質は難しいところだけど、とりあえ
ず便利。でも疲れた……。

2001/12/17 (Mon)
　急遽予定変更で池袋のデータセンターへ。疲れてへとへと……まぁネット
ワーク関係で実があったけどね。疲れてるけどやります今年を振り返る・
１月。卒論関係が中心かな。

2001/12/18 (Tue)
　マジ疲れた……昨日に引き続きデータセンターへ。何もせずにずっと立
ちっぱなしが辛い……。それにメインプロジェクトの遅れが心配。むぅ。

2001/12/19 (Wed)
　さらに池袋へ。今日は結構問題発生で作業発生。でも少し早く上がれた、
ので池袋を回る(爆)。ココロ図書館サントラを買ったり。でも電事故で遅れ
たりして疲れた……。今年を振り返る、２月３月。卒論プレゼンと就職前研
修。

2001/12/20 (Thu)
　今日から通常業務でコーディングしまくり。結構進んだかな？　夜に勤務
先の忘年会でカニ。カニミソとかイクラとかウニとか大好物。今年を振り返
る４月。研修スタート。体調最悪。ハイブリッドデッキの画質は標準ならな
んとか？　とりあえず予約は便利。そしてアクロバット。やっぱワードとか
より良さそうだなー。

2001/12/21 (Fri)
　お仕事はちょっとへろへろ。でも仕様決定段階に差し掛かって結構大変。
そのあと家族でクリスマスパーティー、だが水にはまる(爆)。ココロ図書館
やっぱいいわ。ＥＤテーマ好き。

2001/12/22 (Sat)
　ハイブリッドデッキってなんか複雑。毎週で必ず上書き？　Java メルマ
ガはバックナンバー関係。コミックスは課長王子がいい感じ。ハードディス
クからのダビングはちょっと画質が……。そして表紙リニューアル。かなり
違う感じにするかも。


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

■　第三章　きもち　−１−

　空が、少しずつ白んでいく。星の瞬く夜空がグラデーションを奏でる。遠
くに見える山々が神々しく煌めき、下界の町並みが光を取り戻す。
　その町並みを見下ろす舞の瞳は、冷たい。凍てつく氷河のように。自分が
通う学校の屋上、その屋上に出る入り口の上に舞は立つ。白装束をまとい、
吹きすさぶ風の中、すぐ下に広がる人工の湖を今度は見下ろす。そのプール
の冷たさを運んでいるからか、初夏に近づこうとしている風はいまだ冷た
い。
　その紺色の空間の中で、舞は白い帯を解く。滑らかな肩を一枚の白い布が
滑り落ちる。その中にある競泳用の水着を着た舞の体は、若々しく力強い。
瞳を閉じ、唇を噛み締め、赤いリボンで長い髪を頭の後ろでまとめ上げる。
すべての準備が整い、ゆっくりと、息をはいた。
　見開かれた瞳には、もう氷塊などなかった。
『水よ、我が意の元に舞え！』
　紺色の水面が渦を巻き、それは竜巻か何かに吸い上げられているかのよう
に空へと登っていく。程良い長さでその渦は途切れ、水塊は舞の目の前、
１０メートルほど離れた空間にその表面を弛ませながら浮き続けた。
　その状態を維持するため、舞は左手を伸ばし、その手のひらを向ける。そ
こに右手のひらを添え、握りしめる。動作に呼応して水塊が歪む。
『我が二つの意に従い、宙を疾れ！』
　両腕を大きく引き剥がし、水しぶきを撒き散らして水塊も二つに分かれ
る。舞はゆっくりと息をはく。水ではなく、汗がすでに体を濡らしていた。
両腕はやや震え、二つの水塊もやや歪みが大きくなっていた。

『はっ！』
　指揮者のように両腕を振れば、二つの水塊は意のままに宙を疾る。それら
は時に交錯し、時にぶつかり合い、少しずつその形を小さくしていった。
『はっ、はっ』
　そのかけ声もすでに気合いが入っていない。玉のような汗が肌を滑り、水
着へと吸い込まれていく。
　太陽が山から完全に姿を現し、陽の光が舞の瞳を射る。一瞬閉ざされる
目。張りつめた糸がぷつんと切れ、二つの水塊は形を崩しつつ落下し、プー
ルの水を高々と跳ね上げた。
「きゃっ！」
　とても触れることのできない汚さの水しぶきを避けようとして、舞は後ろ
に下がった。唐突に笑い声が上がる。
「あははははは……」
「お、お兄ちゃん！」
　ジャージ姿の奨は、フェンスに寄りかかりながら舞を見上げていた。
「いつからそこにいたの？」
「ついさっき。あんまり俺をなめないで欲しいな、能力くらい感じられるっ
て」
　と、札束のように札のうちわを見せた。
「これがあれば、俺だって結構いけるんだけどな」
「あたしだって要るわよ」
　舞は床に置いてあった札を三枚ほど取り、少し折り目を付けて、投げる。
ついで人差し指と中指を下から上へと振り上げる。
『閃！！』
　一瞬、札が三角形を作り、その中を間欠泉のように水の矢が走り抜ける。
水分を含んだ朝の空へとそれは消えていった。
「うひゃぁ……」
　奨は感嘆した。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『これが今年最後のかぶヘッダー！』
「来週はお休みだから」
『でも Java メルマガは１月２日に配信されるんだね』
「休みの間に勉強してってことで」
『げ！　休みこそ勉強したくないでしょ！』
「社会人はそうもいかないから……」
『そんなに忙しいんじゃ全号読むの大変ねー』
「ナイス振り」
『ふふん』
「 Java メルマガもバックナンバーを読めるから」
『全号じゃなくて数号だけ抜き出して読めるのね』
「正直、購読登録よりもこっちの方が儲かりそう」
『うわ実も蓋もない……』
http://www.kab-studio.com/Programing/JavaOOP/
_______________________________________________________________[KCM]


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


　Version 7.18
タイマーで止めない！

「今回からは、アニメーションをするための方法を見ていきます」
『そーだね、今までは一枚絵だったもんね。それを動かすわけだ』
「あ、でも注意。今回から紹介するのは〈ちょっと劣る方法〉」
『劣るってどゆこと？』
「ちゃんとアニメーションさせたい場合には DirectX って機能を使わない
とダメ。今回から教えるのだと、たいしたアニメーションはできないから」
『ぶー、ならなんで教えるのよー』
「アニメーションが分かると、ウィンドウズのメッセージの仕組みとかが分
かるんだよね」
『つまりアニメーションってのは勉強のためのエサね』
「う、そういう言い方されると……」
『はいはい。で、どうする？』
「まずはそれを考えてみましょう。まず一番簡単な方法として、時間が経つ
に連れて IDC_S_CANVAS の色が少しずつ変わる、ってしていきたいんだけ
ど」
『それだけなら簡単だよね。塗りつぶしは Ver 7.07 ( No.127 ) の 
FillRect() 使えばいいし、色変えるのはその時使うブラシの RGB の値変え
ればいいだけだし』
「そうそう。一番難しいのは少しずつ色を変える、つまりアニメーションさ
せてく部分」
『そりゃそうよね、それができたらもう教わってるってことだし』
「で、どうすればいい？」
『うーん……アニメーションってことは、繰り返し塗り潰すわけだから……
あ！　 for を使う！』
「ぶっぶー」
『げ！』
「ま、実際にやってみましょう。いつものボタン押したら呼ばれるメンバ関
数に」

void CAnimeDlg::OnBDraw() 
{
    CRect cRect;
    ::GetClientRect( m_cCanvasStatic.GetSafeHwnd(), &cRect );
    HDC hDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    HBRUSH hBrush;
    int iRed = 0;
    
    for( int iF1 = 0; iF1 < 10000; ++iF1 )
    {
        hBrush = ::CreateSolidBrush( RGB( iRed, 0, 255 ) );
        ::FillRect( hDC, &cRect, hBrush );
        ::DeleteObject( hBrush );

        iRed += 1;
        if( iRed == 256 )
        {
            iRed = 0;
        }
    }
    ::ReleaseDC( m_cCanvasStatic.GetSafeHwnd(), hDC );
}

『うん、 for でループして、中で iRed の値を増やしていって、それでブ
ラシ作るから少しずつ赤くなってく、って感じね』
「 iRed == 256 のところは、 RGB に渡せるのは 255 が最高だからね」
『そんなの分かるって。実行実行！』
「（……大丈夫、だよね……）」
『ビルドして実行してボタンを』
……


……
『あれ？　何も起きないよ』
「……やっぱり……ちゃんとアニメーションしてたんだけどね」
『うっそだー！　なんともなってないもん』
「火美ちゃん、クロックタイムとかおかしくない？」
『え？……あれ？　処理時間と実時間が違う！』
「火美ちゃんその間寝てたからね」
『ね、寝てたぁ！？　あたしいきなり昼寝してたの！？』
「そういうわけじゃないんだけどね。じゃ、このノートパソコンで試してみ
ようか。 Anime.exe をコピーして、カメラを向けてと。見える？」
『うん、ノート見えるよ』
「じゃ、実行！」
『げ、ホントに色が変わってる！　すげー早さだけど。あ、終わった。でも
なんであたし気付かなかったの？　寝てたの？』
「寝てたっていうかねぇ。もう一度実行してみるね、で、その間に他のウィ
ンドウをクリックしてみると」
『あれ、反応しない！』
「これは、 for ループの中で処理してる間は、他のことができないから。
パソコンの中の CPU あるでしょ」
『考えるとこだね』
「そこが for ループにかかりっきりになっちゃうから、他が反応しなく
なっちゃうから、こうなっちゃうんです」
『かかりっきり！？　つまり、他のウィンドウの面倒見なくなっちゃう？』
「他のウィンドウだけじゃないよ。ほら」
『げ、 Anime ダイアログが閉じない！』
「いろんなアプリが同時に動くことを〈マルチタスク〉って言うんだけど、
それだって CPU はひとつ。だから、 CPU は順番にアプリを見てまわってる
んです」
『それを for で独り占めしたら、他を見て回れなくなっちゃうわけね。で
もじゃあどうすればいいの？』
「それは、描く時だけ独り占めすればいいだけ。 for って実はすごく早く
回るんだよね」
『うん、さっきすごく早かった』
「でも実際のアニメーションにはそれほど早さは必要ないから。たとえば、
for が１秒間に１億周するとします」
『それすごい……』
「でもアニメーションは１秒間に６０回も更新できれば十分」
『１億とはえらい違いね。あ、そっか、じゃあ１億−６０の間は CPU に他
のアプリ見られるようにすればいいんだ』
「そういうこと！　そこで、ある一定時間毎に CPU に見てもらうようにし
て、それ以外は CPU が他を見られるようにします。そのための仕組みが
〈タイマー〉っていうもの」
『タイマーは普通のタイマーよね、時間計ったりする』
「そうそう。では実際に使ってみましょう。えっと、まず下準備。
AnimeDlg.h の方に次のように追加します。

class CAnimeDlg : public CDialog
{
    int m_iRed;    // 赤色。
// 以下略。

『 Ver 7.16 ( No.136 ) のと同じとこね。あ、 m_bDrawOk は削除しちゃっ
ていいの？』
「 CAnimeDlg::OnPaint() の追加したとこを削除かコメントアウトしてくれ
ればオーケー。 CAnimeDlg::OnInitDialog() はこれから追加するから。つ
いでに書いちゃおうかな」

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

『 SetTimer() ってのがそうね』
「そう、この関数はタイマーをセットします。簡単にこの仕組みを言うと、
たとえばボタンを押されると呼ばれる CAnimeDlg::OnBDraw() や、描画する
時に呼ばれる CAnimeDlg::OnPaint() 、そういうのと同じように、一定時間
毎にメンバ関数が呼ばれるようセットするのがこの SetTimer() 」
『その時間ごとに呼ばれるんだ』
「そゆこと。この関数の第３引数に 125 って指定してるけど、これはその
時間。単位はミリ秒、つまり１秒の千分の１」
『 125 ってことは、４分の１秒ね。それって１秒に４回って事でしょ？　
さっき言ってた１秒間に６０回ってのとえらい違いじゃない』
「そう。実はタイマーってあんまり機能良くないから、それほど早いのは無
理なんだよね。だからこのくらい」
『ふーん』
「次はこのタイマーを終了させる部分」

void CAnimeDlg::OnBDraw() 
{
    ::KillTimer( GetSafeHwnd(), 100 );
}

「 SetTimer() したのを、もう呼ばなくていいってするための関数がこの 
KillTimer() 」
『いつもの後片付けね。この 100 は？』
「これはタイマー ID って言って、 SetTimer() の第２引数。ひとつのウィ
ンドウに複数のタイマーをセットすることができるから、そのタイマーごと
にこの ID を付けて識別するんです」
『 KillTimer() で個別に止めることができるわけね』
「あ、ちなみにこの 100 はこういうふうに直打ちしない方がいいからね」
『前にそんなこと言ってたね』
「詳しくは Ver 4.09 ( No.059 ) を参照。こういうふうに直打ちすると、
SetTimer() を 101 にしたけど、 KillTimer() で 101 にし忘れてて、タイ
マーが終了しない〜」
『間抜けねー』
「そういうことにならないためにも、ね。じゃ、描画部分。まずはタイマー
で呼ばれるメンバ関数を作ります。前回、 Ver 7.17 ( No.137 ) と同じよ
うに作ります」
『同じ性質のものって事ね。メニューの【表示】−【 ClassWizard 】のダ
イアログの【メッセージマップ】ページで【クラス名】は CAnimeDlg にし
て【オブジェクト ID 】も CAnimeDlg にして、【メッセージ】は？』
「 WM_TIMER にして」
『【関数の追加】と【コード編集】をぽん』

void CAnimeDlg::OnTimer(UINT nIDEvent) 
{
    CDialog::OnTimer(nIDEvent);
}

『ってメンバ関数が出た。』
「この中に次のように追加して」

void CAnimeDlg::OnTimer(UINT nIDEvent) 
{
    CRect cRect;
    ::GetClientRect( m_cCanvasStatic.GetSafeHwnd(), &cRect );
    HBRUSH hBrush = ::CreateSolidBrush( RGB( m_iRed, 0, 255 ) );
    HDC hDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    ::FillRect( hDC, &cRect, hBrush );
    ::DeleteObject( hBrush );
    ::ReleaseDC( m_cCanvasStatic.GetSafeHwnd(), hDC );

    m_iRed += 2;
    if( m_iRed == 255 )
    {
        m_iRed = 0;
    }

    CDialog::OnTimer(nIDEvent);
}

『さっきの for のとだいたい同じね』
「じゃ、実行してみて」
『……今度は眠らない？』
「大丈夫大丈夫」
『んじゃ。おお！　すこーしずつ色が変わってく！！　カッコイイ……』
「それにちゃんとダイアログも動かせるし」
『閉じることもできるし、あたしも見られる！』
「あ、閉じる前にボタン押さないと」
『これでタイマー止めるのね』
「というわけで、こういうふうにすれば他のアプリを邪魔することなくアニ
メーションできるわけです」
『おお！』

/*
    Preview Next Story!
*/
『今回のはかっこいい！』
「この前のオーナードローも良かったでしょ」
『うんうん。こういうのばっかだとプログラミングも楽しいかも』
「じゃあ来週はつまらないかも」
『げげ！』
「というわけで次回」
＜ Version 7.19 ランダマイズとのべ秒 ＞
『につづく！』
「金の延べ棒とかだと面白いんだけどねぇ」
『水希ちゃんそれ笑えないし痛いよ……』


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

１２月３１日〜１月２日はお休みします。
　１２月３１日、１月１日、１月２日の諸々の更新はお休みします。年末年
始のお休みってことで。ただ、ちょっとややこしい内容になってます。
　まず、表紙壁紙が１月バージョンになります。これが唯一の更新。もしか
したら、表紙そのものがちょっとリニューアルするかも……。
　チョー普通な日記はこの３日間お休みします。ですが、もしーかしたら、
更新するかも……いやたぶんしない（爆）。
　KAB-studio.h の１２月３１日号はお休みします。これでちょうど年５０
号になるはず（爆）。
　ただ、 Java で納得オブジェクト指向プログラミングは１月２日にちゃん
と配信されますのでご心配なく。


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

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

