////////////////////////////////////////////////////////////////////
〓〓ＰＲ〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

　　　　★最強SEOが1日わずか123円から!!　SEOのアクシス★

http://af1.mag2.com/m/af/0000008658/001/s00000005629001/024
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


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

    送信日： 2007/01/29(Mon) No.392
    配信数： 1661
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

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

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

2007/01/29 (Mon)
　#pragma twice ホームページ版にアーカイブ追加！
17.31 動的型チェック
17.32 継承のまとめ
[ #pragma twice ]
http://www.kab-studio.biz/Programing/PragmaTwice/index.html


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

2007/01/21 (Sun)
　９時起き。布団敷かずにぐだー。定期更新とアニメ感想書きとぷらとわと
KAB-studio.hの送信予約で以上。ほとはー外伝３はお休み。サブ講師でもだ
し二度目だからなんとかなると思ったら。

2007/01/22 (Mon)
　おしごとは折り返し地点。ここからの演習は大変。７時過ぎに帰宅して気
づいたら寝てて１２時に起きて頭ぐるんぐるん。

2007/01/23 (Tue)
　４時に寝て６時半に起きておしごと。演習前。７時過ぎに帰宅。今日は
仮眠せず。

2007/01/24 (Wed)
　おしごと８日目。大変。サポート講師に任せてわてはコードレビュー――
サポート講師がいねー！！　帰りに食べまくる。帰ってからは世界樹の迷宮。

2007/01/25 (Thu)
　おしごと９日目。サポート講師がいないので辛いです。とっとと寝ます。

2007/01/26 (Fri)
　おしごと１０日目。本当に疲れた……。目が疲れたし足や背中も痛い。

2007/01/27 (Sat)
　早起きモード。午前中は洗濯。そのほかペンディングだったことを。明日
のほとはー外伝３は保証できない……。


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

2007/01/21 (Sun)
http://d.hatena.ne.jp/kab_studio/20070121
起きた。
[KAB-studio]KAB-studio.h縮刷版更新
[KAB-studio]ぷらとわ追加。
[KAB-studio][ほとはー]ほとはー外伝３はお休みします。
[世界樹の迷宮]6Fへ
[アニメ]「牙」 第42話「小さな救世主」
[アニメ]おねがいマイメロディ〜くるくるシャッフル！〜 
　第43話「OKだったらイイナ！」
[アニメ]ひまわりっ！！ 第3話「男殺すにゃ刃物はいらぬ」
[アニメ]京四郎と永遠の空 第3話「舞い踊る螺旋」
[アニメ]神様家族 第3話「揺れる心のルーレット」

2007/01/22 (Mon)
http://d.hatena.ne.jp/kab_studio/20070122
起きた。
帰ってきたー。
[世界樹の迷宮]B7Fへ。
[アニメ]金色のコルダ 第16話「うそつきなヴァイオリン」
[アニメ]がくえんゆーとぴあ まなびストレート！ 
　第3話「月曜日じゃ遅すぎる」
[アニメ]Master of Epic The AnimationAge 第3話

2007/01/23 (Tue)
http://d.hatena.ne.jp/kab_studio/20070123
起きた。
帰ってきた。
[買]R-TYPE II（Wiiバーチャルコンソール）
[アニメ]SHUFFLE! MEMORIES 第3話「時雨亜沙編 前編」
[アニメ]Pumpkin Scissors 第16話「斬り裂きし者」

2007/01/24 (Wed)
http://d.hatena.ne.jp/kab_studio/20070124
起きた。
帰ってきた。
[link]ぐち。
[世界樹の迷宮]ワイバーンつおい。
[きらら]まんがタイムきららフォワード Vol.4
[アニメ]DEATH NOTE 第15話「賭け」
[アニメ]ネギま！？ 第17話「夏美、家族はやっぱり絆のホームラン王ね」

2007/01/25 (Thu)
http://d.hatena.ne.jp/kab_studio/20070125
起きた。
帰ってきた。
[きらら]まんが4コマKINGSぱれっと Vol.3
[アニメ]武装錬金 第17話「夜が明けたら」

2007/01/26 (Fri)
http://d.hatena.ne.jp/kab_studio/20070126
起きた。
帰ってきた。
[装備]Wiiニュースチャンネル
[link]Wiiバーチャルコンソール ラインナップ追加
[アニメ]のだめカンタービレ 第3話
[アニメ]ひだまりスケッチ 第3話「6月17日 またはインド人」
[アニメ]セイントオクトーバー 第4話「ロリ迷惑！超昼間から吸血鬼！」
[アニメ]すもももももも〜地上最強のヨメ〜 第15話「西郷の恋」

2007/01/27 (Sat)
http://d.hatena.ne.jp/kab_studio/20070127
起きた。
[世界樹の迷宮]初全滅。
[きらら]まんがタイムきららCarat 2007年3月号
[アニメ]デルトラクエスト 第4話「ナゾナゾ巨人の呪い」
[アニメ]彩雲国物語 第35話「逢うは別れの始め」
[アニメ]おとぎ銃士 赤ずきん 第30話「ヴィーゼ村の思い出」
[アニメ]ふしぎ星の☆ふたご姫 Gyu! 
　第43話「減点パラダイス☆大暴走マーチ」
[アニメ]コードギアス 反逆のルルーシュ 第15話「喝采のマオ」


////////////////////////////////////////////////////////////////////
// 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

■追加・更新単語

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


////////////////////////////////////////////////////////////////////
〓〓ＰＲ〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

　　　　★最強SEOが1日わずか123円から!!　SEOのアクシス★

http://af1.mag2.com/m/af/0000008658/001/s00000005629001/024
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
////////////////////////////////////////////////////////////////////
// #pragma twice
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 18.05
ウィンドウプロシージャをメンバ関数にする！

「前回の最後で説明したように、ウィンドウプロシージャはただの関数で
あまり増やすことができません」
『そうすると変数が増えたときに大変ってことね』
「なので、ウィンドウプロシージャを普通のメンバ関数にします。そうすれ
ば変数を全部メンバ変数にできるから、データの管理やイベント処理が簡単
になります」
『おお！』
「というわけで、まずはそのプログラムから」

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

// WinMain() 。
int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // CDialog クラスでダイアログを作成します。
    CDialog cDialog;
    cDialog.DoModal( p_hInstance, IDD_MAIN );

    return 0;
}


