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

    KAB-studio.h


    (C)KAB-studio 1999 - 2007 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2007/02/26(Mon) No.396
    配信数： 1656
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

/*            KAB-studio.h 発行終了のおしらせ                     */

このたび、本メールマガジン「KAB-studio.h」は、2007年3月26日発行の
No.400号をもちまして発行を終了することとなりましたため、みなさまに
おしらせいたします。
発行終了後の各コンテンツは以下の通りとなります。

・ニュースおよび日記ダイジェスト
→KAB-studioではRSSを配信してしておりますのでそちらをご利用ください。
http://www.kab-studio.biz/rss.xml

・風雅、舞い
ホームページにて不定期掲載を行います。
掲載はかぶろぐおよびRSSにておしらせいたします。
http://www.kab-studio.biz/Novel/Fuga/index.html

・#pragma twice
No.400にて最終回となります。ご了承ください。
ホームページ版にて全話公開しておりますのでご利用ください。
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

以上、ご了承頂ければと思います。


////////////////////////////////////////////////////////////////////
// NEW!!
http://www.kab-studio.biz/index.html

2007/02/26 (Mon)
　ほとはー外伝３にP.91を追加！
[ 三人合体ホットハーブ 外伝３ 【ワタシ の キロク】 ]
http://www.kab-studio.biz/Comic/HotHerbA3/index.html

