前回の Dialog は、単にボタンが押されたことを 知るだけのものでした。実際のプログラムでは、Dialog から文字列を取得 したい場合が多々あります。ここでは、Dialog から文字列を取得します。
Dialog の中に文字列取得を組み込むには、EDITTEXTが便利です。 しかし、この場合 OK や Cancel ボタンなどとは違って、システムに用意された ID を使うわけにはいかないので、別に用意する必要があります。ここでは 今まで使ってきた resource.h に、IDC_EDIT_MYCMND を つけ加えましょう。
/* resource.h */ #define ID_FILE_EXIT 10001 #define ID_FILE_CMND 10002 #define IDC_EDIT_MYCMND 12001また、リソースファイルの MyCmndDlg の部分は、例えば
MyCmndDlg DIALOG DISCARDABLE 0, 0, 128, 64 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "My Command Dialog" BEGIN EDITTEXT IDC_EDIT_MYCMND, 24, 10, 96, 12, ES_AUTOHSCROLL DEFPUSHBUTTON "Ok", IDOK, 24, 24, 48, 12 PUSHBUTTON "Cancel", IDCANCEL, 72, 24, 48, 12 ENDとしましょう。とりあえず、これで文字列を入力する窓を持った Dialog が開きます。
いま用意した文字列入力窓に設定された値を取り出すには GetDlgItemText() 関数を、また初期値などを設定するには、SetDlgItemText()関数を使います。
さて、ここで受け取った文字列を保存する必要があります。これは、このプログラム 全体で共通に使います。今後も、このような変数が増えてきますので、 ヘッダファイル myvariab.h を作っておきます。
/* myvariab.h */ #ifndef MYVARIAB_H_INCLUDED #define MYVARIAB_H_INCLUDED #ifdef MY_MAIN #define EXTERN #else #define EXTERN extern #endif #define MY_MAXCMNDLEN 1024 EXTERN TCHAR mycmndstr[MY_MAXCMNDLEN]; EXTERN UINT mycmndlen; #endif /* MYVARIAB_H_INCLUDED */ここで、TCHARという型は、コンパイルオプションにより char や wchar_t に切り替わります。
文字列を mycmndstr に 受け取るように MyCmndProc() を次のように書き換えます。
/* mycmnd.c */
#define STRICT
#include <windows.h>
#include "resource.h"
#include "myvariab.h"
BOOL CALLBACK MyCmndProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
WORD wNotifyCode;
WORD wID;
switch( uMsg )
{
case WM_COMMAND:
wNotifyCode = HIWORD( wParam );
wID = LOWORD( wParam );
if( wID == IDOK )
{
mycmndlen =
GetDlgItemText( hDlg, IDC_EDIT_MYCMND, mycmndstr, MY_MAXCMNDLEN );
EndDialog( hDlg, (int)wID );
return TRUE;
}
else if( wID == IDCANCEL )
{
EndDialog( hDlg, (int)wID );
return TRUE;
}
break;
default:
break;
}
return FALSE;
}