// Dialog.h

// CDialog クラス。
class CDialog
{
private:
    // 最初にセットするための、自クラスのポインタ。
    static CDialog *m_pcDialog;

public:
    // ダイアログを作成します。
    int DoModal( HINSTANCE p_hInstance, int p_iDialogId );

    // ダイアログプロシージャ（形式上）。
    static BOOL CALLBACK DispatchDialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    );

    // ダイアログプロシージャ（実質）。
    BOOL DialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    );
};


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

// 最初にセットするための、自クラスのポインタ。
CDialog *CDialog::m_pcDialog = NULL;

// ダイアログを作成します。
int CDialog::DoModal( HINSTANCE p_hInstance, int p_iDialogId )
{
    // this ポインタをグローバル変数に取っておきます。
    // あとでダイアログプロシージャで渡します。
    m_pcDialog = this;

    // ダイアログを作成します。
    int iRet
        = DialogBox
            ( p_hInstance
            , MAKEINTRESOURCE( p_iDialogId )
            , NULL
            , &DispatchDialogProc
            );

    return iRet;
}

// ダイアログプロシージャ（形式上）。
BOOL CALLBACK CDialog::DispatchDialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_INITDIALOG )
    {
        // 直前に DoModal() が呼ばれてる場合。
        // this ポインタをダイアログのユーザー領域に入れます。
        SetWindowLong( p_hDlgWnd, GWL_USERDATA, (LONG)m_pcDialog );
        m_pcDialog = NULL;
    }

    // ダイアログの 32 ビット整数に格納されている 
    // this ポインタを取りだします。
    CDialog *pcDialog 
        = (CDialog *)GetWindowLong( p_hDlgWnd, GWL_USERDATA );
    if( pcDialog == NULL )
    {
        // NULL の時は何もしません。
        return 0;
    }

    // メンバ関数のダイアログプロシージャを呼び出します。
    return 
        pcDialog->DialogProc
            ( p_hDlgWnd
            , p_uiMessage
            , p_wParam
            , p_lParam 
            );
}

// ダイアログプロシージャ（実質）。
BOOL CDialog::DialogProc
    ( HWND p_hDlgWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_COMMAND )
    {
// ここは Version 18.03 ( No.390 ) の CDialog::DialogProc() と
// 同じです。

// Version 18.04 ( No.391 ) で SetWindowLong() 関数を呼び出す箇所を
// 追加している場合は、削除してください。削除しないと動きません！

            return TRUE;
        }
    }
    return FALSE;
}

