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

    KAB-studio.h


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

    送信日： 2001/11/05(Mon) No.131
    配信数： 3780 ( 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/10/28 (Sun)
　やる気なくてのんびり。なんとかぷらとわ２話くらい。今日初めて見た
００９は微妙。そしてスクリプト。やっぱり DHTML がらみがいいかな？

2001/10/29 (Mon)
　会社ですごく眠かった……。あんまりプログラミングしなかったから？　
帰ってからは１１月表紙壁紙。ほぼ完成（爆）。やっぱこの絵柄って早いの
かも。

2001/10/30 (Tue)
　１１月表紙壁紙完成！　基本はただ塗りたくっただけ。いろんな色で、タ
ブレットでがしがし。絵柄的にはやっぱりセル塗りがいい？　お仕事は今日
もなぜか眠い……。 Windows2000 が落ちるらしい、ただのコンソールプロ
グラム。

2001/10/31 (Wed)
　今日も眠い。なんでこんなに眠いのか。ミス多いし。モチベーションは結
構高いのに。ちょっと AirH" 良くなってきたかな？

2001/11/01 (Thu)
　資料作りに、飛び入りのプログラム作成。こんなのに１時間半もかかるな
んて……。午後はソルパック月例会議。サッカー日本代表の波戸って人が来
てた……けど知らない（爆）。

2001/11/02 (Fri)
　お仕事はちょっと順調。帰ってからはのんびり。 BREGEXP ってものを発
見。これで VC で置換機能付き正規表現ができそう〜。アニメはヴァンド
レッドの 3DCG にほれぼれ。そして今忙しそう？　今は大丈夫かも。

2001/11/03 (Sat)
　のんびり〜。カビたホールトマト。北条時宗は相変わらずっつーか。関西
弁モード ATOK に期待大！　でも……。


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

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

　高速を走り抜けるトラック。別になんでもない、ごく普通のトラック。
　意外とこういう車にアヤシイ物を積んでいるんじゃないかと思う事はあっ
ても、実際にそうだと確信することは、まああんまりない。
　だが、そのトラックには、ちゃんとアヤシイ物が積まれていた。
　トラックの助手席で、青年は例によって笑みを消すことなく、流れていく
高速の灰色い壁を眺めていた。その脇で、運転手はできる限り冷静を装いな
がら運転をしていた。
　青年は、視線を運転手の方へと向けた。
「君……」
　その止まった時間に入る瞬間運転手の瞳孔が開くのを、青年は思わず声を
出しそうなほどうれしそうに見ていた。
「……くれぐれも、事故は起こさないでくれよ。そんなことになったら、本
当に大変なことになる、そう……」
　その空白の間は、運転手は考える余裕があった。だったらしゃべるな！　
そう心の中で叫んでいた。
「……君に死んでもらわなければならないだろうしね」
　その言葉に、青年は本当に事故を起こしそうになった。ぐらりと一瞬車が
傾く。その角度はそれほどではなくても、運転手はまさに倒れそうな程だと
感じた。
　また元の状態に戻り、バネというバネが跳ねると、後ろの荷台から形容し
たくない音が発せられた。
「おいおい……」
　その言葉の途切れは、青年の怒りが作らせた、そう感じた。実際に運転手
はその顔を見たわけではないが、顔の左半分でその視線を受けていれば、正
面向けて顔を見合わせられるものではなかった。
　もちろん、心臓は高鳴り冷静さは失い、汗でハンドルは滑り、まっすぐ走
ることでさえ精一杯の状況で、よそ見はそうできるものではなかった。
「もしここで放たれるなんてことになったら……」
　運転手には、またか、と思う余裕はなかった。
「コントロールを失って、がぶりと食べられちゃうかもしれないぞ」
「た、食べられる！？」
　思わず運転手はそう声を上げた。トラックの積み荷が怪しいものだとは
知っていたし、生き物だということも知っていたが、それがどのような生き
物かは知らなかったし、条約違反になる動物くらいにしか考えていなかっ
た。
　そんなことよりなにより、隣に座る青年の恐怖がそういったことまで頭を
回らさせなかった。
「い、生き物ってどんなのなんすか？」
　運転手は、恐怖を紛らわすこともあってそう青年に語りかけた。
「君……」
「は、はひぃ？」
　その声は裏返っていた。このときの青年の沈黙は、これまでで一番長いと
運転手は感じていた。
「……初めて話しかけてくれたね」
「！？　はぁ……」
　想像とはいちばんかけ離れた答え方に、運転手は拍子抜けした。
「動物なんだ、とっても高い、ね。でも、うちで作っているのもの中では安
い方かな？」
「作ってるって、なんです？」
「ふふ？　……調子に乗ると結構おしゃべりになるんだね、君」
　再び沸き上がった恐怖が、運転手の声を封印していた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『今度の水曜は Java メルマガの日？』
「そうみたい。タイトルは〈継承とスーパーとサブと〉」
『北島？』
「……なんとコメントしたものか……」
『イヤ、ごめん。で、継承は知ってるけど』
「じゃあ火美ちゃんも分かるね。スーパークラスは親クラス」
『ってことはサブクラスが子クラスっちぇことに？』
「そゆこと」
『……そのメルマガ、読む必要ないじゃん』
「そうでもないよ。なんでスーパーが親クラスだと思う？　機能的には」
『確かに逆ね。サブクラスの方がスーパークラスよりできること多いし』
「ってことを解説してるのが、今度の水曜に出る号の内容」
『でもそれって、プログラミングに関係あるの？』
「あるんだ、これが」
http://www.kab-studio.com/Programing/JavaOOP/
_______________________________________________________________[KCM]


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


　Version 7.11
クリッピングではみ出さない！

「今回も引き続きデバイスコンテキストの話。まずはこれから」

void CAnimeDlg::OnBDraw() 
{
    HDC hCanvasDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    HBRUSH hBrush = CreateSolidBrush( RGB( 0, 0, 255 ) );

    RECT stRect;
    ::GetClientRect( m_cCanvasStatic.GetSafeHwnd(), &stRect );
    // 縦に２倍。
    stRect.bottom *= 2;

    ::FillRect( hCanvasDC, &stRect, hBrush );

    ::DeleteObject( hBrush );
}

『うお、 IDC_S_CANVAS からはみ出した！』
「はみ出るようにわざと縦に２倍してるからね」
『つまり、座標をウィンドウの外に持っていったら、そこも描画しちゃ
うってわけね』
「同じアプリケーションの中でだけどね。このように、デバイスコンテキス
トは勝手には〈はみ出ないよう注意する〉ってことをしません」
『つまり、描画するときに自分ではみ出ないかどうかチェックしろってこと
ね』
「いや、そういうわけじゃなくて、〈描いていいのはこの範囲だけ〉ってこ
とをデバイスコンテキストに指定できるんです」
『あ、それを使えば気にせずできるんだ』
「そゆこと。で、それを使うために必要なものがあるんで、まずそれを使っ
てみましょう」
『ってことは今回は憶えることが結構あるのね……』
「そゆこと。まずは【リージョン】から」
『りーじょん？』
「リージョンは英語で region 、〈領域〉って意味。デバイスコンテキスト
上を〈領域で囲む〉時に使いもの」
『そっか、それで〈描ける範囲〉を囲めばいいわけだ』
「そゆこと。と、その前にリージョンだけ使ってみます」

void CAnimeDlg::OnBDraw() 
{
    HDC hCanvasDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    HBRUSH hBrush = CreateSolidBrush( RGB( 0, 0, 255 ) );

    // リージョンを作ります。
    HRGN hRgn;
    hRgn = ::CreateRoundRectRgn( 0, 0, 50, 50, 30, 30 );
    // リージョンで囲んだ部分だけ塗り潰します。
    ::FillRgn( hCanvasDC, hRgn, hBrush );

    ::DeleteObject( hBrush );
    // リージョンを削除します。
    ::DeleteObject( hRgn );
}

『あ、なんか面取りされた四角が出た』
「まず CreateRoundRectRgn() で、こういう面取り四角の領域を作ります。
ここで作るのは領域だけだからね」
『つまり、ここで青く塗り潰されてるとこを囲んでる線を作ってるってこ
と？』
「そう、その線だけを作ってるわけ。リージョンは枠線だけ。作っただけ
じゃ見えないけど、その分、いろんな事に使えます」
『というわけで FillRgn() で塗り潰してるわけね』
「これは FillRect() と同じく、リージョンで囲まれた範囲を塗り潰す 
API 」
『で、最後に削除と。これまでの応用って感じ』
「基本的なルールは同じだからね。で、ここで重要なのは、リージョンは複
雑な図形も表せるってこと」
『そういえば、この面取り四角って結構複雑よね』
「でしょう。それに、これよりもっと複雑なのもできるから、それを使えば
それで複雑な図形の塗りつぶしとかもできるわけ」
『おお！　これって結構便利そう』
「ま、その分、データの管理が面倒だけどね」
『確かに、そういう複雑な図形って使うの面倒そう……』
「ま、今回はそういう複雑なのはパス。リージョンっていう、複雑な領域を
囲む線を作れるってことを憶えといて」
『あ、領域ってことは、ちゃんと囲んでないとダメ？　途中で線が途切れて
るとか』
「っていうのはリージョンになりません。リージョンは必ず閉じてないと使
えないからね」
『確かに、塗りつぶしとかできないもんね』
「では今回の本題」
『はみ出させない方法ねー』
「基本的には今のと同じ。塗り潰す範囲をリージョンで囲んで、塗り潰すだ
け。では実際にやってみましょう」

void CAnimeDlg::OnBDraw() 
{
    HDC hCanvasDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    HBRUSH hBrush = CreateSolidBrush( RGB( 0, 0, 255 ) );

    RECT stRect;
    ::GetClientRect( m_cCanvasStatic.GetSafeHwnd(), &stRect );

    // リージョンを作ります。
    HRGN hRgn = ::CreateRectRgnIndirect( &stRect );
    // そのリージョンでクリッピングします。
    ::SelectClipRgn( hCanvasDC, hRgn );

    // 塗りつぶしは縦に２倍。
    stRect.bottom *= 2;
    // 塗り潰し。
    ::FillRect( hCanvasDC, &stRect, hBrush );

    ::DeleteObject( hBrush );
    ::DeleteObject( hRgn );
}

『う、長……っと、最初２行は塗るとこのデバイスコンテキストを取って、
ブラシを作ってと。その次に塗るとこの範囲を取ってきてと』
「リージョンはこの範囲にすればいいわけ」
『それが CreateRectRgnIndirect() って API で一発でできちゃうわけね。
これは便利かも』
「で、ここで使うのが SelectClipRgn() って API 。これを使うと、デバイ
スコンテキストにリージョンをくっつけることができるんです」
『つまりブラシとかをくっつけるのと同じね。あれ？　でもそれだったら
SelectObject() じゃないの？』
「 SelectObject() でももちろん大丈夫だよ。 SelectObject() のリファレ
ンス見てみて」
『ちゃんと CreateRectRgnIndirect() で作ったリージョンも大丈夫って書
いてあるね』
「でも SelectClipRgn() でも同じ。このリージョン、ペンとかとなんか違
うでしょ」
『そういえば、あのめんどい入れ替えがないね』
「そう。リージョンはペンなんかの他の GDI と違って、デバイスコンテキ
ストが持つのはオリジナルのコピーなんです」
『コピー？』
「そう、 SelectClipRgn() した時、 CreateRectRgnIndirect() のコピーが
作られてそれを デバイスコンテキストが持つんです」
『それで入れ替えがいらない？』
「入れ替える前のは必ずどっかで作られてるはずだからね。それに、デバイ
スコンテキストは最初、リージョンを持ってない状態だから」
『最初に持ってるのを取っておく、って必要がないわけね』
「この辺はリージョンの特別なところかな。で、あとはこれまでと同じ」
『わざとはみ出るように塗り潰しても、っと、まだ実行してなかった。実
行！　お、ちゃんとはみ出てない！ IDC_S_CANVAS ギリギリぴっちりまで塗
られてる！』
「あとはブラシとリージョンの削除」
『すごいねー』
「この、はみ出さない領域を作ることを【クリッピング】って言います」
『くりっぴんぐ？』
「クリッピングは英語で clipping 、切り取って抜き出したもの、切り抜き
とかそういう意味があります」
『そういえばミュージッククリップとか言うもんね』
「このふたつを組み合わせて【クリッピングリージョン】って言うのが一般
的かな。クリッピングの機能そのものは他の OS とかにもあるから」
『憶えると便利そうねー。それにしても、こういうふうに簡単にできちゃう
となんか自然な感じ』
「ちゃんとクリッピングされてるって確認するなら」

    HRGN hRgn = ::CreateRectRgnIndirect( &stRect );

「を」

    HRGN hRgn
        = ::CreateRoundRectRgn
        ( stRect.left, stRect.top
        , stRect.right, stRect.bottom
        , 50, 50 );

『あ、角丸めバージョン』
「にすれば、角が丸まるから」
『クリッピングされてるのが分かるね。これだけで、もうはみ出る心配はな
いわけねー』
「簡単でしょ？」
『うーん、確かにひとつひとつは簡単なんだけど……』
「そ。プログラミングのポイントはそこだね。ひとつひとつは簡単。で、そ
れを守ることが大切」
『どゆこと？』
「今はただ塗り潰すだけだから CAnimeDlg::OnBDraw() の中だけでいいけ
ど、もっと複雑なことをすることになると」
『いろんなメンバ関数で色々する？』
「そういうふうになってくると、ものすごくごちゃごちゃしてきて、ひとつ
ひとつは簡単でも」
『絡み合って複雑になっちゃう』
「実は火美ちゃんが言うことももっともで、このプログラムも結構複雑な方
なんだよね」
『やっぱ、いろんなのが入ってるから？』
「そう、デバイスコンテキスト取得して、ペン用意して、リージョン作っ
て、っていっぺんにやっちゃってるからね」
『え？　でもバラバラにしちゃったらごちゃごちゃになっちゃうって、さっ
き水希ちゃん言ったじゃない』
「そう、だから適度にバラバラにする、っていうか、他の方法でまとめるの
が重要かな。そのへんはまた今度ね〜」

/*
    Preview Next Story!
*/
『あ、今日は短い』
「毎回２００行きっかりって結構大変かも……」
『オーバーすることもあるもんね』
「今回なんかも、書くとかなりオーバーするから」
『２回に分けるわけね』
「というわけで次回」
＜ Version 7.12 文字を書こう！ ＞
『につづく！』
「短い回があるってことは、全体的には増えることになるかも」
『そんなんばっかりだから……』


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