ラジオボタン

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

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

ラジオボタンとエディットコントロール

では、ラジオボタンとエディットコントロールとは、どのようなものなのでしょうか?ラジオボタンとは、ウィンドウ内に現れる小さな円状の平たいボタンで、中を塗りつぶしたり空白にしたりすることにより「はい」「いいえ」の意思表示をするのに使います。(図6-1.)

図6-1.ラジオボタン

ラジオボタン

エディットコントロールは、編集可能な文字列を表示するコントロールです。アプリケーション内で文字列や数値の入力などをさせるためのコントロールとして使用します。(図6-2.)

図6-2.エディットコントロール

エディットコントロール

サンプルプログラム

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

win32exproj6-1:WinMain.cpp
// ********************************************
// Ex リソース(エディットコントロール・ラジオボタンの利用)
// ********************************************
//必要なヘッダーファイルのインクルード
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <tchar.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_RADIO1), BST_CHECKED );
 
        return TRUE;
    case WM_COMMAND:
        switch( LOWORD(wParam) )
        {
        case IDOK:
            iCheck = Button_GetCheck( GetDlgItem(hWnd, IDC_RADIO1));
            if( iCheck == BST_CHECKED )
                SetWindowText( GetDlgItem(hWnd, IDC_EDIT1), _T("ラジオ1"));
            else
                SetWindowText( GetDlgItem(hWnd, IDC_EDIT1), _T("ラジオ2"));
            break;
        case IDCANCEL:
            //モーダルダイアログボックスを破棄
            EndDialog(hWnd,0);
            break;
        }
        return TRUE;
    default:
        return FALSE;
    }
}

リソースの作成

リソースとしては、ダイアログボックスを一つ生成します。識別子は、生成時に自動的に割り振られる、IDD_DIALOG1をそのまま使うことにします。(図6-3.)

図6-3.ダイアログボックスの生成

ダイアログボックスの生成

次にこのダイアログにコントロールを追加します。コントロールは、画面右側の「ツールボックス」という文字をクリックすると、現れます。その中に、ラジオボタンやエディットコントロールといったコントロールが現れます。(図6-4.)

図6-4.ツールボックスのコントロール追加

ツールボックスのコントロール追加

ツールボックスの中の必要なことロールをダイアログ上にドラッグすると、配置することができます。ここでは、ラジオボタン2つ、エディットコントロール1つを配置してみます。(図6-5.)

図6-5.コントロールの配置

コントロールの配置
ラジオボタンの表示部分(キャプション)が、初期状態では、「Radio1」および「Radio2」となっているので、これを改めます。ラジオコントロールを選択し、右クリック→[プロパティ]を選択すると、そのコントロールのプロパティが現れます。(図6-6.)そこに、「Caption」という欄があるので、それぞれ、以下の表6-1.のように改めてください。

図6-6.コントロールのプロパティ

追加されたリソースのID果
表6-1.ラジオコントロールの識別子と、対応するキャプション
ID キャプション
IDC_RADIO1 ラジオ1
IDC_RADIO2 ラジオ2

なお、エディットコントロールには、IDC_EDIT1という識別子が割り振られているので、それはこのままにしておいてください。以上で、リソースの準備は完了です。

プログラムの実行

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

図6-7.プログラム実行時にあらわれるダイアログ

プログラム実行時にあらわれるダイアログ

ここで、ラジオボタンの「ラジオ1」を選択したのち、「OK」ボタンを押すと、エディとコントロールに「ラジオ1」という文字列が現れます。(図6-8.)

図6-8.ラジオ1を選択

ラジオ1を選択

同様に、「ラジオ2」を選択して、「OK」ボタンを異を押すと、以下のようになります。(図6-9.)

図6-9.ラジオ2を選択

ラジオ2を選択

プログラムの仕組み

インクルードファイル

このサンプルでは、新しいヘッダファイルをインクルードしています。

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

このマクロは、サンプル中に出てくる、Button_SetCheckマクロ、Button_GetCheckマクロを使用するために必要です。

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

次に、ラジオボタンが、初期状態で、「ラジオ1」が選択されている状態に設定します。これに必要なのが、41行目のButton_SetCheckマクロです。

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

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

選択されているボタンの取得

IDOKボタンが押されると、エディットコントロールに選択したラジオボタンの名前が出力される処理は、47行目のIDOKイベントに記述されています。その際に、選択されているラジオボタンを取得しているのが、28行目に記述されている、Button_GetCheckマクロです。

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

これは、指定したラジオボタンがチェックされているかどうかを調べるマクロです。チェックされていれば、BST_CHECKEDが帰ってきます。

エディットボックスに文字列を入れる

エディットボックスに文字を入れるには、SetWindowText関数を用います。これで、指定するアイテムの識別子を指定して、代入する文字列を記述すれば、それがエディットボックスに出力されます。

エディットボックスへの値の代入
SetWindowText( GetDlgItem(hWnd, IDC_EDIT1), _T("ラジオ1"));