8

まず第一に、これはMFCではありません。
これが私が取り組んできたGUIのトリミングされたバージョンです:

ここに画像の説明を入力してください

ご覧のとおり、コードを使用して、アイコンとボタンの2つの異なるグループを作成(試行)しました。

    index->hAddT.hwndIndex[2] = CreateWindowEx(NULL,L"BUTTON",L"Icon",WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
    200,135,120,170,WINDOWHANDLE,(HMENU)IDC_RADIOGROUP,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWL_HINSTANCE),NULL);

私が抱えている問題、そしておそらくあなたが見ることができるのは、ウィンドウのラジオボタンが1つしかないということです。これは、ユーザーがIconグループから1つのラジオボタンを選択できず、Buttonグループから1つのラジオボタンを選択できなかったことを意味します。私は各ラジオボタンを次のように初期化しました:

    index->hAddT.hwndIndex[3] = CreateWindowEx(NULL,L"BUTTON",L"Information",WS_CHILD | BS_AUTORADIOBUTTON | WS_VISIBLE,
    205,155,100,20,WINDOWHANDLE,(HMENU)IDC_RADIO1,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWL_HINSTANCE),NULL);       

どういうわけか、ラジオボタンの「Icon」グループをラジオボタンの「Button」グループから分離させたいので、それが理にかなっている場合は、各グループで1つのラジオボタンを使用できるようにします。これはどのように可能になりますか。追加のラジオボタンを用意するためだけに、新しいウィンドウと新しいコールバックプロシージャを作成する必要がありますか。そのように子アイテムをグループ化する別の方法が必要です。

同じ形式のラジオボタンの2つの別々のグループWINAPI(MFCなし) リンクは私の目的には何の役にも立ちませんでした。

チャールズ・ペッツォルドによる 『Windows第5版のプログラミング』を参考にしています。彼は、[グループボックス]セクションで「グループボックスは他のボタンコントロールを囲むためによく使用されます」と述べていますが、実際の例はありません。

4

2 に答える 2

15

一般的な意見に反して、グループボックスコントロールやその他の外部の「コンテナ」(グループボックスはとにかくボタンアーティファクトではありません)は必要ありません。以下では、グループボックスを必要とせずにこれを行う方法について説明します。ここで説明するレイアウトを機能的に支援するグループボックスが必要な場合は、この回答の編集 部分に進んでください。ここでは、OPの特定の要望をどのように達成できるかを説明します。

自動ラジオボタンの「バンク」は、WS_GROUPWS_TABSTOPの2つの主要なウィンドウスタイル属性を使用して機能します。私が愛情を込めてBank1とBank2と呼ぶ2つの「銀行」に対して次のことを行います。

  1. バンク1:最初のラジオボタンには WS_GROUP | コントロールスタイルのWS_TABSTOP。残りのラジオボタンにはどちらも含まれておらず、兄弟の順序である必要があります(つまり、DIALOGスクリプトでは、ボタンは互いにすぐに続きます。動的作成では、順番に作成されます)。

  2. Bank1の最後のラジオボタンの後の最初の子コントロールは、少なくともWS_GROUPスタイルである必要があります。タブストップコントロールの場合はWS_TABSTOP。

  3. バンク2:最初のラジオボタンには WS_GROUP | コントロールスタイルのWS_TABSTOP。残りのラジオボタンにはどちらも含まれておらず、兄弟の順序である必要があります(つまり、DIALOGスクリプトでは、ボタンは互いにすぐに続きます。動的作成では、順番に作成されます)。

  4. Bank2の最後のラジオボタンの後の最初の子コントロールは、少なくともWS_GROUPスタイルである必要があります。タブストップコントロールの場合はWS_TABSTOP。

上記のようなレイアウトでは、ラジオボタンバンクに「タブ」し、矢印キーを使用して選択を切り替えることができます。次に、もう一度「タブ」してそのバンクを離れ、次のタブストップに進みます。Tabキーを押すと(またはShift-Tabキーを押す前に)、ダイアログマネージャは常に次のWS_TABTOP子コントロールに移動することを忘れないでください。ホップ先のコントロールが自動タイプの場合、選択されたコントロールは、最新のWS_GROUP内の「選択された」コントロールになります。

それが役立つ場合は、スケッチパッドをつかんで紙に描き、上記のようにタブストップに「T」を貼り付け、グループ属性に「G」を貼り付けます。視覚化すると、おそらくはるかに明確になります。ダイアログリソーススクリプトを見て、これらがどのように連携して機能するかを確認し、詳細を確認してください。

注:これらを囲むグループボックスを使用する場合は、使用できます。ダイアログ・マネージャーは、WS_GROUPでフラグが立てられた最後のコントロールに基づいてコントロールをグループに関連付けることによって機能し、その後、WS_TABSTOPを持つ最初のコントロールは、そのグループのタブ・ジャンプイン・ポイントと見なされます。最初にグループボックス(タブストップにすることはできません)を挿入し、次に最初のラジオボタン(今回はWS_GROUPなし)でWS_TABSTOPを使用してラジオボタンコントロールを挿入することもできます。私は一般的に、グループボックスに依存せずにラジオボタンを配置する方が簡単だと感じています。

写真を編集して千の言葉を話す

あなたの写真では、おそらく次の子を次の順序で作成します。

  1. WS_GROUPスタイルを含む「アイコン」グループボックス。
  2. WS_TABSTOPを含む「情報」自動ラジオボタン
  3. 他のすべての「アイコン」グループのラジオボタン。WS_TABSTOPまたはWS_GROUPを含めないでください。
  4. WS_GROUPスタイルを含む「ボタン」グループボックス。これにより、現在のコントロールグループが閉じられ、次のコントロールグループが開始されます。
  5. WS_TABSTOPを含む「AbortretryIgnore」自動ラジオボタン
  6. 他のすべての「ボタン」グループのラジオボタン。WS_TABSTOPまたはWS_GROUPを含めないでください。
  7. 「ボタン」ラジオボタンの次のコントロールには、WS_GROUPが含まれている必要があります。これにより、現在の制御グループが閉じられ、次の制御グループが開始されます。

もちろん、他のすべての子コントロールスタイル、可視性なども正しく使用する必要があります。もちろん、子はすべて一意のIDを持っている必要があります。残りの部分はすでにカバーされていると思います。

于 2012-11-25T10:33:31.167 に答える
0

これは、有効なユースケースであるチェックボックスのグループでも機能することに注意してください。

最初のラジオボタンが無効になっている可能性がある場合(たとえば、実行時の条件によって)、最初に有効にしたボタンをWS_TABSTOPスタイルにする必要があることに注意してください。これを保証するコードの行は次のとおりです。

    // Set WS_TABSTOP to the group's first enabled item
    for (HWND hwnd = GetDlgItem(IDC_FIRSTITEM) /*the first*/; hwnd != NULL && !::IsWindowEnabled(hwnd); hwnd = ::GetWindow(hwnd, GW_HWNDNEXT))
    {
        if ((GetWindowLong(hwnd, GWL_STYLE) & WS_GROUP) != 0)
            hwnd = NULL;
    }
    if (hwnd != NULL)
        ModifyStyle(hwnd, 0, WS_TABSTOP, 0);
于 2020-04-15T11:13:10.433 に答える