////////////////////////////////////////////////////////////////////
◎ ≪---= 業務用小型ダーツマシン「ダーツイーグル」

こんなに小さくても立派な業務マシン！
ダーツマシン設置でちょっとしたお小遣い稼ぎ。

できるだけ省スペースで、安価に置けるダーツマシンが↓ここ↓にあります。
『大阪ギフトショー新製品コンテスト大賞受賞！』
http://af1.mag2.com/m/af/0000008658/001/s00000001980002/006
////////////////////////////////////////////////////////////////////
/*

	KAB-studio.h


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

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

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

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

2007/02/05 (Mon)
　#pragma twice ホームページ版にアーカイブ追加！
18.02 計算機アプリを API だけで作る
18.03 ダイアログプロシージャを static メンバ関数にする
[ #pragma twice ]
http://www.kab-studio.biz/Programing/PragmaTwice/index.html


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

2007/01/28 (Sun)
　８時半起き。午前中は定期更新とアニメ感想書き。世界樹の迷宮はパーティ
に新キャラ追加。ぷらとわ書き。夕方に横浜へ。ほとはー外伝３は多分無理。
そしてアニメたまる。

2007/01/29 (Mon)
　おしごと１１日目。明日最終日。負荷が低くてのんびり。帰ってからは
世界樹の迷宮とか。

2007/01/30 (Tue)
　講師先Ｂ社でのおしごと最終日。まったりな感じだった。夜に生徒さん達
と飲み。明日から旅行。

2007/01/31 (Wed)
　作者里帰りのためお休み。

2007/02/01 (Thu)
　作者里帰りのためお休み。

2007/02/02 (Fri)
　作者里帰りのためお休み。

2007/02/03 (Sat)
　石垣島に旅行に行ってきました。詳しくはあとでかぶろぐにて。帰りの
飛行機で「お客様にお医者様は――」。今回の旅行は色々すごかった。


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

2007/01/28 (Sun)
http://d.hatena.ne.jp/kab_studio/20070128
起きた。
[KAB-studio]ぷらとわ追加。
[KAB-studio][ほとはー]ほとはー外伝３はお休みします。
[世界樹の迷宮]B11Fへ＆新メンバー追加
[買]コミックスとか
[アニメ]「牙」 第43話「明かされた真実」
[アニメ]おねがいマイメロディ〜くるくるシャッフル！〜 
　第44話「出てきてくれたらイイナ！」
[アニメ]ひまわりっ！！ 第4話「攻めるも守るも紙一重」
[アニメ]京四郎と永遠の空 第4話「恋蛍」
[アニメ]神様家族 第4話「天使（テンコ）の涙　輝く翼の先に…」

2007/01/29 (Mon)
http://d.hatena.ne.jp/kab_studio/20070129
起きた。
帰ってきた。
[世界樹の迷宮]クエストこなし中。
[アニメ]金色のコルダ 第17話「焦燥のクレッシェンド」
[アニメ]がくえんゆーとぴあ まなびストレート！ 
　第4話「プロモでゴーの巻」
[アニメ]Master of Epic The AnimationAge 第4話

2007/01/30 (Tue)
http://d.hatena.ne.jp/kab_studio/20070130
起きた。
帰ってきた。
[アニメ]SHUFFLE! MEMORIES 第4話「ネリネ編 前編」
[アニメ]Pumpkin Scissors 第17話「なお救われぬ闇たち」

2007/01/31 (Wed)
http://d.hatena.ne.jp/kab_studio/20070131
起きた（爆）。
[link][装備]カラフルiPod shuffle！
石垣島
[アニメ]DEATH NOTE 第16話「決断」
[アニメ]ネギま！？ 第18話「秘密だっつーと（略）」

2007/02/01 (Thu)
http://d.hatena.ne.jp/kab_studio/20070201
石垣島桟橋
西表島
由布島
竹富島
星砂の浜
星砂
また水牛
猫
[アニメ]奏光のストレイン 第11話「狂宴の幕開け」
[アニメ]武装錬金 第18話「逃避行」

2007/02/02 (Fri)
http://d.hatena.ne.jp/kab_studio/20070202
出発
具志堅記念館
八重山民俗資料館
川平湾
バンナ展望台
石垣島空港
帰宅。
[アニメ]のだめカンタービレ 第4話
[アニメ]ひだまりスケッチ 第4話「5月18日 歌うショートケーキ」
[アニメ]セイントオクトーバー 
　第5話「ロリ再戦！エルロックの超リベンジ！」
[アニメ]すもももももも〜地上最強のヨメ〜 第16話「倦怠期の壊し方」

2007/02/03 (Sat)
http://d.hatena.ne.jp/kab_studio/20070203
へろー。
[世界樹の迷宮]ゴーレム討伐。
[食][石垣島旅行]石垣島みやげ。
[アニメ]デルトラクエスト 第5話「ニジとドッジのわな」
[アニメ]彩雲国物語 第36話「世はすべてこともなし」
[アニメ]おとぎ銃士 赤ずきん 第31話「ふたりの絆」
[アニメ]ふしぎ星の☆ふたご姫 Gyu! 第44話「激突！☆ファンゴとフィンゴ」
[アニメ]コードギアス 反逆のルルーシュ 第16話「囚われのナナリー」


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

■追加・更新単語

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


////////////////////////////////////////////////////////////////////
◎ ≪---= 業務用小型ダーツマシン「ダーツイーグル」

こんなに小さくても立派な業務マシン！
ダーツマシン設置でちょっとしたお小遣い稼ぎ。

できるだけ省スペースで、安価に置けるダーツマシンが↓ここ↓にあります。
『大阪ギフトショー新製品コンテスト大賞受賞！』
http://af1.mag2.com/m/af/0000008658/001/s00000001980002/006
////////////////////////////////////////////////////////////////////
// #pragma twice
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 18.06
イベントハンドラをオーバーライドで

「前回は、ウィンドウの 32 ビット整数にビットウィンドウプロシージャの
アドレスを入れて、それを通して呼び出すという方法を説明しました」
『なんかものすごい方法だったね……』
「で、ちょっと難しかったかもしれないので、図を使ってもう一度説明しま
す」
『おー』

┌ウィンドウ────────────────┐
│ ※イベント発生！※→→→→→→→→→→→→→→→
│┌32ビット領域────────────┐  │    ↓(1)
││CDialog クラスの変数のアドレス      │  │    ↓イベントが発生
│└──────────────────┘  │    ↓して、ウィンドウ
└─────────────────↑───┘    ↓プロシージャが
                                    ↑            ↓呼び出されます
┌CDialog::DispatchDialogProc() ──↑───┐    ↓
│(2) GetWindowLong() で CDialog クラスの   │    ↓
│    変数のアドレスを取得します            │ ←←
│(3) そのアドレスを使って CDialog クラスの │
│    DialogProc() メンバ関数を呼び出します │
└────────────────↓────┘
                                  ↓
┌CDialog クラスの変数──────↓────┐      
│┌ DialogProc() メンバ関数──────┐  │
││(4)ここでイベント処理をします       │  │
│└──────────────────┘  │
└─────────────────────┘

「(1)ウィンドウで〈ボタンが押された〉といったイベントが発生すると、
Windows システムがそのウィンドウに結びつけられたウィンドウプロシージャ
を呼び出します」
『これはいつものやつね』
「このウィンドウプロシージャは、ダイアログの場合 DialogBox() 関数の
第4引数なので、 CDialog クラスの DispatchDialogProc() メンバ関数が呼
び出されます」
『うんうん』
「次に(2) DispatchDialogProc() メンバ関数がウィンドウプロシージャと
して呼び出されますが、このときイベントが発生したウィンドウの
ウィンドウハンドルが一緒に渡されます」
『第1引数ね』
「これを使って、 GetWindowLong() 関数でウィンドウから 32 ビット整数
を取得します。ここには WinMain() 関数で作った CDialog クラスの変数の
アドレスが入っています」
『一番最初、 WM_INITDIALOG メッセージを受け取った時にセットしたヤツ
ね』
「(3)このアドレスを CDialog クラスのポインタにキャストして入れてから
DialogProc() メンバ関数を呼び出します。全部引数を渡してね」
『で、(4) DialogProc() メンバ関数が呼ばれるからここで実際のイベント
処理をする、ってわけね』
「そういうこと」
『質問！』
「はい火美ちゃん」
『 CDialog クラスのメンバ関数なのに、なんで図では CDialog クラスに入
ってないの？』
「 static メンバ関数だからね。この図、一番下は CDialog クラスの
〈変数〉でしょ」
『あ、ホントだ』
「 static メンバはそのクラスの変数の数に関係なく使えるから別にしまし
た」
『もひとつ質問！』
「はい火美ちゃん」
『この仕組みを使うメリットって？』
「ひとつは、ウィンドウが増えた時に対応しやすいこと。普通の方法だと、
複数のウィンドウでひとつのウィンドウプロシージャを共有するため、処理
が煩雑になります」
『それがこの方法だと大丈夫ってこと？』
「そう。この方法なら、ウィンドウの数だけ CDialog クラスの変数が用意
されて、それぞれメンバ変数としてデータを持つことができるし、メンバ関数
も別々に持つことだってできるから」
『んー、そのメンバ関数を別々に持つっていうのがよく分からないんだけど』
「今の段階だとまだ分からないと思うから、もう少し改良してみようか」
『改良？』
「今のプログラムは、ダイアログプロシージャ、つまり 
DialogProc() メンバ関数が CDialog クラスの中にあるでしょ」
『それじゃいけないの？』
「これでもいいんだけど、仮想関数を使うことで拡張性が高くなるんです」
『仮想関数…… virtual 付けてオーバーライドするってこと？』
「そういうこと。じゃあプログラムを見てみようか。全体的にちょっとずつ
修正するから注意してね。まず CDialog クラスの DialogProc() メンバ関数
を純粋仮想関数にします」

// Dialog.h

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

public:
	// デストラクタ。
	virtual ~CDialog();

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

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

	// ダイアログプロシージャ（純粋仮想関数）。
	virtual BOOL DialogProc
	( HWND p_hDlgWnd
	, UINT p_uiMessage
	, WPARAM p_wParam
	, LPARAM p_lParam
	) = 0;
};

『 DialogProc() メンバ関数に virtual と【 = 0】が付いた』
「 Version 17.10 ( No.365 ) で説明したように、 virtual を付けること
でメンバ関数が仮想関数になります」
『これでオーバーライドできるようになるんだね』
「続いて Version 17.16 ( No.371 ) で説明したように、仮想関数の宣言
の後ろに【 = 0】を付けることで、そのメンバ関数は純粋仮想関数になりま
す」
『ってことは、このメンバ関数の本体はなくなるの？』
「そう、だから Dialog.cpp ソースファイルはこうなります」

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

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

// デストラクタです。
CDialog::~CDialog()
{
	// 何もしません。
}

// ダイアログを作成します。
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 
			);
}

// DialogProc() メンバ関数は純粋仮想関数にしたのでは削除しました。

『 DialogProc() メンバ関数がなくなってる……あ、あとデストラクタがあ
るね』
「 Version 17.30 ( No.385 ) で説明したように、継承を使う場合は
デストラクタを仮想関数にする必要があるからね。残りは次回に！」

/*
    Preview Next Story!
*/
『最近なんだかプログラム長いこと多いね』
「 API だけだとどうしてもそうなるね」
『あー、 MFC だとイベントハンドラだけしか見なくていいもんね』
「その辺は共通ライブラリのメリットかな」
『メリットなの……かなぁ』
「というわけで次回」
＜ Version 18.07 ウィンドウプロシージャを純粋仮想関数にする、の続き ＞
『につづく！』
「……実際、もう残り回数が少ないのにコードでスペース取られるのは……」
『うわぶっちゃけた』


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

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

