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

    KAB-studio.h


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

    送信日： 2001/11/26(Mon) No.134
    配信数： 3770 ( 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/18 (Sun)
　Suica へ移行！　でも使い勝手はあまり変わらない？(汗)　あとは荷物受
け取ったりホットハーブ描いたり。料理はボンゴレ。でもなんか……。テレ
ビは爆笑オンエアバトルのパペットマペットでしょう。そしてまんがサイエ
ンスとミューカード。

2001/11/19 (Mon)
　残業〜。自分メインのプロジェクトだから疲れてない？　プロトタイプお
披露目に間に合わせないと。そして Suica 関西方面。やっぱ Suica 便利か
も。

2001/11/20 (Tue)
　今日は６時半。スケジュールはやや遅れ。経験してないことだからちょっ
と不安。 Suica 、使ってる人見かけない……。

2001/11/21 (Wed)
　風邪らしいです。仕事は順調？　でもちょっと押せ押せ。 Rez はまだ出
てない……。アニメはスクライドがいい感じ〜。それにしても風邪が。まだ
酷くないけど。

2001/11/22 (Thu)
　Rez やりまくりー。エリア５から俄然いい感じ。やってると飛んじゃいま
す。お仕事はデータ作りメイン。お昼休みに Rez を購入。夕方に KSK の人
と面接。そしてちょっと残業。有料化の壁。アダルトサイトでそれじゃ、
Java メルマガの購読登録数も納得……。

2001/11/23 (Fri)
　遊んでばかりの一日。ってそのまえに、フルバ録れ損ねた(泣)。抜本的解
決が必要、でもお金が……。 Rez は無敵モードまで。新しい面は出てくるの
かな。基本情報技術、受かってました。勤労感謝、されたい……。 CM のコ
ラボレーションってすごいかも。ごはんはピザ。そして Rez と SEGA 。

2001/11/24 (Sat)
　１２月表紙壁紙完成！　今回はクリスマス、だけど出来は……。セル塗り
自体久しぶり。超個人的にはこのメリハリのある絵柄好きなんだけど、難題
多し。 Rez はちょっとやる気が(汗)。ビデオに録っておくことに。攻略方
は弾をいかに消すか。重要なのは冷静さと記憶力。


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

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

「……来る」
　少女は、そう小高い丘を見上げて言った。短い金色の髪、青い瞳、隣で座
る少年より少し高い背。白のシャツにタイトジーンズ。その表情は、冷たい
と感じられるが、何らかの意志も感じられる。
「どうするの？」
　少年ではなく左洋一の方を向いて、訊いた。
「リシュネはとりあえず、見てればいいよ」
　洋一の代わりに、少年が答えた。
「……つまらない、それ」
　一瞬屈み、バネのようにリシュネは飛び上がった。
「リシュネ！」
「ん！」
　少年は心配そうに見上げ、洋一は満面の笑みをたたえていた。
　丘の頂上に舞がたどり着いたとき、その目の前を人影が上っていった。
「何！？」
　舞は、その飛んでいったリシュネから感じるものを頼りに、その影を追っ
ていく。上を見上げ、後ろを振り返る。そこには息を切らせて走ってきた男
がいた。
　木々をわずかに揺らして、その男のすぐ隣にリシュネは降りた。なぜか、
泥の地面が跳ね返らなかった。
「ひっ！？」
　男は突然の存在に尻餅をついた。ゆっくりと、木々の中から常緑樹の葉が
落ちてくる。リシュネは舞を見る。その瞳は、眺めているようにも見えれ
ば、値踏みしているようにも見えれば、見下しているようにも見えた。
「あなたが、結白、舞」
「あたしも有名よねぇ」
　体の周りにまとう水の流れを、右手に集中させる。その間も、舞は目の前
の敵から目を離さない。一目で欧米人だと判る容姿。その青い瞳が、舞を見
つめている。
「ダメだ」
　リシュネはそういい放つと、隣にしゃがみ込む男の方へと向いた。
「驚かせて、ごめんね」
　一瞬しゃがみ込み再び大きく飛び上がった。舞は頭上から攻められるとい
う恐怖に駆られて身構えるが、リシュネは木々を越え、来た時の軌道にそっ
て飛んでいき、洋一の前へと音もなく着地した。
　舞は公園の端へと走り、下を見下ろした。木々が途切れ差し込む日差しが
まぶしい中、泥の斜面の脇、柵の外に三人の人影を見つけていた。ひとりは
リシュネ、ひとりはあの少年。だが、残りのもうひとり、眼鏡を掛けた男に
は見覚えがなかった。
「これはこれは初めまして、結白舞さん」
　洋一は、うやうやしく礼をした。
「左洋一といいます。今後ともよろしく」
　左、洋一――眼鏡と唇の笑みはその男の表情を隠し、不敵さを醸し出して
いた。舞は、洋一がこの三人の中で一番強いと感じた。だが、なぜか他のふ
たりと違い、特殊な力を感じさせなかった。
　もうひとりいるという方にも、その力を感じなかった。よく考えれば、
こっちの三人はだいたい場所が判っていたのだから、もうひとりの方を先に
行っておけば良かった。
　ま、今から思いついてもしょうがない。そのもうひとりの方はおいておい
て、目の前の三人、特に初対面のふたりに注意を向けていた。
「リシュネ、どうしたんだ？」
　少年は心配そうに訊ねた。
「あの人、強い……私じゃかなわないかもしれない、それだけよ」
「堅実なんだね」
「いやいや、それでいいよリシュネ」
　そう洋一は肯定した。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『最近ゲームづいてるねー』
「ま、年末はクリスマスシーズンだからいっぱい出るからね」
『またそういう当たり障りのない……そういえば、ゲーム作らないの？』
「ゲームは１人じゃ作れないよ」
『そう？　音楽なしで、 3D のだったら作れそうだけど』
「無理無理。 3D のデータも、ちゃんとしたツールで作るのがほとんど」
『それでいいんじゃないの？』
「 3DCG って作るの大変なんだよ……」
『そういうもんなのねー。ゲーム作成講座とかやれば人気でそうなのに』
「というか、火美ちゃんはゲーム作りたいの？」
『……作りたいっていうより、出たい……』
「なるほど……」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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

　Version 7.14
ハンドルの管理

「今回は、ちょっと総合的なプログラムを作ってみましょう」

void CAnimeDlg::OnBDraw() 
{
    HDC hCanvasDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );

    // クリッピングします。
    RECT stRect;
    ::GetClientRect( m_cCanvasStatic.GetSafeHwnd(), &stRect );
    HRGN hRgn = ::CreateRectRgnIndirect( &stRect );
    ::SelectClipRgn( hCanvasDC, hRgn );

    // フォントの横幅を広げます。
    HFONT hCurrentFont
         = (HFONT)::GetCurrentObject( hCanvasDC, OBJ_FONT );
    LOGFONT stLogFont;
    ::GetObject( hCurrentFont, sizeof( stLogFont ), &stLogFont );
    strcpy( stLogFont.lfFaceName, "ＭＳ 明朝" );
    stLogFont.lfWidth = 50;
    HFONT hFont = ::CreateFontIndirect( &stLogFont );
    HFONT hOldFont = (HFONT)::SelectObject( hCanvasDC, hFont );

    // 文字列を書き込みます。
    const char pchText[] = "あいうえお";
    ::TextOut( hCanvasDC, 0, 0, pchText, strlen( pchText ) );

    // 後片付け。
    ::SelectObject( hCanvasDC, hOldFont );
    ::DeleteObject( hFont );
    ::DeleteObject( hRgn );
}

