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

    KAB-studio.h


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

    送信日： 2001/09/10(Mon) No.123
    配信数： 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/Info/Link/


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

2001/09/02 (Sun)
　 AirH" 始めました。 ADSL はちょっと縛られるかなと思ったんだけど、
結構遅い……。手続きはあっさりと。あとは洗濯したりイラスト描いたり。
そして性格判断、やっぱりあってる？

2001/09/03 (Mon)
　夏休みが明けたら、夏休み前の仕事がそのまんま残ってた(泣)。そんな感
じで夜１１時まで残業(泣)。そしてツッコミにも答えられない(泣)。む〜。

2001/09/04 (Tue)
　今日も引き続き残業。 Pro*C プログラムとテスト。そして残業をしない
勧め。ホンマ、なんでみんな残業できるん……。そして忙しいのはさらに続
く。

2001/09/05 (Wed)
　今日は６時に帰宅(爆)。体力的に辛いんで。それにデータベースやネット
ワーク中心のとこはなー。 Java メルマガスタート。ヒット数急増？　さら
に愚痴(爆)。やっぱわてはいろんなこと楽しみたいです。そういう人生、自
分で選ばないと。

2001/09/06 (Thu)
　今日は９時に上がり。昨日早かったのに体はきつい(泣)。とりあえず、
ニューステ見てご飯食べれるんだから幸せ？

2001/09/07 (Fri)
　今日も９時上がり、でも明日は休めるし、仕事もひと段落。今日は仕様書
作成。なんでワードもエクセルも使いにくいのに使われるんでしょ。ここま
でやってきた Pro*C や SQL*Plus 、奥深いなぁという感じも。そして能田
達規先生の新しいサッカーマンガ！　期待大ですー。

2001/09/08 (Sat)
　たたき起こされて寮のメンテ。ごはんはカレー。甘さと辛さがミソ。イラ
ストはマンガ中心。ホットハーブとか。クォーツの謎。そして残業代ってい
くら？


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

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

「なんだかんだ言っても、結局ここに来ちゃうわけね……」
　三人はその二十階はある高層マンションを見上げていた。舞ひとりはその
マンションの臨時駐輪場に自転車を止めていた。
　手慣れているなぁ……俊雄はそう思った。
　レンガ色に囲まれた中にとけ込む銀色のパネルを前にして、舞は迷うこと
なく雅樹の部屋の番号を打ち込んだ。密かに留守であることを願って。
『あれ舞、どうしたんだいったい』
「呼び捨て……」
　思わず恭子の口をついて出た言葉に舞はさらに恥ずかしくなった」
「朴さん、クラスのみんなが話したいんだって」
『？　話？』
「この前の学校での騒ぎからなんにもないでしょ、それでさ……」
「それで、朴さんの助言を仰ぎたいと思いまして、上がってよろしいでしょ
うか」
　恭子はそう半ば強引に頼み込んで、雅樹は少し悩んで、脇を向いてから答
えた。
『ああ、いいよ。今開けるから』
　ガラス戸のロックが開き、四人は入っていく。
「誰か他に女の人でもいたりして」
　信吾のちゃちゃに舞はさらりと答える。
「柊さんよ。ほらあの私達には見えない人」
「本当にその柊さんっていう人、いるのかな」
「いるわけないでしょ」
　そうはっきりと断言する舞。
「そこまで断言するのはちょっとと思うけど」
「力を持ってる人っていうのは、何となく分かるのよ、その雰囲気っていう
か、普通じゃない何かを匂わせるんだろうけどね」
「『気』みたいなもの？」
「どうなのかな……そういう感じ、柊さんの感じがどこにもないのよ」
「幽霊みたいなもんでも、そういうのは発してるってことか」
「だからね、信憑性がないのよ、柊って女性がいるっていうね」
　四人はエレベーターに乗る。ガラス戸から見える中庭は、きれいな庭園の
ようになっていて、登っていくエレベーターから見るその景色はなかなかき
れいだった。
「そう考えると、朴さんって多重人格なのかな」
「そういうのとは違うみたいだけどね。演技とは思えないし……」
「ほら、昔のドラマとかにあったよね、死んじゃった息子がいつまでも側に
いるように感じる母親の話とかさ」
「ってことは、柊さんって死んじゃった昔の彼女とか？」
「……なんか悪いよ、そんなこと言っちゃ」
「あ……」
　その俊雄の言葉が、会話をとぎれさせた。でも、舞は、なんかいい感じか
な、と思った。
　中庭の光景が点ほどにまでなってから、エレベーターは止まった。
「でも実際――」
　そう話し出したのは、舞だった。
「朴って、よく解んないところ多いかな。まぁ、普通そうなんだろうけど、
得体の知れなさっていうの、強く感じる」
「舞さん……」
「そんなのに……」
　舞の拳が震えた。
「そんなわけわかんないヤツになんで護られなきゃいけないのよっ！！」
　震える拳がチャイムに叩き付けられ、「ピン・ポーン」と軽やかな音が流
れた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『結局、 19 とはね……』
「 Java メルマガの購読登録数だね」
『注目はされてたみたいだけど』
「課金のハードルの高さ、立ち読みできない難しさ」
『っつーか、単に良さそうじゃなかっただけじゃない？』
「うわ、きっつぅ……」
『やっぱ、プロとアマチュアって違うってことじゃないのー』
「それはどうかなぁ」
『？』
「作者って、プログラマーとしてはずっとアマチュアだったわけだけど」
『でも仕事始めてから、スキル的には十分って感じみたいね』
「この業界、独学でも十分な実力つけられるんじゃない？」
『ま、それもちゃんと証明してくんなきゃね』
「うわ……」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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


