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

    KAB-studio.h


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

    送信日： 2001/11/19(Mon) No.133
    配信数： 3800 ( 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/

2001/11/11 (Sun)
　１並び。なんかのんびり。 ReleaseDC() 忘れてた……。ジオブリ結構良
かったなー。明日からの仕事、スケジュール的にちょっときついかも？

2001/11/12 (Mon)
　お仕事はプログラミング中心。 C 言語でなんちゃってオブジェクト指向
してみることに。ホットハーブちょっと。欲しいもの、それはビジネス向け
トートバッグ。そしてプログラムミス……。

2001/11/13 (Tue)
　今日もプログラミング。 Wait 系逆に考えてた……。でも資料作る必要
が。プログラミングだけしてたい……。ぱぱっとイラストで今日の一枚。

2001/11/14 (Wed)
　シュガーがーっ！！（泣）　番組がずれてたった１０分しか入ってな
い……一生の不覚。お仕事は資料作り。ベースシステムは順調。メンテの方
が大変かな？

2001/11/15 (Thu)
　引き続き資料作り、そしてプログラミング。マルチスレッド使わなきゃい
けないのがめんどい。ハンズでトートバッグ探し、いいのは高い……。リブ
レットをボーナスで。 X-BOX ……ねぇ。

2001/11/16 (Fri)
　お仕事はプログラミング、でも無駄かも……。パスタ便利。もう１１月も
半分。これからは結構色々あります。でも仕事が（泣）。イラストもちょ
こっと。

2001/11/17 (Sat)
　カレー作ってぷらとわ書いて、そして電話。なんか長電話。Ｎスペは教え
ることの難しさ。明日からスタートする Suica への想い。数年来の夢が、
今。


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

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

「ちっ……」
「何が見えたの？」
「あのガキがいるってよ。それと、男。他にも怪しいヤツが結構いるらし
い……」
「そんなの……足りなすぎるわよ」
　後ろを見て、舞も舌打ちした。恭子達を守るために一人。やってくる何か
を止めるために一人。あの少年とその他諸々の人達とで一人。もちろん、そ
れが最低限度だ。
「……その子供とか、怪しい人ってどこにいるの？」
「そっちなら俺が行った方が」
「穂香さんのいるあんたじゃなきゃ、一人でみんなを護ることはできないで
しょ」
「……俺が護るのは、おまえなんだけどな」
　雅樹の瞳は射るかのように舞に向けられ、その言葉が放たれれば――舞は
顔を背けた。
「どこ！？」
「この公園の外、あっちにあの少年、こっちに怪しい男！」
　舞は駆け出していく。その姿を、男は新聞をくしゃくしゃにしながら呆然
と見ていた。
「記事には、どっちかひとつしかできないんじゃないか？」
　そんな言葉すら、男には聞こえていなかった。宙に浮く、まるで天女の羽
衣のような水を身にまとって走る舞から、目を離すことができなかった。自
然と、男も駆け出していた。
「ふぅ……おまえら、離れるんじゃないぞ！」
　後ろを向いて、俊雄達に雅樹は言った。俊雄も、舞の背中を見続けていた
が、雅樹の声に我を取り戻した。舞と雅樹を、俊雄は交互に見て、そして舞
の方へと駆け出した瞬間！
「来るぞ！」
　緑色の葉を撒き散らしてそれは飛び出した。それは、それは――
「……何よ、なんなの？」
　それは高々と宙を舞ったあと、地面を踏み砕いて着地した。大きな目、異
様に長い手、太い足、ある部分は白く整えられた毛が並び、ある部分は緑色
の皮膚が見えている。その姿は、動物という範疇を超えていた。
「この前と、違う……」
　恭子は学校を襲った犬を思い出して、それとは全く違う存在に恐怖してい
た。あのときも、十分想像を超えていたが、目の前にいるそれは、これまで
とは全く違う、得体の知れない存在だった。
「さて、小手調べと行きますか……」
　橙色の炎に煌めく右手を構え、振りかぶる。
『ひと！』
　手から継ぎ火したかのように小さい炎がその獣めがけて飛んでいく。その
スピードはそれほど速くなく、獣は泥を跳ね上げながら高々と飛んだ。
『ふたみぃ！』
　最初の一発とは比べものにならないほどの速度で橙色の炎が雅樹の手を放
れていく。その二発の内一発は外れるが、残り一発の炎は狙い違わず獣に直
撃した。
『よぉいつむぅ！！』
　緩やかな放物線を描いて落ちてくる獣へと三つの炎が放たれ、その体が地
面に叩き付けられると同時に全て着弾した。
　声にならない鳴き声が公園中に響きわたり、木々の中に隠れていた鳥達が
一斉にざわめきたった。
「ちょっと……残酷じゃありませんか」
　ん？　という顔を俊雄に向けて、雅樹は笑んだ。
「そんな余裕、ないんじゃないのか？」
　その右手に再び橙色の炎が点った瞬間、三つの影が木々の中から飛び出し
た。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『そういえば、 Java メルマガって２週に一度なんだよね……』
「というわけで、２１日に No.06 【ポリモーフィズム】が発行されます」
『ぽりもー……ふぃずむ？』
「これが面白いんだ」
『面白い？』
「そう、無茶苦茶面白いんだよねー。プログラミングが楽しくなるよ」
『 C++ でもできる？』
「もちろん。もう少ししたら教えるからねー」
『少し？』
「いや……結構先かも。それはともかく、この号だけでも」
『読む価値ある？』
「プログラミングの違った面が見えてくるから」
『プログラミングがつまらなくなったあなたは絶対読むべし！』
「なんかそれシャレにならないような……」
http://www.kab-studio.com/Programing/JavaOOP/
_______________________________________________________________[KCM]


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

　Version 7.13
フォントを変えよう！

「前回文字を書いてみたから、今度はフォントを変えてみましょう」
『フォントってみんちょーとかゴシックとかそういうの？』
「そういうの。フォント変えるだけで結構違ってくるからねー」
『うん、ちょっと楽しみ』
「と、いきなりだけどちょっと難しそうなのから」

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

    // フォントの情報を作成。
    LOGFONT stLogFont;
    stLogFont.lfHeight = 100;
    stLogFont.lfWidth = 10;
    stLogFont.lfEscapement = 0;
    stLogFont.lfOrientation = 0;
    stLogFont.lfWeight = FW_NORMAL;
    stLogFont.lfItalic = FALSE;
    stLogFont.lfUnderline = FALSE;
    stLogFont.lfStrikeOut = FALSE;
    stLogFont.lfCharSet = SHIFTJIS_CHARSET;
    stLogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
    stLogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    stLogFont.lfQuality = DEFAULT_QUALITY;
    stLogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
    strcpy( stLogFont.lfFaceName, "ＭＳ 明朝" );

    // フォントの作成。
    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 );
}