『ながーい！！』
「って言っても？」
『う”……まぁ、確かにどれも一度見たことのある API だし、ちゃんと使
い方教えてもらったのばかりだけど』
「でしょう。これは前回言った、文字がはみ出るのをクリッピングで防ぐ
例」
『ホントだ、横幅広げても、ちゃんとはみ出ずに書かれてる』
「で、基本は」

準備
処理
後片付け

「の３ステップ」
『準備がやたら多いね……』
「だね。〈どういう風に描くか〉も処理の一種なのかもしれないけど」
『でもどっちかってゆーとやっぱ準備だと思う』
「で、これがたった３ステップでも、実際には複雑。それは、データが多い
から」
『確かにハンドルだけでも５つもあるものね』
「５つならなんとかなるんだけど、これ以上増えると……。で、こういうと
きは、うまく〈まとめる〉と、データが多くなっても管理しやすくなりま
す」
『まとめるってどういうふうに？』
「それがね……」
『な、なに？　なんでテンション落ちるの！？』
「いくつか方法はあるんだけど、僕自身、こういうときはこうするのがい
い、っていう明確なのはなくてねー」
『経験と勘ってヤツね』
「だから、今回は方法と、メリット・デメリットの紹介をするから、あとは
一緒に勉強ってことで」
『なんだかなー』
「まとめ方は３通り。まずひとつは、データと処理をくっつける方法」
『どゆこと？』
「あるデータにはこういう処理が必要、っていうのはだいたい決まってるか
ら、それをペアにするってこと。そうすれば、全然関係ないデータに不必要
な処理をする必要がなくなるわけ」
『？』
「たとえばさ、さっきの hOldFont は元々あるフォントのハンドルだから、
DeleteObject() しちゃいけないけど、このままだと」
『確かに、間違えてしちゃったりとかしそうだよね』
「そこでその実現方法として、クラスを使います」
『そういえば、クラスならハンドルがメンバ変数になって中に入ってるんだ
もんね』
「 MFC のものそのものじゃあまり使えないけど、とりあえず使ってみます」

