Dialog 中の文字列を取得することができるようになりましたが、この ままでは正しく読み込まれたかどうか確認できません。そこで、Dialog から 読み込んだ文字列をスクリーンへ表示してみることにします。今、 変数 mycmndstr と mycmndlen に値が設定されていますから、 以前にやった OnPaint() を書き換えるのが簡単です。
/* paint.c */ #define STRICT #includeしかし、これだけでは足りません。Window を書き換える必要があることを システムに知らせなければなりません。これを行うのに、ここでは画面が 変更された可能性があるという通知を行う InvalidateRect() 関数を 使います。これにより、WM_PAINT メッセージが発生し、正しい 文字列が表示されるようになります。具体的には、WndProc() で、#include "myvariab.h" void OnPaint( HDC hdc ) { if( mycmndlen > 0 ) TextOut( hdc, 0, 0, mycmndstr, mycmndlen ); }
case WM_COMMAND: wNotifyCode = HIWORD( wParam ); wID = LOWORD( wParam ); switch( wID ) { : case ID_FILE_CMND: hInst = (HINSTANCE)GetWindowLong( hwnd, GWL_HINSTANCE ); if( DialogBox( hInst, "MyCmndDlg", hwnd, (DLGPROC)MyCmndProc ) == IDOK ) InvalidateRect( hwnd, NULL, TRUE ); break; :とします。
さて、これで一応動くことは動くのですが、mycmndlen や mycmndstr の初期化が行われていません。また、Dialog の文字入力窓の初期化も行われて ません。これは大変危険なので、初期化操作を入れます。mycmndlen と mycmndstr については、WinMain() の中で、Window を Create する 前に行うものとして、別関数 initapp() を用意することにします。
/* initapp.c */ #define STRICT #include <windows.h> #include "myvariab.h" BOOL initapp( void ) { /* Initialize variables */ mycmndlen = 0; mycmndstr[0] = (TCHAR)0; return TRUE; }これに対応して、WinMain() では、CreateWindow() の前に initapp() の呼び出しを行うことにして、
: BOOL initapp( void ); : int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { : /* Initialize variables etc. */ if( !initapp() ) return 0; /* Create our window. */ hwnd = CreateWindow( MY_CLASS_NAME, MY_WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)NULL, (HMENU)NULL, hInstance, (LPVOID)NULL ); :とします。
一方、Dialog の方の初期化は、WM_INITDIALOG メッセージに対する 応答で行います。
BOOL CALLBACK MyCmndProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { WORD wNotifyCode; WORD wID; switch( uMsg ) { case WM_INITDIALOG: SetDlgItemText( hDlg, IDC_EDIT_MYCMND, mycmndstr ); return TRUE; case WM_COMMAND: :リソースファイルの MyCmndDlg の最初の item が、この EDITTEXT に なっているので、初期化が正しく行われることにより、Dialog が開いた時に、 ここにフォーカスが設定されます。また、TAB によるフォーカスの 移動を行うために、リソースファイルの、この Dialog の各 item に WS_TABSTOP をつけておきましょう。具体的には
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 | WS_TABSTOP DEFPUSHBUTTON "Ok", IDOK, 24, 24, 48, 12, WS_TABSTOP PUSHBUTTON "Cancel", IDCANCEL, 72, 24, 48, 12, WS_TABSTOP ENDのようにします。