2007/02/26 (Mon)
　#pragma twice ホームページ版にアーカイブ追加！
18.06 イベントハンドラをオーバーライドで
18.07 ウィンドウプロシージャを純粋仮想関数にする、の続き
[ #pragma twice ]
http://www.kab-studio.biz/Programing/PragmaTwice/index.html


////////////////////////////////////////////////////////////////////
// ちょお普通な日記
http://www.kab-studio.biz/nikki2/index.html

2007/02/18 (Sun)
　１１時半起き。目覚まし掛けても起きられない。ほとはー外伝３を夕方ま
でかけて描く。もっと集中を持続できないと。夜にウォーキング。

2007/02/19 (Mon)
　寒くて起きられない。お昼過ぎにおしごとのお打ち合わせ。３月から忙し
くなりそう。帰りに秋葉原でコミックスとか購入。

2007/02/20 (Tue)
　雨で寒い。風雅、舞いのホームページ版をPHPで再構築とストック作成。
ほとはー外伝３ネーム切りも。そしてハクキンカイロ。

2007/02/21 (Wed)
　昨日の夜中に風雅、舞いを完結させて、そのあとおしごと関係のをして
朝７時寝。なので調子出ず。ラクガキ描いたり洗濯したりウォーキングした
り。

2007/02/22 (Thu)
　夜すぐ寝付けない。猫の日なので猫描き。ひぐらしをまったりプレイ。
ぷらとわの新しいトップページ作成。トップイメージも作らないと。

2007/02/23 (Fri)
　ぷらとわのラフがうまくいかなかったので代わりにネコミミ娘を描く。
ウォーキングしてごはん食べて寝ちゃって以上。

2007/02/24 (Sat)
　１１時半起き。完全にダメな日。食いまくりだし何もしてないし。


////////////////////////////////////////////////////////////////////
// かぶろぐ。
http://d.hatena.ne.jp/kab_studio/

2007/02/18 (Sun)
http://d.hatena.ne.jp/kab_studio/20070218
起きた。
[KAB-studio]ぷらとわの今週の追加はありません。
[KAB-studio][ほとはー]ほとはー外伝３ P.90
[アニメ]獣拳戦隊ゲキレンジャー 第1話「ニキニキ！激獣拳」(新)
[アニメ]「牙」 第46話「決断の地へ」
[アニメ]おねがいマイメロディ〜くるくるシャッフル！〜 
　第47話「元にもどってくれたらイイナ！」
[アニメ]ひまわりっ！！ 第7話「惑い惑わし四面楚歌」
[アニメ]京四郎と永遠の空 第7話「彷徨いの哀歌」
[アニメ]神様家族 第7話「発育少女」

2007/02/19 (Mon)
http://d.hatena.ne.jp/kab_studio/20070219
起きた。
帰ってきた。
[買]コミックスとか
[きらら]まんがタイムきららMAX 2007年4月号
[アニメ]金色のコルダ 第20話「涙色のロンド」
[アニメ]がくえんゆーとぴあ まなびストレート！ 
　第7話「なつのおしまい（ばいばい）」

2007/02/20 (Tue)
http://d.hatena.ne.jp/kab_studio/20070220
起きた。
[アニメ]SHUFFLE! MEMORIES 第7話「芙蓉楓編 後編」
[アニメ]Pumpkin Scissors 第19話「甘い罠」
[アニメ]Pumpkin Scissors 第20話「演者入場」

2007/02/21 (Wed)
http://d.hatena.ne.jp/kab_studio/20070221
起きた。
[絵]ポニテ娘
[買]コミックスとか購入
[アニメ]DEATH NOTE 第19話「松田」
[アニメ]ネギま！？ 第21話「漢はだまって（略）」

2007/02/22 (Thu)
http://d.hatena.ne.jp/kab_studio/20070222
起きた。
[絵]猫。
[ひぐらしのなく頃に][買]プレステ2版購入
[アニメ]ロケットガール 第1話「ディスティニィ-destiny-」(新)
[アニメ]武装錬金 第21話「GONE INTO FLAME」

2007/02/23 (Fri)
http://d.hatena.ne.jp/kab_studio/20070223
起きた。
[絵]ネコミミ娘
[アニメ]のだめカンタービレ 第7話
[アニメ]ひだまりスケッチ 第7話「10月12日 嵐ノ乾燥剤」
[アニメ]セイントオクトーバー 
　第8話「ロリ熱投！何故なの？あなたと超ボーリング！」
[アニメ]すもももももも〜地上最強のヨメ〜 第19話「家政婦が来た！」

2007/02/24 (Sat)
http://d.hatena.ne.jp/kab_studio/20070224
起きた。
[きらら]まんがタイムきららフォワード Vol.5（2007年3月号）
[きらら]まんが4コマKINGSぱれっと Vol.4（2007年3月号）
[アニメ]デルトラクエスト 第8話「トムのふしぎな店」
[アニメ]彩雲国物語 第39話「縁は異なもの味なもの」(終)
[アニメ]おとぎ銃士 赤ずきん 第34話「ヘンゼルとグレーテル」
[アニメ]ふしぎ星の☆ふたご姫 Gyu! 
　第47話「三匹のサムライ☆頑張れブライト」
[アニメ]コードギアス 反逆のルルーシュ 第18話「枢木スザクに命じる」


////////////////////////////////////////////////////////////////////
// Ajaxでエロゲーを作るブログ
http://d.hatena.ne.jp/AjaxEroge/

（今週はお休みです）


////////////////////////////////////////////////////////////////////
// 風雅、舞い
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第十五章　濁る澱み、清らかな血溜り　−２４−

「彼の父親は、この村の村長だったって話よ」
　舞と智子は家の奥へと進む。屋根のある部屋は日の光があまり差し込ま
ず、暗闇の中で智子は舞の手を握った。
「村長って言っても投票とかで選ばれたんじゃなくて、昔からの世襲制みた
いね。この高台は村で一番高いところみたいだし」
「それはちょっと……あんまりだと思います」
「ぎすぎすした話よね。彼らはＨＩＶのことを知られたくなかったから、誰
にも言わずに私達と共にここを去った――それが、この村を捨てたと思われ
たのかも」
　なんとなく、舞はここを、泉と重ねて見てしまう。
　この前訪れた玄き泉は、朽ち果て、誰もいない廃墟となっていた。
　雅樹の朱き泉は、かつて攻撃に遭い、壊滅寸前まで陥っていた。
　自分が生まれ育った碧き泉も、今回の件がなければ、全員東京に移り住ん
で何もなかったかのように忘れ去っていたかもしれない。
「彼が言ってました、ＡＰは死なない、それは間違ってるんじゃないかっ
て。死んでまた生まれる、それが正しいことなんじゃないかって。でも――」
　舞は見上げる。黒い天井、その切れ目から見える空もまた薄暗く覆い被
さっていた。
「こうして人間が作った物が死んだら……もう生き返らない、何も生まれな
い。なら、やっぱり死なない方がいいんじゃないかって」
「それは、彼の方が正しいんじゃない？」
「え？」
「生と死がサイクルになっていても、あくまで親と子は別人よ。命を紡ぐっ
てことは、同じものを作り続ける事じゃなくて、異なるものを作って常に変
わり続けることなのよ」
　智子も上を見上げる。暗い天井の向こうには暗雲、でもその中には「何か」
がある。それは漆黒の闇夜かもしれないし、鮮烈な陽光かもしれない。
「この家が、今、死んでいるとしても、それまでここで彼の両親が住んでき
た。そしてその両親が彼を作り、彼がまた何かを成せば、それは、彼の望む
サイクルの中に生きている、っていうことなのよ、きっと」
                                                              (続く)

////////////////////////////////////////////////////////////////////
// JavaA2Z
http://www.kab-studio.biz/Programing/JavaA2Z/index.html

■追加・更新単語

（今週の追加はありません）


////////////////////////////////////////////////////////////////////
// #pragma twice
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 18.09
イベントごとにメンバ関数を分ける

「前回は、ダイアログプロシージャを純粋仮想関数にした理由や、どういう
仕組みで動いているのか、ということを説明しました」
『ってゆーか複雑！！　なんだかパズルみたい』
「実際そういうところもあるかもね。 API や Windows システムの制約、
C++ 言語の仕様をうまく使わないとできないだろうから」
『むー』
「まぁいきなり書くのはかなり大変だろうから、色々な例を見て、それを
理解して、真似してみるところから始めてみるといいかな」
『まねしちゃっていいの？』
「もちろん。というか、僕が紹介しているものだって真似だし」
『げ、そうなの？』
「というわけで、今回は前回の DialogProc() メンバ関数を、 MFC を真似
てメンバ関数に分けてみます」
『おー』
「まずはプログラムから。 NewCalcDialog.h はこうなります」

// NewCalcDialog.h

// CNewCalcDialog クラス。
class CNewCalcDialog : public CDialog
{
    // このダイアログのウィンドウハンドル。
    HWND m_hWnd;

public:
    // ダイアログプロシージャ。
    BOOL DialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    );

    // OK ボタンが押された時のイベントハンドラ。
    void OnOk();

    // = ボタンが押された時のイベントハンドラ。
    void OnEqual();
};