void CAnimeDlg::OnBDraw() 
{
    CDC *pcCanvasDC = m_cCanvasStatic.GetDC();

    // クリッピングします。
    CRect cRect;
    m_cCanvasStatic.GetClientRect( &cRect );
    CRgn cRgn;
    cRgn.CreateRectRgnIndirect( &cRect );
    pcCanvasDC->SelectClipRgn( &cRgn );

    // フォントの横幅を広げます。
    CFont *pcCanvasFont = pcCanvasDC->GetCurrentFont();
    LOGFONT stLogFont;
    pcCanvasFont->GetObject( sizeof( stLogFont ), &stLogFont );
    strcpy( stLogFont.lfFaceName, "ＭＳ 明朝" );
    stLogFont.lfWidth = 50;
    CFont cFont;
    cFont.CreateFontIndirect( &stLogFont );
    CFont *pcOldFont = pcCanvasDC->SelectObject( &cFont );

    // 文字列を書き込みます。
    const char pchText[] = "あいうえお";
    pcCanvasDC->TextOut( 0, 0, pchText, strlen( pchText ) );

    // 後片付け。
    pcCanvasDC->SelectObject( pcOldFont );
}

『……なんかあんま変わんない、っつーか、混乱する……』
「 API で書いたのと MFC で書いたのとは、やっぱ違うからね。で、 MFC 
を使うと、まず DeleteObject() を明示的に呼ばなくていいっていうメリッ
トがあります」
『 Ver 7.03 ( No.123 ) で言ってた、自動的に削除されちゃうって機能が
あるからいらないんだ』
「その回で言ったけど、ポインタならそういうの関係ないし」
『ホントだ、元からあるのは全部ポインタで受け取ってるんだ』
「 MFC がそうできているからね。ハンドルの時は、全部同じハンドルだっ
たけど、 MFC のクラスを使えば」
『とりあえず元からあるのと新しく作ったのは区別できるわけだ』
「そゆこと。でも実際、まだまだ複雑」
『というわけで他のまとめ方は？』
「ふたつめのまとめ方は、さっきの３ステップ〈準備・処理・後片付け〉を
まとめること。でもこれは不可能」
『不可能？　あ、後片付けは最後にしなきゃいけないんだ』
「そゆこと。場合によっては先に後片付けできるものもあるんだけど、この
場合はそれができないから」
『質問！　その３ステップをまとめるとどういういいことがあるの？』
「後片付けができれば、そのとき片付けた変数はもう使われないってことだ
から、そこから後の処理では無視していいでしょ」
『つまり、変数をポイしちゃって、変数を減らしちゃうわけね』
「そういうこと。そうすれば実質的なデータ数が減るから、複雑さも減るか
らね」
『うんうん。で、３つ目のまとめ方は？』
「３つ目は、〈準備・処理・後片付け〉ごとにまとめる方法。一番最近だ
と…… Ver 5.35 ( No.100 ) の中で使ってる OnInitDialog() を思い出し
て」
『えーっと、ダイアログが作られる時に呼ばれるメンバ関数だよね』
「そうそう。そこで、リージョンとフォントを先に作っておきます。でも、
そのために、 CRgn と CFont は CAnimeDlg のメンバ変数にしておきます」
『なぜに？』
「そうしないと、 CAnimeDlg::OnInitDialog() で作った変数を 
CAnimeDlg::OnBDraw() の中で使えないから。普通の変数だと関数から出た
ら消えちゃうからね」
『そっか、メンバ変数ならずっとあるし、どのメンバ関数からも使えるか
ら』
「というわけで、 AnimeDlg.h の中を」

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

