ダイアログボックスを作る(1)

前回は、メッセージボックスだったので、ユーザーからの入力はYESかNOか選ぶぐらいしか できませんでした。ファイル名ぐらい指定したいですよね。では、ダイアログボックスを作ります。 エディットコントロールを配置すれば、一行入力ができるようになります。アイコンや文字列やボタンも 配置できます。ダイアログボックスは、ダイアログエディタで作るのが一般的ですが、 テキストエディタだけで作ることもできます。

ダイアログ型サウンドプレーヤ

まずは以下のようなダイアログボックスをダイアログエディタもしくはリソースエディタで作 ってください。
ダイアログ

これを保存すると、以下のようなダイアログテンプレートが出来ます。 (Borlandのリソースワークショップを使うと、dlgではなくrcファイルになると思います。) ダイアログエディタをお持ちでない方は、これを直接テキストエディタで作成してください。

ファイル名:easyplay.dlg

EASYPLAY DIALOG 21, 16, 146, 55
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "EASYPLAY"
FONT 12, "System"
BEGIN
    ICON  "eplayicon",  IDICON,    8, 8, 16, 14
    LTEXT "ファイル名", 102,      47, 6, 82, 8
    EDITTEXT            IDEDIT,   44, 18, 94, 12, ES_AUTOHSCROLL
    PUSHBUTTON "再生",  IDPLAY,   44, 35, 40, 14
    PUSHBUTTON "閉じる",IDCANCEL, 96, 35, 40, 14
END
それ以外に必要なファイルは、以下の通り。

ファイル名:easyplay.h

#include <windows.h>
#include <mmsystem.h>
#define IDICON 101
#define IDEDIT 103
#define IDPLAY 104

ファイル名:easyplay.rc

#include "easyplay.h"
eplayicon  ICON "easyplay.ICO"
#include "easyplay.dlg"

ファイル名:easyplay.c

#include "easyplay.h"
/*ダイアログ関数(Windowsからコールバックされる)*/
/*「FAR PASCAL」は「CALLBACK」でも可。その場合「extern "C"」を含む3行は不要*/
#ifdef __cplusplus
extern "C"
#endif
BOOL FAR PASCAL easyplay(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
	char buf[260];

	switch(msg){
	case WM_COMMAND:
		switch((WORD)wParam) {/*コントロールID*/
		case IDPLAY:
			GetWindowText(GetDlgItem(hDlg, IDEDIT), buf, sizeof(buf));
			/* GetDlgItemText(hDlg, IDEDIT, buf, sizeof(buf)); でも良い */
			sndPlaySound(buf, SND_SYNC);
			break;
		case IDCANCEL:		/* 「閉じる」ボタン OR システムメニューの「閉じる」 */
			EndDialog( hDlg, wParam );
			break;
		default:
			return FALSE; /*メッセージを処理しなかった*/
		}
		break;
	case WM_INITDIALOG:
		SetFocus(GetDlgItem(hDlg,IDEDIT));
		return FALSE;/* SetFocusしたらFALSE */
	default:
		return FALSE; /*メッセージを処理しなかった*/
	}
	return TRUE; /*メッセージを処理した*/
}
/*メイン関数*/
int PASCAL WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int cmdshow){
	DLGPROC lpProc = (DLGPROC)MakeProcInstance((FARPROC)easyplay, hinst);
	DialogBox(hinst, "EASYPLAY", NULL, lpProc);/*ここでダイアログボックスを作成*/
	FreeProcInstance((FARPROC)lpProc);
	return 0;
}

ファイル名:easyplay.def(16ビットの場合)

NAME	EASYPLAY
DESCRIPTION  'EASYPLAY: EASY SOUND PLAYER'
EXETYPE WINDOWS
STUB	    'WINSTUB.EXE'
CODE    PRELOAD MOVEABLE
DATA    MOVEABLE PRELOAD MULTIPLE
HEAPSIZE  4096
STACKSIZE 8192
EXPORTS
	EASYPLAY  @1

コンパイル方法

今回は、マルチメディアAPIを使ったので、32ビットならWINMM.LIB 16ビットならMMSYSTEM.LIBを 追加する必要があります。

GUI環境でコンパイルする場合

WINMM.LIBもしくはMMSYSTEM.LIBをプロジェクトに追加してください。

コマンドラインからコンパイルする場合

なお、日本語に対応していないコンパイラを使う場合は、C言語ソースだけではなく、 ダイアログテンプレート等も、漢字フイルタを通す必要があります。

では、実行してみてください。ファイル名の部分にWAVファイルをフルパスで入れて 「再生」ボタンを押すと音が鳴ります。「閉じる」ボタンを押すと、プログラムを 終了します。かなりWindowsプログラムらしくなってきましたね。
(長くなってきたので、プログラムの説明は次回に回します。)

前のページ

次のページ

一つ上のページに戻る