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

    KAB-studio.h


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

    送信日： 2002/01/21(Mon) No.141
    配信数： 3740 ( 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/01/13 (Sun)
　朝はまったり、午後は休出。でも眠い。ぶっ続けで働ける人ってなんで働
けるんでしょ。帰りに花月のラーメン。ぶらっと歩いてみたり。テレビは
だぁ！だぁ！だぁ！最終回？　とか。今日、１月１３日はわての誕生日。結
婚したくないんだけどいいですか？

2002/01/14 (Mon)
　祭日に豚汁。ホットハーブ１話完成。今回はちょっと手抜きに新しい技法
を使ってます。お昼の作画さんの特番が渋くて良かったです。そしてお誕生
日おめでとう。シリアルナンバー？

2002/01/15 (Tue)
　寝る時に悪夢モード。そのせいで午前中は作業効率ダウン。帰ってからの
時間もあまりないし。そしてシリアルナンバー。１人１人に ID が付く日。

2002/01/16 (Wed)
　また起きるの辛かった。ぷらら（ AirH" ）が継ながらないのがムカツ
ク〜。寝る前に髭剃り。ハードディスクに毎日録画。そしてマジレス。電波
届いてるし。

2002/01/17 (Thu)
　今日は仕事中眠くなかった。スケジュールに余裕もあるし。ラブひな最終
巻はなかなかいい感じ。っつーかツボ。ぷららに継ながるようになったけ
ど……。リブレット買おう感ダウン。 VC5 と Win2K の相性が……。

2002/01/18 (Fri)
　久々徹ゲー。さすがに辛い……。お仕事は FAX 。あのシステム１台欲し
いかも。眠い……。

2002/01/19 (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 7.21
タイマーの限界

「今回はこれまでのまとめみたいな感じ」
『いよいよアニメーション！』
「の幻想をうち砕くっていうか」
『げげ』
「まずは、 Ver 7.18 ( No.138 ) のタイマーの機能と、
Ver 7.19 ( No.139 ) のランダムを組み合わせてみます」
『ほいほい』
「まずは、ダイアログが表示される時に呼ばれる 
CAnimeDlg::OnInitDialog() から」

BOOL CAnimeDlg::OnInitDialog()
{
// 略。
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    ::SetTimer
        ( GetSafeHwnd()
        , 100    // タイマー ID 。
        , 125    // タイマーのインターバル。
        , NULL
        );

    return TRUE;  // TRUE を返すと（略）。
}

『この API でタイマーがオンになるんだよね』
「そうそう。次は、そのタイマーをオフにする部分」

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

『これも 7.18 のと同じね』
「最後に本命、タイマーから呼ばれる関数」

void CAnimeDlg::OnTimer(UINT nIDEvent) 
{
    time_t lTime_t;
    time( &lTime_t );
    srand( lTime_t );

    // ランダムに３色作成。
    const int iRed = rand() % 256;
    const int iGreen = rand() % 256;
    const int iBlue = rand() % 256;
    // その３色でブラシを作ります。
    HBRUSH hBrush
        = ::CreateSolidBrush( RGB( iRed, iGreen, iBlue ) );

    RECT stRect;
    ::GetClientRect( m_cCanvasStatic.GetSafeHwnd(), &stRect );
    HDC hDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    ::FillRect( hDC, &stRect, hBrush );
    ::DeleteObject( hBrush );
    ::ReleaseDC( m_cCanvasStatic.GetSafeHwnd(), hDC );

    CDialog::OnTimer(nIDEvent);
}

『おおっ、ランダムが使われてる！』
「 7.18 では少しずつ色を変えていったけど、今回はランダムで色を変えて
いきます」
『ってことは、その時使った m_iRed ってメンバ変数は？』
「もう必要なし」
『あらま。あれ？　% って何？』
「これは【割り算の余り】を計算する演算子。 rand() ってテキトーな整数
値が出てくるでしょ」
『うん、出てきた』
「でも、 RGB に使えるのは 0 から 255 までの整数値。そこで % を使いま
す。整数値を割った時の余りは、 0 から割る数 - 1 の間に入るから」
『 256 で割った余りなら、必ず 0 から 255 の間に入るわけね』
「これは乱数を使う時によく使う方法だから憶えておいてね。じゃ、これを
試してみて」
『ほい、ビルドして実行！　……なんか……』
「ものすごーく紙芝居っぽい感じでしょ」
『紙芝居って言い得て妙ねー』
「言い得て妙、ってのもなんか……」
『ってゆーか、なんでこんなに変なの？　だって、タイマーの間隔って 
SetTimer() の第３引数だよね』
「そう、単位はミリセカンド、つまり１秒の千分の１」
『ってことは 125 は８分の１秒だよね。なんでこんなにパラパラな感じな
の？』
「それは、タイマーってものの性質と、メッセージそのもののシステムを理
解しないと」
『な、なんか複雑そう……』
「うん、その辺は複雑。今年はその方向へと掘り下げていく１年になりそう
かな」
『新年の抱負にしてはなんか……』
「とりあえず今回は、どんな感じになってるかって説明だけ。実際に見てい
くのは少し後ってことで」
『はーい』
「まずメッセージの復習。 Ver 5.27 ( No.092 ) を読み返して」
『メッセージって SendMessage() で送れるんだよね』
「その送られたメッセージはウィンドウプロシージャで受け取るってことも
確認してね」
『ほい。次の Ver 5.28 ( No.093 ) もその関係だよね』
「そうそう、イベントとメッセージの関係。で、今回の復習だけど」

BOOL CAnimeDlg::OnInitDialog()

「も」

void CAnimeDlg::OnPaint() 

「も」

void CAnimeDlg::OnBDraw() 

「も」

void CAnimeDlg::OnDrawItem
    (int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 

「も」

void CAnimeDlg::OnTimer(UINT nIDEvent) 

「も、ぜーんぶイベント」
『どゆこと？』
「たとえば CAnimeDlg::OnInitDialog() は、ダイアログが作られて表示さ
れるってイベントが起きた時に、ウィンドウプロシージャに 
WM_INITDIALOG ってメッセージが送られてきて、それを MFC が受け取って 
CAnimeDlg::OnInitDialog() を呼び出すって仕組みになってます」
『送られてくるって、どこから？』
「ウィンドウズそのものから」
『ウィンドウズが SendMessage() するような感じ？』
「そんな感じ。ウィンドウズは、どんなちっちゃなイベントが起きた時で
も、そのイベントに合わせてメッセージを送ってきます。同じように、他
のメンバ関数も」
『メッセージが送られてきて呼ばれる？』
「そう。 CAnimeDlg::OnPaint() は WM_PAINT は〈描画して欲しい〉って度
に送られてきて、それを MFC のウィンドウプロシージャが受け取って 
CAnimeDlg::OnPaint() を呼び出すって仕組みになってます」
『再描画ってイベントでメッセージが送られてくるわけね』
「今はこの、メッセージを受け取って、そこからメンバ関数が呼ばれるま
でって部分が見えてないからよく分かんないだろうけど、いつかそれが見え
ればどういうことか分かってくると思うから」
『いつかなぁ』
「近いうちに教えるから大丈夫。で、タイマーの話。 SetTimer() を呼ぶ
と、一定時間ごとにウィンドウズが WM_TIMER ってメッセージを送ってくる
ようになります」
『〈一定時間〉がイベントってことね』
「そゆこと。ところが、このメッセージは特別で、他のメッセージより優先
度が低いんです」
『 WM_PAINT とかよりも？』
「そう、そういうメッセージが WM_TIMER の後ろに控えている場合には、 
WM_TIMER を無視して他のメッセージを先に受け取るような仕組みになって
るんです」
『あ！　だからこんなにがたがたになるんだ！』
「そゆこと。これは、ウィンドウズのタイマーの仕様だから、どうしようも
ないかな」
『そんなー。じゃあこのアニメーションってできないの？』
「今はね。将来的にはできるようになってもらうけど。ちょっとかじってみ
ようか。 CAnimeDlg::OnInitDialog() の前にこの関数を置いて」

unsigned int _stdcall DrawThread( void *p_pvPara )
{
    time_t lTime_t;
    time( &lTime_t );
    srand( lTime_t );

    HWND hCanvasWnd = (HWND)p_pvPara;
    int iRed;
    int iGreen;
    int iBlue;
    HBRUSH hBrush;
    RECT stRect;
    ::GetClientRect( hCanvasWnd, &stRect );
    HDC hDC = ::GetDC( hCanvasWnd );

    while( 1 )
    {
        iRed = rand() % 256;
        iGreen = rand() % 256;
        iBlue = rand() % 256;
        hBrush = ::CreateSolidBrush( RGB( iRed, iGreen, iBlue ) );
        ::FillRect( hDC, &stRect, hBrush );
        ::DeleteObject( hBrush );

        Sleep( 50 );
    }

    ::ReleaseDC( hCanvasWnd, hDC );
    return TRUE;
}

『普通の関数だね。あ！　これって Ver 7.18 ( No.138 ) の無限ループと
やってること同じじゃん！　嫌！　また止まっちゃう！』
「これが止まらないんだよね」
『へ？』
「あ、あと CAnimeDlg::OnInitDialog() の SetTimer() のとこを」

BOOL CAnimeDlg::OnInitDialog()
{
// 略。
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    HANDLE hCoreThread;
    DWORD dwCoreThreadId;
    hCoreThread
         = (HANDLE)_beginthreadex
                ( 0, 0, DrawThread
                , ( void * )( m_cCanvasStatic.GetSafeHwnd() )
                , 0, ( unsigned int * )( &dwCoreThreadId ) 
                );

    return TRUE;  // TRUE を返すと（略）。
}

「に置き換えて」
『うわ、アンダーバー付いてる謎な関数……とりあえずビルドして実行。お
おっ！　ちかちかしつつもちゃんといろんな色が！！　かなり早い！』
「これは【マルチスレッド】って機能。少し先になるけど、これもいつか教
えるからねー」
『うん、とりあえずやり方はあるってことが分かっただけでもいいかも』

/*
    Preview Next Story!
*/
『ってゆーか、こういう方法って教えてもらわないと分かんないよね』
「そのために教えてるんだけど」
『はいはいはい』
「あ、そういう意味じゃなくて、そうなんだけど」
『？？』
「火美ちゃんも自分で調べられないとね、って話」
『調べられるのかなぁ』
「というわけで次回」
＜ Version 7.22 情報の見つけ方 ＞
『につづく！』
「実は次回、デバイスコンテキスト編最終回」
『げ！　なにいきなり！』


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