『この m_cRgn と m_cFont がメンバ変数になるんだよね』
「そうそう。次に CAnimeDlg::OnInitDialog() に次の部分を追加します」

BOOL CAnimeDlg::OnInitDialog()
{
// 略。
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    // 以下から追加。
    CDC *pcCanvasDC = m_cCanvasStatic.GetDC();

    // リージョンを作ります。
    CRect cRect;
    m_cCanvasStatic.GetClientRect( &cRect );
    m_cRgn.CreateRectRgnIndirect( &cRect );

    // フォントを作ります。
    CFont *pcCanvasFont = pcCanvasDC->GetCurrentFont();
    LOGFONT stLogFont;
    pcCanvasFont->GetObject( sizeof( stLogFont ), &stLogFont );
    strcpy( stLogFont.lfFaceName, "ＭＳ 明朝" );
    stLogFont.lfWidth = 50;
    m_cFont.CreateFontIndirect( &stLogFont );

    // 追加ここまで。
    return TRUE;  // TRUE を返すとコントロールに設定した（略）。
}

『やってることは同じね、さっきと。変数がメンバ変数になってるだけ』
「メンバ変数はメンバ変数が入ってるクラスができたときにはもう作られて
るからね。で、いつものとこは」

void CAnimeDlg::OnBDraw() 
{
    CDC *pcCanvasDC = m_cCanvasStatic.GetDC();
    pcCanvasDC->SelectClipRgn( &m_cRgn );
    CFont *pcOldFont = pcCanvasDC->SelectObject( &m_cFont );

    // 文字列を書き込みます。
    const char pchText[] = "あいうえお";
    pcCanvasDC->TextOut( 0, 0, pchText, strlen( pchText ) );

    // 後片付け。
    pcCanvasDC->SelectObject( pcOldFont );
}

『ここも同じね、メンバ変数になってるだけで』
「ここで入れ替えをして、文字を書き込んで、入れ替えを元に戻します」
『ビルドして実行、うん、結果同じ！　……でもさ、なんでここで入れ替え
してんの？』
「ぎく！」
『 CAnimeDlg::OnInitDialog() でやればいいじゃん。なんでわざわざ』
「いや、僕にもよく分からないんだけど、 CAnimeDlg::OnBDraw() を読んだ
後とかは、常に最初の状態、つまり pcOldFont とかがセットされた状態に
なってるんだよね……」
『……つまり水希ちゃんにも理由が分からない、と』
「はい……」

/*
    Preview Next Story!
*/
『もしかして、水希ちゃんって意外とダメダメなんじゃない？』
「ギク！」
『ぎくって何よぎくって』
「……次回、謝らなきゃいけないことが……」
『なんですとーっ！？』
「というわけで次回」
＜ Version 7.15 再描画できるように ＞
『につづく！』
「デバイスコンテキストまわりって、想像以上に複雑……」
『教える人間がそういうこと言うな！』


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

