MZC4で無料Windowsアプリ開発

ダイアログアプリを改造

戻る | 前へ | 次へ


前回、作成したMyProject_res.rcを元にして、ダイアログアプリを改造します。

MyProject_res.rcをRisohEditorで開いて下さい。

[RisohEditorで開いたとこ]

次に、左側のツリービューの[+]をクリックして展開します。

[ツリービュー展開]

展開して出てくる「日本語 (日本) (1041)」をダブルクリックすると、 「ダイアログの編集」が出てきます。

[ダイアログの編集]

これを操作すれば、ダイアログを編集できます。 「Cancel」ボタンを右クリックして、「コントロールのプロパティ」を選びます。

[コントロールのプロパティを開く]

キャプションを「Cancel」から日本語の「キャンセル」にして、「OK」をクリックしましょう。

[Cancelを日本語に]

「Cancel」が日本語の「キャンセル」になりました。

[Cancelを日本語に2]

ボタンをちょっと右に移動させましょう。「OK」ボタンと「キャンセル」ボタンを右にドラッグします。

[ボタンを右に]

ラベル(STATICコントロール)を追加します。右クリックして「コントロールの追加...」を選びます。

[コントロールの追加]

「コントロールの追加」ダイアログが表示されます。ここで「T」のようなアイコンをクリックします。

[コントロールの追加2]

ウィンドウクラス名が「STATIC」になります。「キャプション」に「ダイアログさんこんにちは」と 入力します。

[コントロールの追加3]

IDに、「stc1」(小文字でエス、ティー、シー、ワン)と入力します。

[コントロールの追加4]

「OK」ボタンをクリックします。編集中のダイアログにラベルが追加されます。

[コントロールの追加5]

ラベルの位置とサイズを適当に修正しましょう。

[位置とサイズ]

「ダイアログの編集」を閉じて、同じ場所に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のSetDlgItemTextMSDNのMessageBox


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

戻る | 前へ | 次へ

inserted by FC2 system