『う、うわ！　なんか大変そう！！』
「１行目はいつものデバイスコンテキストの取得。そのあとがね」
『 LOGFONT ってのの変数作って……構造体？　これ』
「そう、フォントの情報を格納するための構造体」
『フォントの情報……』
「ちょっと混乱するかもしれないけど、一般的に言う〈フォント〉とは別な
んだよね。一般的なフォントは、ウィンドウズフォルダの中の FONTS フォ
ルダに入ってるのでしょ」
『そうそう、 MS ゴシックとかみんちょーとか。あ、上の見ると
【ＭＳ 明朝】ってあるけど』
「デバイスコンテキスト関係の〈フォント〉は、一般的なフォント、つまり
ＭＳ 明朝とかだけじゃなくて、これから書く文字の高さや幅、その他諸々
もデータとして持ってるものなんです」
『つまり、どういう文字を書くか、っていうのがデータとして入ってる……
それが LOGFONT なのね』
「そゆこと。たとえば LOGFONT::lfHeight は書く文字の高さ」
『あ、そういえば実行してなかった。ほい。うわ！　高！』
「これを小さくすれば低くなるし、 LOGFONT::lfWidth を増やせば」
『うわ、太！　あ、はみでちゃった』
「 Ver 7.11 ( No.131 ) のクリッピング使えば」
『はみ出るの防げる！』
「ま、この辺はただの組み合わせだからなんとでもなるかな」
『他のパラメーターは？』
「……適当に試してみて」
『げっ、テキトー！』
「僕自身、全部知ってるわけじゃないんだよね」
『じゃあパラメーターとかどうやって決めてるの？』
「検索して探してきたのを適当に」
『げ、マジで適当なの！？』
「そうだよ。正直な話、 API は細かいことができる分、こういうふうにパ
ラメーターが細かい場合が多いんだよね。だから、全部憶えていったらキリ
ないから」
『必要になったら調べて使う？』
「そゆこと。必要なとこだけ憶えるか、調べるか。たとえば、いわゆるフォ
ント決めるのが LOGFONT::lfFaceName だとか」
『 strcpy() って文字列コピーするのだね』
「 Ver 5.07 ( No.072 ) でやったね。 LOGFONT::lfFaceName は要素数 32 
の配列になってるから、ここに使いたいフォント名をコピーすれば」
『そのフォントで出るわけね。確かにみんちょーになってる』
「注意したいのは、ホントに正確にフォント名を指定しなきゃダメってこ
と。たとえば "ＭＳ 明朝" 」
『そういえば…… "ＭＳ" は大きくて、間のスペースは小さいのなんだね』
「これは正確にしないとダメだから」
『厳しい……』
「それに、ＰＣによって入ってるフォント違うから、こういう決め打ちがで
きるのはＭＳ 明朝とかくらい」
『隷書体とか普通入ってないもんね』
「ってゆーか使わないし……。ちなみにフォント選ぶんなら」

