ダイアログボックスにラジオボタン、グループボックスを付ける1

ラジオボタン、グループボックス1

今回は、ダイアログボックスにラジオボタンとグループボックスを付けます。

ボタンを押せば、現在のラジオボタンの状態が、表示されるようにします。
ラジオボタンは、2つ用意し、アプリケーション起動に、1つのラジオボタンのチェックが、入った状態にします。
1つのラジオボタンに、チェックを入れた場合、もうひとつのラジオボタンのチェックを外します。

グループボックスは、ただの飾りです。

テキストの表示 - インコのWindowsSDK で作成したソースを修正します。

ここでは、Reseditで作成する方法も説明します。

Reseditを使用しない場合は、 12.ラジオボタン、グループボックス2<ResEdit未対応> - インコのWindowsSDK で紹介する方法の方が、楽にできます。

流れ

WM_INITDIALOG

リストボックス - インコのWindowsSDK でも説明しましたが、WM_INITDIALOGは、ダイアログが作成されたときに一度だけ実行されます。

1.BM_SETCHECKメッセージで、ラジオボタンにチェックを入れる

lResult = SendMessage(
    (HWND) hWndControl, // ラジオボタンのハンドル
    (UINT) BM_SETCHECK,
    (WPARAM) BST_CHECKED,
    0                   // 0固定
);

WM_COMMAND

1.BM_SETCHECKメッセージで、ラジオボタンが押されたら、チェックを入れる。
押されていないほうの、ラジオボタンのチェックを外す。

lResult = SendMessage(
    (HWND) hWndControl, // ラジオボタンのハンドル
    (UINT) BM_SETCHECK,
    (WPARAM) BST_UNCHECKED,
    0                   // 0固定
);

2.SetDlgItemText()で取得したデータを表示

BOOL SetDlgItemText(
  HWND hDlg,         // ダイアログボックスのハンドル
  int nIDDlgItem,    // コントロールID
  LPCTSTR lpString   // 表示するテキスト
);

リソースファイル

1.ダイアログボックスにグループボックス[GROUPBOX]を追加

GROUPBOX          "text", id,  x0, y0, width, height, style

text表示するテキスト
idコントロールID
x0グループボックス左上のx座標
y0グループボックス左上のy座標
widthグループボックスの幅
heightグループボックスの高さ
style スタイル
ウインドウスタイルと、ボタンのスタイルが指定可能

2.ダイアログボックスに、ラジオボタン[AUTORADIOBUTTON]を追加

AUTORADIOBUTTON          "text", id,  x0, y0, width, height, style

text表示するテキスト
idコントロールID
x0ラジオボタン左上のx座標
y0ラジオボタン左上のy座標
widthラジオボタンの幅
heightラジオボタンの高さ
style スタイル

VCwin32アプリケーション2

ソースコードの入力

ソースコードは下記のように入れてください。

test.cpp
#include <windows.h>
#include "resource.h"

// グローバル変数:
LPCTSTR szBuf_edit1;

// このコード モジュールに含まれる関数の宣言を転送します:
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          PSTR lpCmdLine, int nCmdShow ) {
    DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc);
    return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    UINT wmId;
    BOOL check1;
    BOOL check2;
    switch (msg)
    {
        case WM_INITDIALOG:
            // チェック2にチェックを入れる
            SendMessage(GetDlgItem(hWnd, IDC_RADIO2) , BM_SETCHECK , BST_CHECKED , 0);
            break;
        case WM_CLOSE:
            EndDialog(hWnd, IDOK);
            break;
        case WM_COMMAND:
            wmId = LOWORD(wParam);
            switch (wmId)
            {
                case IDC_RADIO1: // ラジオボタン1が押されたとき
                    SendMessage(GetDlgItem(hWnd, IDC_RADIO1) ,
                      BM_SETCHECK ,
                      BST_CHECKED ,    // チェックをつける
                      0);
                    SendMessage(GetDlgItem(hWnd, IDC_RADIO2) ,
                      BM_SETCHECK ,
                      BST_UNCHECKED ,  // チェックをはずす
                      0);
                    break;
                case IDC_RADIO2: // ラジオボタン2が押されたとき
                    SendMessage(GetDlgItem(hWnd, IDC_RADIO1) ,
                      BM_SETCHECK ,
                      BST_UNCHECKED ,  // チェックをはずす
                      0);
                    SendMessage(GetDlgItem(hWnd, IDC_RADIO2) ,
                      BM_SETCHECK ,
                      BST_CHECKED ,    // チェックをつける
                      0);
                    break;
                case IDC_BUTTON1: // ボタンが押されたとき
                   // チェックが入っているか確認
                    check1 = SendMessage( GetDlgItem(hWnd, IDC_RADIO1), BM_GETCHECK, 0, 0 );
                    check2 = SendMessage( GetDlgItem(hWnd, IDC_RADIO2), BM_GETCHECK, 0, 0 );
                    if(check1 == 1)
                    {
                        szBuf_edit1 = TEXT("チェック1だけにチェックが入っています。");
                    }
                    else
                    {
                        szBuf_edit1 = TEXT("チェック2だけにチェックが入っています。");
                    }
                    // テキストの表示
                    SetDlgItemText(hWnd, IDC_STATIC1, szBuf_edit1); 
                    break;
            }
            break;
        return TRUE;
    }
    return FALSE;
}

resource.h

#define IDC_BUTTON1 1002
#define IDC_STATIC1 1003
#define IDC_RADIO1 1011
#define IDC_RADIO2 1012
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。

test.rc
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//

DIALOG_BOX DIALOG 0, 0, 170, 62
FONT 9, "MS UI Gothic"
CAPTION "ダイアログ"
BEGIN
    GROUPBOX        "グループ", IDC_STATIC, 5, 5, 159, 25
    RADIOBUTTON     "ラジオボタン1", IDC_RADIO1, 19, 16, 51, 10
    RADIOBUTTON     "ラジオボタン2", IDC_RADIO2, 87, 16, 51, 10
    PUSHBUTTON      "表示", IDC_BUTTON1, 113, 33, 36, 12
    LTEXT           "", IDC_STATIC1, 15, 49, 152, 14
END

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。