　Version 7.03
アタッチとデタッチ

「まずは前回の復習から。１ドットの点を打つ時には」

void CAnimeDlg::OnBDraw() 
{
    COLORREF dwColor = RGB( 255, 0, 0 );
    HDC hDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );
    ::SetPixel( hDC, 10, 10, dwColor );
}

「で、これの MFC 版」

void CAnimeDlg::OnBDraw() 
{
    COLORREF dwColor = RGB( 255, 0, 0 );
    CDC *pcDC = m_cCanvasStatic.GetDC();
    pcDC->SetPixel( 10, 10, dwColor );
}

『２行目と３行目、違うような似てるような……』
「細かく見ていこうね。まず」

    HDC hDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );

と

    CDC *pcDC = m_cCanvasStatic.GetDC();

「の違いから」
『んーと、上のはまず m_cCanvasStatic からウィンドウハンドルをもらっ
て、 GetDC() でそのデバイスコンテキストのハンドルをもらって、それを
hDC に入れてるんだよね』
「そうでした」
『下のは…… m_cCanvasStatic の GetDC() ってメンバ関数を呼んでて、そ
れを pcDC ってので受けてる。これ、 CDC * だからポインタだよね』
「そう、ポインタ。まずはこの CDC クラスについて見ておこうか」
『やっぱし、デバイスコンテキストを使うためのクラスなんだよね』
「もちろん。まず、 CDC は中に HDC 型のメンバ変数を持ってます」
『それって CWnd と同じ？』
「そゆこと。 Ver 3.8 ( No.033 ) でやったように、 CWnd は HWND を持っ
てて、中で API を呼ぶ時にこの HWND を渡します」
『 CDC も同じってことは、３行目の』

    ::SetPixel( hDC, 10, 10, dwColor );

『と』

    pcDC->SetPixel( 10, 10, dwColor );

『だと、 pcDC->SetPixel() してる中で ::SetPixel() を読んでて、その最
初の引数に、中に持ってる HDC 渡してるってことね』
「ま、これは見た方が早いでしょ。 pcDC->SetPixel() にブレークポイント
を置いて」
『実行してステップイン！　afxwin1.inl ってファイルの 759 行目に……
::SetPixel() 呼んでて、第１引数に m_hDC 渡してる！』
「というわけで、結局は CWnd と同じく、 API を呼んでるだけってことだ
ね」
『あ』

ASSERT(m_hDC != NULL);

『ってゆーのがある。 ASSERT って Ver 6.17 ( No.117 ) で教えてもらっ
たのだよね』
「そう。これだとどうなる？」
『 ASSERT は if の逆だから、 m_hDC != NULL にならないときに止まるん
だよね。ってことは  m_hDC == NULL のとき、あ！　 m_hDC が NULL のと
きは止まるんだ！』
「そゆこと。 API 呼ぶ前にそのチェックをしてるってことだね」
『こういう細かいチェックが必要なんだ……』
「さて話を戻して」

    CDC *pcDC = m_cCanvasStatic.GetDC();

「ここで CDC のポインタを受け取ってます。ってことは、ポインタはどっ
かの CDC 変数を指してるってこと」
『その指してる先の CDC が本体、ってことはその中に HDC が入ってる？』
「そう！　API 版の」

    HDC hDC = ::GetDC( m_cCanvasStatic.GetSafeHwnd() );

「との違いは、 m_cCanvasStatic.GetDC(); は CDC 型変数をどこかに作っ
て、その中の m_hDC にデバイスコンテキストのハンドルを入れてから、そ
のポインタを返してるんです」
『デバイスコンテキストのハンドルは……』
「それは ::GetDC( m_cCanvasStatic.GetSafeHwnd() ); で得たの」
『あ、そっか！　そこまでは同じで、 CDC 用意してそれに入れてポインタ
を返す、っていうのが MFC 版の機能なんだ』
「そういうこと。なんでこんな面倒なことしてるかって言えば、全部 MFC 
でしたいから、ってとこかな」
『どゆこと？』
「もし MFC 版の GetDC() が HDC を返しちゃったら、 HDC をそのまま使う
ことになるでしょ。 MFC には CDC があるから、それを使って欲しいわけ」
『全部 MFC でって、そういうことなのね……』
「で、ここで一番重要なのは、 CDC のポインタを返してるとこ」
『そいやそうね、ポインタじゃなくてもよさそうだけど』
「この辺は CWnd の場合も同じだから、分かりやすくするために CWnd の例
を紹介するね」

