前回、作成したMyProject_res.rcを元にして、ダイアログアプリを改造します。
MyProject_res.rcをRisohEditorで開いて下さい。
次に、左側のツリービューの[+]をクリックして展開します。
展開して出てくる「日本語 (日本) (1041)」をダブルクリックすると、 「ダイアログの編集」が出てきます。
これを操作すれば、ダイアログを編集できます。 「Cancel」ボタンを右クリックして、「コントロールのプロパティ」を選びます。
キャプションを「Cancel」から日本語の「キャンセル」にして、「OK」をクリックしましょう。
「Cancel」が日本語の「キャンセル」になりました。
ボタンをちょっと右に移動させましょう。「OK」ボタンと「キャンセル」ボタンを右にドラッグします。
ラベル(STATICコントロール)を追加します。右クリックして「コントロールの追加...」を選びます。
「コントロールの追加」ダイアログが表示されます。ここで「T」のようなアイコンをクリックします。
ウィンドウクラス名が「STATIC」になります。「キャプション」に「ダイアログさんこんにちは」と 入力します。
IDに、「stc1」(小文字でエス、ティー、シー、ワン)と入力します。
「OK」ボタンをクリックします。編集中のダイアログにラベルが追加されます。
ラベルの位置とサイズを適当に修正しましょう。
「ダイアログの編集」を閉じて、同じ場所にMyProject_res.rcをエクスポートします。 エクスポートできたら、RisohEditorを閉じて下さい。 「-old」が付いたファイルができますが、これは処理を間違えたときに元に戻せるように作成されたバックアップファイルです。 気にしなくて構いません。
前回と同じように、Bash上で手動ビルドします。
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
MyProject.exeをダブルクリックすると、前回とは違って、ラベルが追加されていることがわかります。
このように、リソースを編集したいときは、RisohEditorで.rcファイルを開いて編集し、エクスポートすればいいのです。
次は、MyProject.cppを編集します。ファイル「MyProject.cpp」をサクラエディタで開いて、 中身を見ましょう。
...
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch (id)
{
case IDOK:
EndDialog(IDOK);
break;
case IDCANCEL:
EndDialog(IDCANCEL);
break;
}
}
virtual INT_PTR CALLBACK
DialogProcDx(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDialog);
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
default:
return DefaultProcDx();
}
}
...
DialogProcDxは、ダイアログ プロシージャという特殊な仮想関数です。 WM_COMMANDメッセージがダイアログ プロシージャに届くと、OnCommandメソッドが呼ばれます。 典型的なイベント駆動型のプログラムです。
参考資料:イベント駆動型プログラミング
HWNDというのは、ウィンドウのハンドルを表す型です。ハンドルというのは、特殊なポインタです。 ダイアログでボタンを押すと、OnCommandが呼び出されます。 EndDialog API関数は、ダイアログを閉じます。
OnCommandメソッドを次のように改造してみましょう。
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
INT nID;
switch (id)
{
case IDOK:
SetDlgItemText(hwnd, stc1, TEXT("TEST TEST"));
nID = MessageBox(hwnd, TEXT("Yes or No?"), NULL, MB_YESNO);
if (nID == IDYES)
{
MessageBox(hwnd, TEXT("Yes was pressed."), NULL, 0);
}
else if (nID == IDNO)
{
MessageBox(hwnd, TEXT("No was pressed."), NULL, 0);
}
EndDialog(IDOK);
break;
case IDCANCEL:
EndDialog(IDCANCEL);
break;
}
}
ダイアログのOKボタンが押されると、SetDlgItemText API関数により、stc1のコントロールのテキストが 「TEST TEST」になります。さらに、「Yes or No?」とたずねるメッセージボックスを表示して メッセージボックスのボタンが押されるのを待ちます。「はい」ボタンをクリックすると、 「Yes was pressed.」と表示し、「いいえ」ボタンをクリックすると 「No was pressed.」と表示します。
Bash上で手動ビルドして試してみて下さい。
RisohEditorでは、リソースのテキストはUTF-8で扱われますので、リソースの中では日本語が自由に使えます。
参考資料: MSDNのSetDlgItemText、 MSDNのMessageBox