今回は、電卓を作りましょう。MyProject_res.rcをRisohEditorで開いて下さい。
「ダイアログの編集」を開いて、[Ctrl]+[A]を押した後、[Del]キーでダイアログのすべてのコントロールを削除します。
次のように、コントロールを配置します。
コントロールが入りきらないときは、ダイアログのサイズを調整して下さい。
コンボボックスのプロパティを開きます。 コンボボックスのcmb1のCBS_SORTスタイルは解除して、CBS_DROPDOWNLISTスタイルを設定して下さい。 「ダイアログのプロパティ」で、「キャプション」を「電卓」にしましょう。 リソーステキストは次のようになります。
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のGetDlgItem、 MSDNのGetDlgItemInt、 MSDNのSetDlgItemInt
ComboBox_AddStringマクロはコンボボックスに文字列を追加するマクロです。 ComboBox_GetCurSelは、コンボボックスの現在の選択のインデックスを取得するマクロです。 ComboBox_SetCurSelは、コンボボックスの選択を設定するマクロです。 インデックス(index)というのは、ゼロから始まる整数値で、位置を表すものです。 このように、コンボボックスを操作するときは、ComboBox_で始まるマクロを使います。
参考資料: MSDNのComboBox_AddString、 MSDNのComboBox_GetCurSel、 MSDNのComboBox_SetCurSel
実は、このプログラムには2つのバグ(bug;不具合)があります。ゼロで割ると、異常終了するという不具合と、 整数以外の計算ができない不具合です。次回修正しましょう。