『 m_hWnd メンバ変数が追加されたね。これって MFC の CWnd みたいな感
じ？』
「そう、当たり前だけどウィンドウハンドルはウィンドウやダイアログごと
に振られるから、引数で渡すよりもメンバ変数で持っておいた方がいいか
な」
『こんなところから MFC の真似なのね。あと OnOk() メンバ関数と 
OnEqual() メンバ関数が増えたね』
「この 2つのメンバ関数に、 DialogProc() メンバ関数の機能を分割しま
す」

// NewCalcDialog.cpp
#include <Windows.h>
#include <stdio.h>
#include "resource.h"
#include "Dialog.h"
#include "NewCalcDialog.h"

// ダイアログプロシージャ。
BOOL CNewCalcDialog::DialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    // ウィンドウハンドルをメンバ変数に保存します。
    m_hWnd = p_hDlgWnd;
    if( p_uiMessage == WM_COMMAND )
    {
        if( LOWORD( p_wParam ) == IDOK )
        {
            // OK ボタンが押されました。
            OnOk();
            return TRUE;
        }
        else if( LOWORD( p_wParam ) == IDC_B_EQUAL )
        {
            // = ボタンが押されました。
            OnEqual();
            return TRUE;
        }
    }
    return FALSE;
}

// OK ボタンが押された時のイベントハンドラ。
void CNewCalcDialog::OnOk()
{
    // OK ボタンが押されました。
    EndDialog( m_hWnd, IDOK );
}

// = ボタンが押された時のイベントハンドラ。
void CNewCalcDialog::OnEqual()
{
    // 各エディットボックスのウィンドウハンドルを取得します。
    HWND hLeftWnd = GetDlgItem( m_hWnd, IDC_E_LEFT );
    HWND hRightWnd = GetDlgItem( m_hWnd, IDC_E_RIGHT );
    HWND hAnswerWnd = GetDlgItem( m_hWnd, IDC_E_ANSWER );

    // 各エディットボックス用文字列を用意します。
    char pchLeft[256];
    char pchRight[256];
    char pchAnswer[256];

    // IDC_E_LEFT と IDC_E_RIGHT の文字列を取得します。
    GetWindowText( hLeftWnd, pchLeft, 255 );
    GetWindowText( hRightWnd, pchRight, 255 );

    // それぞれ int 型に変換します。
    int iLeft = atoi( pchLeft );
    int iRight = atoi( pchRight );
    
    // 足した結果を pchAnswer に文字列変換します。
    sprintf( pchAnswer, "%d", iLeft + iRight );

    // それを IDC_E_ANSWER にセットします。
    SetWindowText( hAnswerWnd, pchAnswer );
}

『つまり、 DialogProc() メンバ関数の機能は、ウィンドウハンドルの保存
と、メッセージのチェック、で、各メンバ関数の呼び出しだけして、残りは
各メンバ関数でしてるわけね』
「そういうこと。 DialogProc() メンバ関数では、まず m_hWnd メンバ変数
に引数で渡されたウィンドウハンドルを保存します」

    // ウィンドウハンドルをメンバ変数に保存します。
    m_hWnd = p_hDlgWnd;