void CAnimeDlg::OnBDraw() 
{
    CFontDialog cFontDlg;
    cFontDlg.DoModal();
}

『お、フォントダイアログ！』
「 API なら ChooseFont() ね。デフォルトはＭＳ 明朝にして、あとはユー
ザーに選んでもらってカスタマイズ、っていうのが基本かな」
『なんかそうなってくると難しくなりそうねー』
「規模が大きくなるからね。話を戻して、別に LOGFONT に必要なパラメー
ター入れただけじゃダメで、ペンやブラシみたく、フォントも GDI のひと
つだから」
『作らなきゃいけない。そのための API が CreateFontIndirect() ね』
「この API で、 GDI のフォントがウィンドウズシステムの中に作られて、
それを操作するハンドルが HFONT として返ってくるから」
『……一応確認するけど、これしても、いわゆるフォントが増えたりはしな
いんだよね』
「もちろん。 FONTS フォルダ見ても増えたりしてないからね」
『それとは別物なんだもんね』
「で、あとはいつもと同じ。デバイスコンテキストに SelectObject() で持
たせて、前回使った TextOut() で文字列を出力」
『すると、今持ってるフォントで文字を書くわけね』
「あとはまた元に戻して、今作ったフォントを削除」
『この辺のルールもいつもと同じね』
「ま、ここでのポイントは、 API と複雑なパラメーターは切っても切り離
せない」
『だから全部憶えないで、必要な時に必要なのだけ調べて、あとは他のを流
用、ね』
「そゆこと。じゃ、次のステップに移りましょう。今はフォントを一から
作ったけど、実際には〈高さだけ増やしたい〉とか〈いわゆるフォントだけ
変えたい〉ってことの方が多いと思うんだよね」
『そこまでじゃなくても、デフォルトのパラメーターとか必要そう』
「というわけで、 IDC_S_CANVAS のフォント情報を取得してみましょう」

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

    // フォントのハンドルを取得。
    HFONT hCanvasFont
         = (HFONT)::GetCurrentObject( hCanvasDC, OBJ_FONT );

    // フォントの情報を取得。
    LOGFONT stLogFont;
    ::GetObject( hCanvasFont, sizeof( stLogFont ), &stLogFont );

    // フォント名の表示。
    TRACE( "%s\n", stLogFont.lfFaceName );
    // System
}

