MZC4で無料Windowsアプリ開発

電卓を作る

戻る | 前へ | 次へ


今回は、電卓を作りましょう。MyProject_res.rcをRisohEditorで開いて下さい。

「ダイアログの編集」を開いて、[Ctrl]+[A]を押した後、[Del]キーでダイアログのすべてのコントロールを削除します。

次のように、コントロールを配置します。

[コントロールの配置]

コントロールが入りきらないときは、ダイアログのサイズを調整して下さい。

コンボボックスのプロパティを開きます。 コンボボックスのcmb1のCBS_SORTスタイルは解除して、CBS_DROPDOWNLISTスタイルを設定して下さい。 「ダイアログのプロパティ」で、「キャプション」を「電卓」にしましょう。 リソーステキストは次のようになります。

[コントロールの配置2]

MyProject.cppを編集します。OnTimerメソッドを削除して、DialogProcDxからWM_TIMER/OnTimerの登録を解除します。

OnInitDialogメソッドを次のようにします。

    BOOL OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
    {
        SendMessageDx(WM_SETICON, ICON_BIG, LPARAM(m_hIcon));
        SendMessageDx(WM_SETICON, ICON_SMALL, LPARAM(m_hIconSm));

        HWND hCmb1 = GetDlgItem(hwnd, cmb1);
        ComboBox_AddString(hCmb1, TEXT("+"));
        ComboBox_AddString(hCmb1, TEXT("-"));
        ComboBox_AddString(hCmb1, TEXT("*"));
        ComboBox_AddString(hCmb1, TEXT("/"));
        ComboBox_SetCurSel(hCmb1, 0);
        return TRUE;
    }

OnCommandメソッドを次のようにします。

    void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
    {
        switch (id)
        {
        case psh1:
            OnPsh1(hwnd);
            break;
        case IDOK:
            EndDialog(IDOK);
            break;
        case IDCANCEL:
            EndDialog(IDCANCEL);
            break;
        }
    }

次のようなOnPsh1メソッドをMMainDlgクラスに追加します。

    void OnPsh1(HWND hwnd)
    {
        INT nValue1 = GetDlgItemInt(hwnd, edt1, NULL, TRUE);
        INT nValue2 = GetDlgItemInt(hwnd, edt2, NULL, TRUE);
        INT nValue3 = 0;

        HWND hCmb1 = GetDlgItem(hwnd, cmb1);
        INT iSel = ComboBox_GetCurSel(hCmb1);
        switch (iSel)
        {
        case 0: // "+"
            nValue3 = nValue1 + nValue2;
            break;
        case 1: // "-"
            nValue3 = nValue1 - nValue2;
            break;
        case 2: // "*"
            nValue3 = nValue1 * nValue2;
            break;
        case 3: // "/"
            nValue3 = nValue1 / nValue2;
            break;
        }

        SetDlgItemInt(hwnd, edt3, nValue3, TRUE);
    }

前回と同様に手動ビルドします。

g++ -static -c -o MyProject.o MyProject.cpp
windres -i MyProject_res.rc -o MyProject_res.o
g++ -static -mwindows -o MyProject MyProject.o MyProject_res.o -lcomctl32

そろそろ手動ビルドが面倒臭くなりましたよね。次回自動化します。

電卓の完成です。

[電卓の完成]

GetDlgItemは、コントロールIDからダイアログ項目のウィンドウハンドルを取得するAPIです。 GetDlgItemInt関数は、ダイアログの項目から整数値を取得するAPIです。 SetDlgItemInt関数は、ダイアログの項目に整数値を設定するAPIです。

参考資料: MSDNのGetDlgItemMSDNのGetDlgItemIntMSDNのSetDlgItemInt

ComboBox_AddStringマクロはコンボボックスに文字列を追加するマクロです。 ComboBox_GetCurSelは、コンボボックスの現在の選択のインデックスを取得するマクロです。 ComboBox_SetCurSelは、コンボボックスの選択を設定するマクロです。 インデックス(index)というのは、ゼロから始まる整数値で、位置を表すものです。 このように、コンボボックスを操作するときは、ComboBox_で始まるマクロを使います。

参考資料: MSDNのComboBox_AddStringMSDNのComboBox_GetCurSelMSDNのComboBox_SetCurSel

実は、このプログラムには2つのバグ(bug;不具合)があります。ゼロで割ると、異常終了するという不具合と、 整数以外の計算ができない不具合です。次回修正しましょう。


© 2018 片山博文MZ. All Rights Reserved.

戻る | 前へ | 次へ

inserted by FC2 system