C++Builder 2007 でのウィンドウメッセージ処理

エンバカデロによる買収が決まったCodeGearですが、個人的には応援しています。

Delphi は使いやすく、情報も豊富なのですが、私はとっくに Pascal よりも C++ に慣れてしまったので、できれば C++ Builder をメインに使いたいところです。
Delphi の参考書や資料の多くは VCL について説明しているので、そのノウハウのかなりの部分は使えます。
しかし C++ Builder に固有の話題についての情報はとても少ないのが現状です。

Windowsプログラミング逆引きクロス大辞典

Windowsプログラミング逆引きクロス大辞典

Windowsプログラミング逆引きクロス大辞典」にはTurbo DelphiとTurbo C++というかたちで、VB6 や .Net との比較がなされています。
Turbo C++C++Builderだと思って読むことができるので、CodeGear RAD Studio 2007を使う上で重宝しそうです。

Delphi で「メッセージメソッド」と呼ばれている機能の実現方法が今日やっとわかりました。忘れないように書いておきます。
mciSendString を使って mp3 ファイルを再生して、再生終了のメッセージを MCI から受け取る例です。
VCLフォームアプリケーションにボタンをひとつ貼り付けて、以下のように記述。
mmsystem.h をインクルードしないと MM_MCINOTIFY が未定義になります。

C:\tone_a.mp3 を用意してボタンを押すと、音声再生が終了したらメッセージボックスが表示されます。

//---------------------------------------------------------------------------
// Unit1.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
// by nishimotz
#include <mmsystem.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE 管理のコンポーネント
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
	void __fastcall MMMCINotify(TMessage &Msg);
BEGIN_MESSAGE_MAP
	VCL_MESSAGE_HANDLER(MM_MCINOTIFY, TMessage, MMMCINotify)
END_MESSAGE_MAP(TForm);
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
// Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	mciSendString("open \"c:\\tone_a.mp3\" type Mpegvideo alias mp3", NULL, 0, 0);
	mciSendString("play mp3 notify", NULL, 0, Form1->Handle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MMMCINotify(TMessage &Msg)
{
	ShowMessage("done.");
	mciSendString("close mp3", NULL, 0, 0);
}

END_MESSAGE_MAP(TForm) の後ろのセミコロンを忘れて、しばらくはまりました。
VCL_MESSAGE_HANDLER に関する情報は RAD Studio のヘルプでも CodeGear のサイトでも見つけることができず、個人の方のウェブサイトを参考にさせていただきました。