void CAnimeDlg::OnBDraw() 
{
    CWnd cWnd;
    cWnd.Attach( m_cCanvasStatic.GetSafeHwnd() );
}

『 Attach() って前に見たことあるような……』
「 Ver 5.26 ( No.091 ) だね」
『そういえば。でも、あのときは Detach() っていうのも呼ばないとダメっ
て』
「そう、そこが味噌。とりあえず試してみて」
『ほい。あ、 ASSERT した』
「これを【無視】して」
『していいの？』
「うん、そのためのテストだから。 ASSERT が気になるならリリースビルド
で試してもいいよ」
『リリースビルドなら ASSERT 消えちゃうんだもんね』
「そゆこと。で、どうなった？」
『ん〜、あ！　IDC_S_CANVAS がなくなってる！！』
「つまり、自動的に削除されちゃったんです」
『自動的に削除！？』
「ちょっと飛ぶけど、ファイル操作の時に使った std::ifstream を思い出
して」
『思い出し中……』
「ランタイムの時は fopen() で開いて fclose() で閉じてたけど、 
std::ifstream の時は閉じなくても良かったでしょ」
『 Ver 5.11 ( No.076 ) で言ってたね、自動的に閉じてくれるって』
「実は CWnd とかにもこの〈自動的に閉じてくれる〉機能があるんです」
『自動的に閉じる……ウィンドウが閉じる……だから消えちゃった！？』
「そゆこと。 CWnd::Attach() は、外のウィンドウハンドルを中の m_hWnd 
に格納するメンバ関数」
『うん、それは分かる』
「で、 CWnd には、 CWnd 型変数がなくなるときに〈 m_hWnd が指すウィン
ドウを閉じる〉って機能が付いてるんです」
『つまりファイル操作で fclose() を自動的にするのと同じように、ね』
「そういうこと。でももちろんこれはまずいわけ」
『まだ使ってるんだもんねぇ』
「そこで解決法。解決法にはふたつあって、ひとつは」
『 Detach() ！』
「そのとおり。 Detach() を呼ぶと、中の m_hWnd に NULL を入れてくれ
て、自動的に削除されなくなります」
『それって CDC の方でも？』
「っていうより、 MFC の〈ハンドルを扱うクラス〉全部に言えることだ
ね。この辺はどれも共通だから」
『ほぉ。で、もうひとつは？』
「もうひとつは、ポインタを使う方法」
『あ、さっきの！』
「そう、最初に MFC 使ってた時にポインタを使ってたでしょ。これなら大
丈夫」
『あれ？　ポインタだと、その自動的に削除ってされないの？』
「されないよ。たとえば」

void CAnimeDlg::OnBDraw() 
{
    CDC *pcDC1 = m_cCanvasStatic.GetDC();
    CDC *pcDC2 = m_cCanvasStatic.GetDC();
    CDC *pcDC3 = m_cCanvasStatic.GetDC();
}

「で、もし pcDC1 、 pcDC2 、 pcDC3 が消えるたびにそういうことが起き
たら何度も消えちゃうことになっちゃうでしょ？」
『そっか、ポインタは本体を指すだけだから、消えたり作られたりっていう
のと関係ないんだ』
「そゆこと。そういうことが起きるのは、ポインタが指す本体が消えるとき
ってことだね」
『ってことは……自動的に消えたりしないように、わざわざポインタを返し
てるってことなんだ』
「そういうことになるね。 MFC を使って〈元々存在するもののハンドル〉
を使う時とかは、こういうふうにポインタを使うことが多いかな」
『それに、ポインタだとなんかハンドルに似てるし』
「そう、それ重要」
『そなの？』
「ハンドルのシステムって、ウィンドウズの中にウィンドウとかデバイスコ
ンテキストが入ってて、それに直接触れないようにするためのもの」
『ハンドル使って間接的に操作するんだもんね』
「ポインタを使うってことも、 MFC 内部にある、ウィンドウやデバイスコ
ンテキストの管理システムに直接触れないで、ポインタを通して操作するっ
て部分で」
『ハンドル使うのと似てるねー』
「 MFC がそういう感じに似せて作られた、っていうのもあるかもね」

/*
    Preview Next Story!
*/
『自動的にって、便利だったり不便だったりするのねー』
「これ、使う側だからいいけど、作る側は大変なんだよね」
『自動的にって、難しいの？』
「ううん、それは簡単。難しいのは、便利か不便かの判断」
『そうよねー、場合によって便利だったり不便だったり、違うだろうし』
「というわけで次回」
＜ Version 7.04 GDI とペン ＞
『に続く！』
「もちろんいつかは火美ちゃんも迷う日が来るから」
『そういうのの方がむしろ面白そうなんじゃない？』
「こういうのの方がむしろ大変なんだよね……」


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

・更新なし？
　今、忙しさに波があって、確実に更新できるって言えない状況……。
　ただ、そろそろホットハーブも更新しないとと思ってるんで、できれ
ば……。
[ 三人合体ホットハーブ ]
http://www.kab-studio.com/Comic/HotHerb/


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

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