『？　これって毎回保存しなきゃいけないの？』
「ううん、実際には WM_INITDIALOG メッセージが送られてきたときに一度
保存すればいいかな。でもこうして毎回保存してもほとんど問題はないか
ら。当然だけど毎回同じウィンドウハンドルだし」
『その後は、メッセージとボタン ID をチェックして、ボタンごとに
メンバ関数を呼び分ける、ってするわけね』

    if( p_uiMessage == WM_COMMAND )
    {
        if( LOWORD( p_wParam ) == IDOK )
        {
            // OK ボタンが押されました。
            OnOk();
            return TRUE;
        }
        else if( LOWORD( p_wParam ) == IDC_B_EQUAL )
        {
            // = ボタンが押されました。
            OnEqual();
            return TRUE;
        }
    }

「ここはこの前の DialogProc() メンバ関数と同じだから。あと
OnOk() メンバ関数と OnEqual() メンバ関数の中身もほぼ同じ。あ、ただ
ウィンドウハンドルは m_hWnd メンバ変数を渡すようにしているから」

// OK ボタンが押された時のイベントハンドラ。
BOOL CNewCalcDialog::OnOk()
{
    // OK ボタンが押されました。
    EndDialog( m_hWnd, IDOK );    ← m_hWnd になってます。
    return TRUE;
}

『 p_hDlgWnd が m_hWnd になったわけね』
「ウィンドウハンドルはどのメンバ関数でも使うから、引数で渡すよりこう
してメンバ変数にした方がいいと思うよ」
『んー、 DialogProc() メンバ関数の他の引数、つかメッセージとか WPARAM
とか LPARAM は渡さなくていいの？』
「メッセージは必要ないでしょ」
『あ、そか。メンバ関数呼ばれたらそのときにもうメッセージは分かってる
んだ。 OnOk() メンバ関数が呼ばれたら、 OK ボタンが押された、ってわけ
だもんね』
「 WPARAM や LPARAM はイベントによって、かな。ボタンが押されたときに
は必要ないけど、たとえば Version 10.20 ( No.198 ) で説明した 
WM_CHAR メッセージとかは」
『そか、 WPARAM にキーが入ってるんだよね、そういうのは渡した方がいい
んだ』
「ただ、この部分は自分で変えられるから、 WPARAM を直接渡してもいい
し、 char 型にキャストしてから渡してもいいかな。ちなみに MFC は
キャストしてから渡すものがほとんどだけど」
『んー、どっちがいいの？』
「その辺は好みの問題かな、今の段階だと DialogProc() メンバ関数も自分
で手を加えなきゃいけないし」
『どゆこと？』
「 MFC って、 DialogProc() メンバ関数に当たる部分は見えてないでしょ」
『うん、そういえば追加されたイベントハンドラ使うだけだね』
「 MFC の場合、 DialogProc() メンバ関数に当たる部分がうまく隠されて
いて、ここに手を加えなくてもイベントハンドラが呼び出される仕組みに
なっているんです」
『そ、そんなことできるの！？　ボタンって好きなのを好きなだけ追加で
きるのに！』
「たとえば MFC でダイアログアプリケーションを作ると、こういうのが
xxxDlg.cpp にあるでしょ」

BEGIN_MESSAGE_MAP(CMfcDialogDlg, CDialog)
    //{{AFX_MSG_MAP(CMfcDialogDlg)
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

『うん、あるある。……もしかしてここでその処理をしてるの？』
「そういうこと。 MFC の場合、 ClassWizard や AppWizard が自動的にこ
ういうマクロを追加してくれるから」
『そか、マクロってプログラム置き換えてくれるんだもんね』
「この仕組みのおかげでメッセージの分岐をしなくてよかったんだけど、
そういうツールがないから、イベントハンドラを追加するときには 
DialogProc() メンバ関数に自分で追加していくしかないかな」
『やっぱ MFC 使わないと不便なとこは結構あるんだね……』

/*
    Preview Next Story!
*/
『んー、やっぱり MFC 使った方が楽そう』
「便利なところはあるからね。でも API だけの方が自由度は高いから」
『でも作る所多いし、 CString とかもあるし』
「あ、そういうクラスなら MFC じゃなくてもあるよ」
『というわけで次回』
＜ Version 18.10 iostream と std::string ＞
「につづく！」
『って、なんだかどっかで聞いたようなクラスが！』
「復習かも」
『ええ〜？』


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/index.html
・購読登録を解除したいときにはこのページで行なってください。
http://www.mag2.com/m/0000012198.htm
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2007 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