『んーっと、１行目はいつものデバイスコンテキストを取るヤツね。次の行
の GetCurrentObject() は初めて見る API だね』
「この API は、デバイスコンテキストが持ってる GDI を取得するためのも
の。簡単に言えば、 SelectObject() の戻り値と同じ」
『あー、つまり交換しないで、それまで持ってたのを取得するならこの API 
ってわけね』
「そゆこと。で、次に LOGFONT を用意して、そこに hCanvasFont が持って
るフォント情報をコピーします」
『それを入れてるのが GetObject() みたいね』
「そう、この API で hFont が持ってるフォントのデータを stLogFont に
コピーします」
『で、フォント名が stLogFont.lfFaceName に入ってるからそれを出してる
わけね。でも System って？』
「システム、つまりウィンドウズが内部に持ってるシステムフォントって意
味。ちょっとこれじゃ分かりにくいよね」
『さっきの時も、 System ってすればシステムのに？』
「うん。こうすれば【画面のプロパティ】で指定したのが出るから。あ、あ
と、実際に【画面のプロパティ】で指定したフォントを取得する場合には
SystemParametersInfo() って API を使えばいいから」
『いいから、ってさらって言うけど、これ使うの難しそう……』
「だろうねー。ま、それは先の話って事で」
『まとめると、さっきの逆だよね』
「さっきは LOGFONT にデータ入れて、CreateFontIndirect() でフォント
作って、そのときもらった HFONT を SelectObject() に渡してデバイスコ
ンテキストに持たせました」
『今度は GetCurrentObject() で HFONT をもらって、 GetObject() で 
LOGFONT にデータを入れてもらえば、どういうフォントを持ってるか分かる
わけね』
「そういうこと。じゃ、最後にこのフォントデータを元に別のフォントを
作ってそれで文字を書いてみましょう」

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

    HFONT hCanvasFont
        = (HFONT)::GetCurrentObject( hCanvasDC, OBJ_FONT );
    LOGFONT stLogFont;
    ::GetObject( hCanvasFont, sizeof( stLogFont ), &stLogFont );

    // フォントの変更。
    strcpy( stLogFont.lfFaceName, "ＭＳ 明朝" );

    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 );
}

『んーと……あ、結局は LOGFONT にコピーしてもらって、それのフォント
名書き換えてるんだね』
「そうすれば LOGFONT のほとんどのパラメーターは IDC_S_CANVAS のフォ
ントのまま、フォント名だけが明朝」
『それを CreateFontIndirect() で新しいフォントとして作って、あとは入
れ替えとかね。あれ？　いちいち作り直さなきゃいけないの？』
「そうみたいだね。パラメーター変えるだけって機能はないみたい。だか
ら、作って削除して、って繰り返さないとね」
『面倒ねー』

/*
    Preview Next Story!
*/
『なんかデバイスコンテキストまわりって面倒』
「これからどんどん面倒になってくるよ」
『げ！　そなの？』
「ハンドルがどんどん増えてくるからね」
『増えるくらいなんとかなんない？』
「プログラムの複雑さはデータ数の二乗に比例するからねぇ」
『げげげ！』
「それを何とかしないとね」
『なんとかねぇ』
「というわけで次回」
＜ Version 7.14 ハンドルの管理 ＞
『につづく！』
「あ、データ数の二乗って全然根拠ないから」
『ないんかい！』


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