『長！』
「ちょっと構造が複雑だから分かりづらいかも。概略を説明するとこうなり
ます」

WinMain()
　↓
CDialog::DoModal()            ダイアログ作成。
　↓
CDialog::DispatchDialogProc() 初回は SetWindowLong() でポインタセット。
　↓
CDialog::DispatchDialogProc() GetWindowLong() でポインタ取得。
　↓
DialogProc()                  ポインタを通して呼び出し。

「ひとつひとつ見ていきます。まず WinMain() 関数では、これまでは
DialogBox() 関数を呼び出していたけど、この呼び出しを
CDialog クラスの DoModal() メンバ関数で呼び出すようにしています」
『これはなんで？』
「 CDialog クラスの static メンバ変数を使ったりするからね。
CDialog クラスには、自クラスのポインタを持つ static メンバ変数があり
ます」

// 最初にセットするための、自クラスのポインタ。
CDialog *CDialog::m_pcDialog = NULL;

「このポインタに、ダイアログ作成直前に this ポインタをセットします」

// ダイアログを作成します。
int CDialog::DoModal( HINSTANCE p_hInstance, int p_iDialogId )
{
    // this ポインタをグローバル変数に取っておきます。
    // あとでダイアログプロシージャで渡します。
    m_pcDialog = this;

「こうして、 static メンバ変数にとっておいてから DialogBox() 関数で
ダイアログを作成します。このとき、ダイアログプロシージャには
DispatchDialogProc() static メンバ関数を指定します」
『って言っても前回だって static メンバ関数だったし、これは名前が変
わっただけだよね』
「そうなんだけど、中身は全く違います。まず、ダイアログプロシージャ
が最初に呼ばれたとき、つまり最初のメッセージが送られてきたときに
ウィンドウの 32 ビット領域に、さっき取っておいた自クラスのアドレス
を保存します」

    if( p_uiMessage == WM_INITDIALOG )
    {
        // 直前に DoModal() が呼ばれてる場合。
        // this ポインタをダイアログのユーザー領域に入れます。
        SetWindowLong( p_hDlgWnd, GWL_USERDATA, (LONG)m_pcDialog );
        m_pcDialog = NULL;
    }

「ダイアログの場合、一番最初に送られるメッセージは WM_INITDIALOG 
なので、このときに Version 18.04 ( No.391 ) の方法でアドレスを
セットします」
『こうすると……』
「 WinMain() 関数で作った cDialog 変数のアドレスが、今作った
ダイアログの 32 ビット整数値にセットされるわけです」

    CDialog cDialog; ← この変数のアドレス。

「で、これが初回のみ。そのあとは、 GetWindowLong() という API で、
今セットしたアドレスをウィンドウから取得します。

    // ダイアログの 32 ビット整数に格納されている 
    // this ポインタを取りだします。
    CDialog *pcDialog 
        = (CDialog *)GetWindowLong( p_hDlgWnd, GWL_USERDATA );

『なるほど、今度は逆に取り出して、それを CDialog クラスのポインタに
キャストするわけね』
「で、これを使ってメンバ関数を呼び出します」

    // メンバ関数のダイアログプロシージャを呼び出します。
    return 
        pcDialog->DialogProc
            ( p_hDlgWnd
            , p_uiMessage
            , p_wParam
            , p_lParam 
            );

「この DialogProc() が実質的なダイアログプロシージャになります」
『この中でメッセージの処理をして、しかも普通のメンバ関数である、と』
「そういうこと！　この仕組みを使うことで、ウィンドウと cDialog 変数
を結びつけることができて、その DialogProc() メンバ関数を呼び出すこと
ができるというわけです」

/*
    Preview Next Story!
*/
『すっげー複雑！』
「確かに複雑かもね」
『色々な機能が組み合わさっているっていうか』
「でももうちょっと複雑なところまで説明するから」
『げげ』
「というわけで次回」
＜ Version 18.06 イベントハンドラをオーバーライドで ＞
『につづく！』
「 MFC を真似てるから、このくらいはね」
『ってことは MFC くらいすごいのができる？』
「すごいかどうかは分からないけど、 MFC よりもいいかもね」


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

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

