6

グループ化されたチェック ボックスを使用してプログラムに取り組んでいますが、メッセージがさまざまなハンドルを介してどのように伝達されるかについて混乱しています。

IDE:VC++、Win32 API

まず、 hWndなどのハンドルを持つメイン ウィンドウがあります。

また、WM_CREATE の場合の WndProc 関数では、「グループ ボタン」と個別の 2 つのチェック ボックスを作成します。

注: 最初のボタンは「BS_GROUPBOX」スタイルを使用し、ハンドルhGrpButtonを使用して作成され、親ハンドラーはhWndです。2 番目と 3 番目のボタンは「BS_AUTORADIOBUTTON」スタイルで、その親ハンドルはhGrpButtonです。

2 つのボタンがグループ化されていない場合 (つまり、それらの親ハンドラーは hWnd になります)、それらのステータスを簡単に確認できます。ケース WM_COMMAND に移動し、その ID を使用して IsDlgButtonChecked 関数で確認するだけです。2 つのチェック ボックスがグループ化された後 (それらの親ハンドルは hWnd ではなく hGrpButtons になります)、WM_COMMAND は hWnd の下で ID を探しているため、それらの ID が見つからないと思います。

つまり、2 つのチェック ボックスがグループ化された後、それらを監視するイベントが何であるかがわかりません。

case WM_CREATE:
{        
/*Group for Radio button for preview/single or batch operation */
hGrpButtons=CreateWindowEx(WS_EX_WINDOWEDGE,
                    L"BUTTON",
                    L"Select Process Mode:", 
                    WS_VISIBLE | WS_CHILD|BS_GROUPBOX,  // Styles 
                    10,280,
                    350,100, 
                    hWnd, 
                    NULL, 
                    hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
                    L"BUTTON",
                    L"Batch Process Mode", 
                    WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON,  // Styles 
                    10,20,
                    300,20, 
                    hGrpButtons, 
                    (HMENU)IDC_CHK1, 
                    hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
                    L"BUTTON",
                    L"Single Process Mode (Preview Mode)", 
                    WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON,  // Styles 
                    10,45,
                    300,20, 
                    hGrpButtons, 
                    (HMENU)IDC_CHK2, 
                    hInst, NULL);
4

1 に答える 1

20

ボタンの種類に関するCoder_Dan のコメントと MSDN の記事「http://msdn.microsoft.com/en-us/library/bb775947(v=vs.85).aspx#related_topics」を読んだ後、最終的に整理しました。

  1. BS_GROUPBOX は単なる「目の保養」であり、ラジオ ボックスのグループには貢献しませんでした!! グループ化を制御する重要なパラメータは「WS_GROUP」です

  2. ラジオ ボックスをグループ化する方法: WS_GROUP を最初のラジオ ボタンのスタイルに配置します。Coder_Dan が言及したように、2 番目の WS_GROUP が表示されるまで、現在のラジオ ボタンをグループ化します。

以前のコードの変更

a. 4 つのラジオ ボタンすべての親として hWnd を使用する

b. WS_GROUP を 1 番目と 3 番目のボタン スタイルに配置して、1,2 と 3,4 のラジオ ボタンをグループ化します。

c. これで、WM_COMMAND に移動し、メイン ウィンドウのハンドル hWnd の下にある ID に従って、4 つのボタンからのメッセージを聞くことができます。

    case WM_CREATE:
{        

/*Group for Radio button for preview/single or batch operation */
hGrpButtons=CreateWindowEx(WS_EX_WINDOWEDGE,
                    L"BUTTON",
                    L"Select Process Mode:", 
                    WS_VISIBLE | WS_CHILD|BS_GROUPBOX,// <----BS_GROUPBOX does nothing on the grouping 
                    10,280,
                    350,100, 
                    hWnd, 
                    (HMENU)IDC_GRPBUTTONS, 
                    hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
                    L"BUTTON",
                    L"first radio button", 
                    WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON|WS_GROUP,  // <---- WS_GROUP group the following radio buttons 1st,2nd button 
                    10,520,
                    300,20, 
                    hWnd, //<----- Use main window handle
                    (HMENU)IDC_CHK1, 
                    hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
                    L"BUTTON",
                    L"second radio button", 
                    WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON,  // Styles 
                    10,545,
                    300,20, 
                    hWnd, 
                    (HMENU)IDC_CHK2, 
                    hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
                    L"BUTTON",
                    L"third radio button", 
                    WS_VISIBLE | WS_CHILD|BS_AUTOCHECKBOX|WS_GROUP,  //<---Start second group for 3rd,4th button
                    10,570,
                    300,20, 
                    hWnd, 
                    (HMENU)IDC_CHK3, 
                    hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
                    L"BUTTON",
                    L"forth radio button", 
                    WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON,  // Styles 
                    500,545,
                    300,20, 
                    hWnd, 
                    (HMENU)IDC_CHK4, 
                    hInst, NULL);
于 2013-06-22T18:39:09.110 に答える