EditControl を使ったデータ入力と表示

VC++ の EditControl から GetDlgItemText() でデータを入力して、最大公約数と最小公倍数を計算して表示します。
dprintf() で実行の様子をトレースしています。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクトで[空のプロジェクト](Dlggcm)を作成します。
  2. [プロジェクト][リソースの追加][Dialog][新規作成]で DialogBoxを作成します。
    詳細は Dialog Box のプログラム を参照して下さい。
  3. Dialog Box に[StaticText]と[EditControl]と[Button]を配置して下さい。
    ツールボックスから部品を選んでドラッグ&ドロップして、大きさを整えます。
    [DATA-1][DATA-2][最大公約数][最小公倍数]は StaticText です。
    StaticText の右に配置されている箱は EditControl です。
    [計算]は[OK]の、[終了]は[キャンセル]のキャプションを変更した Button です。

  4. ツールボックスが表示されていないときは画面右上のツールバーを操作して表示して下さい。

    VC 6.0 では[ツール][カスタマイズ][ツールバー]から[コントロール]にチェックを入れます。
    または DialogBox が表示されている外側で「右クリック」して[コントロール]をチェックして下さい。
  5. 画面左下(右下)のプロパティから表を参考にしてキャプションとIDを設定して下さい。
    EditControl の ID は規定値のまま使っています。
    キャプション ID
    DATA-1 IDC_EDIT1
    DATA-2 IDC_EDIT2
    最大公約数 IDC_EDIT3
    最小公倍数 IDC_EDIT4
    計算 IDOK
    終了 IDCANCEL
  6. VC 6.0 ではリソースボックス(Script1)を閉じると保存確認の問い合わせがあるのでフォルダーを確認して dlggcm.rc の名前で保存します。
    フォルダーを確認しないと、前回作業していた別のフォルダーに格納されることがあるので注意して下さい。
    次のファイルが新たに作成されます。
    dlggcm.rc
    resource.h
  7. ソースプログラムをテキストエディタなどで作成し、プロジェクトのフォルダーに格納して [プロジェクト] [既存項目の追加] からプロジェクトに追加します。
    最大公約数と最小公倍数を計算して表示する部分はコメントになっています。
    dprintf() を使うときは dprintf.h を取り込んで下さい。
    /*************************************************************/
    /*★ EditControl から入力して GCM,LCM を計算する   前田 稔 ★*/
    /*************************************************************/
    #include    <windows.h>
    #include    <dprintf.h>
    #include    "resource.h"
    
    // 関数のプロトタイプ宣言
    LRESULT CALLBACK DialogProc( HWND, UINT, WPARAM, LPARAM );
    
    //★ Windows MAIN 関数
    int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                          LPSTR lpCmdLine, int nCmdShow )
    {
        dprintf("Program が開始しました");
        DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DialogProc);
        dprintf("Program を終了します");
        return TRUE;
    }
    
    //★ Dialog Box の CALLBACK 関数
    LRESULT CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
    {   char        str[12];
        int         data1,data2,work;
    
        switch(msg)
        {
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {   case IDOK:
                        data1=data2=work= 64;       //エラーを起こさないように、仮の値を設定
                        dprintf("IDOK がクリックされました");
                        GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str));
                        dprintf("IDC_EDIT1=%s",str);
                        data1= atoi(str);
                        GetDlgItemText(hDlg,IDC_EDIT2,str,sizeof(str));
                        dprintf("IDC_EDIT2=%s",str);
                        data2= atoi(str);
                        work= data1*data2;
                        while(data1 != data2)
                        {   if (data1>data2)    data1-= data2;
                            else                data2-= data1;
                        }
                        wsprintf(str,"%d",data1);
                        SetDlgItemText(hDlg,IDC_EDIT3,str);
                        wsprintf(str,"%d",work/data1);
                        SetDlgItemText(hDlg,IDC_EDIT4,str);
                        break;
                    case IDCANCEL:
                        dprintf("IDCANCEL がクリックされました");
                        PostMessage(hDlg,WM_CLOSE,0,0);
                        return TRUE;
                }
                break;
            case WM_CLOSE:
                EndDialog(hDlg, TRUE); 
                return TRUE;
        }
        return FALSE;
    }
        
  8. [デバッグ]を選択してビルドに続いて実行を行います。
    [DATA-1]と[DATA-2]に整数をタイプして[計算]をクリックします。
    [最大公約数]と[最小公倍数]が右側のボックスに表示されたら完成です。

プログラムの説明

少量のデータを入力したり、簡単な計算結果を表示するときは EditControl を使うと便利です。
  1. DialogProc() は DialogBox のコールバック関数です。
    計算ボタンがクリックされると IDOK に制御が渡されます。
        LRESULT CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
        {   char        str[12];
            int         data1,data2,work;
    
            switch(msg)
            {
                case WM_COMMAND:
                    switch(LOWORD(wParam))
                    {   case IDOK:
        
  2. EditControl からデータを取得するときは GetDlgItemText() を使います。
    取得したデータは文字列なので atoi で int に変換します。
            GetDlgItemText(hDlg,IDC_EDIT1,str,sizeof(str));
            data1= atoi(str);
        
  3. EditControl に結果を表示するときは SetDlgItemText() を使います。
    表示するのは文字列なので wsprintf() で文字列に変換します。
            wsprintf(str,"%d",data1);
            SetDlgItemText(hDlg,IDC_EDIT3,str);
        
  4. WM_CLOSE: にはウインドウが閉じられる時に制御が渡されます。
        case WM_CLOSE:
            EndDialog(hDlg, TRUE); 
            return TRUE;
        

【演習】

  1. char str[12] に格納されている数字を int に変換するときは atoi() を使います。
  2. 最大公約数はユークリッドの互除法を使った次の手順で計算できます。
    1. data1 と data2 が等しいとき data1 が最大公約数です。
    2. data1 が data2 より大きいとき data1-=data2 を計算して 1. に戻ります。
    3. data2 が data1 より大きいとき data2-=data1 を計算して 1. に戻ります。
  3. 最小公倍数は「data1*data2/最大公約数」で求まります。
    ただし、data1, data2 は、前項の操作をする前の値です。

超初心者のプログラム入門(Win32API C++)