ラジオボタン

ダイアログボックスと様々なコントロール

応用編5日目応用編6日目では、異なるスタイルのダイアログボックスの操作方法について説明しました。ただ、このダイアロブごっくすには、最低限のボタンには様々なコントロールをつけることが普通です。そこえ、ここでは、ラジオボタンや、エディットコントロールなどといった様々なコントロールをダイアログに追加し、その操作を行う方法について学習します。

チェックボックス

最後にダイアログボックスのコントロールとして、チェックボックスについて説明します。チェックボックスとは、ウィンドウ内に現れる小さな正方形で、チェック記号を入れたり外したりすることにより「はい」「いいえ」の意思表示をするのに使うコントロールです。

ツールボックスには、以下のように表示されています。(図7-1.)

図7-1.チェックボックス

チェックボックス

サンプルプログラム

では、実際にチェックボックスがあるダイアログのアプリケーションのサンプルを見てみましょう。以下のサンプルを入力し、指示に従って、新しいリソースを追加してから実行してみてください。

win32exproj7-1:WinMain.cpp
// **********************************************
// Ex リソース(チェックボックスの利用)
// **********************************************
//必要なヘッダーファイルのインクルード
#define STRICT
#include <windows.h>
#include <tchar.h>
#include <windowsx.h>

#include "resource.h"

//関数プロトタイプの宣言
BOOL CALLBACK DlgWndProc( HWND, UINT, WPARAM, LPARAM);
//--------------------------------------------
// Name:WinMain()
// Desc:アプリケーションのエントリー関数
//--------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR szStr, INT iCmdShow)
{
    //モーダルダイアログボックスを作成
    DialogBox(
        hInst,
        MAKEINTRESOURCE( IDD_DIALOG1 ),
        NULL,
        (DLGPROC)DlgWndProc);
 
    return 0;
}

//--------------------------------------------
// Name:DlgWndProc()
// Desc:ダイアログ用ウィンドウプロシージャ
//--------------------------------------------
BOOL CALLBACK DlgWndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
{
    TCHAR szstr[256]=_T("");
    INT iCheck;
    switch( iMsg )
    {
    case WM_INITDIALOG:
        //ダイアログボックスが生成されたとき
        Button_SetCheck( GetDlgItem(hWnd, IDC_CHECK1), BST_CHECKED );
        return TRUE;
    case WM_COMMAND:
        switch( LOWORD(wParam) )
        {
        case IDOK:
            iCheck = Button_GetCheck( GetDlgItem(hWnd, IDC_CHECK1));
            if( iCheck == BST_CHECKED )
                SetWindowText( GetDlgItem(hWnd, IDC_EDIT1), _T("チェック有り"));
            else
                SetWindowText( GetDlgItem(hWnd, IDC_EDIT1), _T("チェック無し"));
            break;
        case IDCANCEL:
            //モーダルダイアログボックスを破棄
            EndDialog(hWnd,0);
            break;
        }
        return TRUE;
    default:
        return FALSE;
    }
}

リソースの作成

リソースとしては、ダイアログボックスを一つ生成します。識別子は、生成時に自動的に割り振られる、IDD_DIALOG1をそのまま使うことにします。続いて、ツールボックスから、エディットボックスと、チェックボックスを貼り付けます(図7-2.)

図7-2.ダイアログへのコントロールの配置

ダイアログへのコントロールの配置

デフォルトの状態だと、チェックボックスの識別子は、IDC_CHECK1となり、エディットコントロールは、IDC_EDIT1となるので、これをそのまま使います。以上で設定は完了します。

プログラムの実行

では、プログラムを実行してみましょう。プログラムを実行すると、以下のようなダイアログボックスが現れます(図7-3.)

図7-3.プログラムの実行結果

プログラムの実行結果

初期状態で、チェックボックスはチェックが入った状態になっています。ここで、「OK」ボタンを押すと、エディとコントロールに「チェック有り」という文字列が現れます。(図7-4.)

図7-4.OKボタン(チェックあり)

OKボタン(チェックあり)

同様に、チェックを外して、「OK」ボタンを異を押すと、「チェック無し」と表示されます。(図7-5.)

図7-5.OKボタン(チェックなし)

OKボタン(チェックなし)

プログラムの仕組み

インクルードファイル

このサンプルでも、新しいヘッダファイルをインクルードしています。Button_SetCheckマクロ、Button_GetCheckマクロを使用するため、以下のヘッダファイルをインクルードしています。

ダイアログプロシージャ
#include <windowsx.h>

これらマクロは、ラジオボタンの値の設定と取得に用いられましたが、

ダイアログボックスにチェックを入れる

ラジオボタンの場合と同様、42行目のButton_SetCheckマクロで、チェックボックスにチェックをつけることができます。

Button_SetCheckマクロ
Button_SetCheck( GetDlgItem(hWnd, IDC_RADIO1), BST_CHECKED );

この処理は、WM_INITDIALOGイベントの箇所に書かれているので、ダイアログ生成時に一度だけ実行されます。

チェックボックスの状態の取得

IDOKボタンが押されると、「チェック無し」および、「チェック有り」の文字列が出力される処理は、47行目のIDOKイベントに記述されています。

Button_GetCheckマクロ
iCheck = Button_GetCheck( GetDlgItem(hWnd, IDC_CHECK1));

これは、指定したラジオボタンがチェックされているかどうかを調べるマクロです。チェックされていれば、BST_CHECKEDが帰ってきます。この結果より、エディットボックスに適切なテキストが割り振られます。(49行目~52行目)