前回の 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; }