次の方法で共有


動的レイアウト

Visual Studio 2015 の MFC を使用すると、ユーザーがサイズを変更できるダイアログを作成でき、レイアウトのサイズ変更に合わせて調整する方法を制御できます。 たとえば、ダイアログの下部にあるボタンを下端にアタッチして、常に下部に留めることができます。 また、リスト ボックス、エディット ボックス、テキスト フィールドなどの特定のコントロールを設定して、ユーザーがダイアログを展開するときに展開することもできます。

MFC ダイアログ ボックスの動的レイアウト設定の指定

ユーザーがダイアログのサイズを変更すると、ダイアログ内のコントロールのサイズを変更したり、X 方向と Y 方向に移動したりできます。 ユーザーがダイアログのサイズを変更したときのコントロールのサイズまたは位置の変更は、動的レイアウトと呼ばれます。 たとえば、サイズを変更する前のダイアログを次に示します。

サイズを変更する前のダイアログ。

サイズを変更すると、リスト ボックス領域が大きくなり、さらに多くの項目が表示され、ボタンは右下隅と共に移動されます。

サイズ変更後のダイアログ。

動的レイアウトを制御するには、IDE のリソース エディターで各コントロールの詳細を指定するか、特定のコントロールの CMFCDynamicLayout オブジェクトにアクセスし、プロパティを設定することでプログラムで行うことができます。

リソース エディターでの動的レイアウト プロパティの設定

リソース エディターを使用して、コードを記述しなくても、ダイアログ ボックスの動的レイアウト動作を設定できます。

リソース エディターで動的レイアウトプロパティを設定するには

  1. MFC プロジェクトを開いた状態で、ダイアログ エディターで操作するダイアログを開きます。

    リソース エディターでダイアログを開きます。

  2. コントロールを選択し、[ プロパティ ] ウィンドウ ( クラス ビュー) で、その動的レイアウト プロパティを設定します。 [プロパティ] ウィンドウの [動的レイアウト] セクションには、移動の種類サイズ変更の種類のプロパティが含まれています。また、これらのプロパティに対して選択した値に応じて、移動またはサイズを変更するコントロールの量を定義する特定のプロパティが含まれます。 移動の種類 は、ダイアログのサイズが変更されるときにコントロールを移動する方法を決定します。 サイズ変更の種類 は、ダイアログのサイズが変更されるときにコントロールのサイズを変更する方法を決定します。 移動の種類サイズ変更の種類 は、動的に変更するディメンションに応じて、 水平垂直両方、または なし にすることができます。 水平は X 次元です。垂直は Y 方向です。

  3. ボタンなどのコントロールを固定サイズにし、[ OK] ボタンや [キャンセル ] ボタンと同様に右下に配置する場合は、[ サイズ変更の種類 ] を [なし] に設定し、[ 移動の種類 ] を [両方] に設定します。 [移動タイプ] の [移動 X] と [移動 Y] の値には、100% を設定して、右下隅からコントロールの距離を固定します。

    動的レイアウト。

  4. ダイアログの展開に合わせて展開するコントロールもあるとします。 通常、ユーザーは複数行の編集ボックスを展開してテキスト領域のサイズを大きくするためにダイアログを展開したり、リスト コントロールを展開してさらに多くのデータを表示したりできます。 この場合、[ サイズ変更の種類] を [両方] に設定し、[ 移動の種類 ] を [なし] に設定します。 次に、[ サイズ設定 X ] と [ サイズ Y] の 値を 100 に設定します。

    動的レイアウトの設定。

  5. コントロールに適したその他の値を試してください。 たとえば、1 行のテキスト ボックスを含むダイアログでは、[ サイズ変更の種類 ] が [水平 ] にのみ設定されている場合があります。

プログラムによる動的レイアウト プロパティの設定

前の手順は、デザイン時にダイアログの動的レイアウト プロパティを指定する場合に便利ですが、実行時に動的レイアウトを制御する場合は、動的レイアウト プロパティをプログラムで設定できます。

動的レイアウト プロパティをプログラムで設定するには

  1. ダイアログ クラスの実装コードで、ダイアログの動的レイアウトを指定する場所を検索または作成します。 たとえば、ダイアログに AdjustLayout などのメソッドを追加し、レイアウトを変更する必要がある場所から呼び出すことができます。 これを最初にコンストラクターから呼び出すか、ダイアログを変更した後で呼び出すことができます。

  2. ダイアログの場合は、 クラスのメソッドである CWnd を呼び出します。 GetDynamicLayout は、 CMFCDynamicLayout オブジェクトへのポインターを返します。

    CMFCDynamicLayout* dynamicLayout = pDialog->GetDynamicLayout();
    
  3. 動的な動作を追加する最初のコントロールでは、動的レイアウト クラスの静的メソッドを使用して、コントロールの調整方法をエンコードする MoveSettings 構造体を作成します。 そのためには、まず適切な静的メソッド CMFCDynamicLayout::MoveHorizontalCMFCDynamicLayout::MoveVerticalCMFCDynamicLayout::MoveNone、または CMFCDynamicLayout::MoveHorizontalAndVertical を選択します。 移動の水平方向または垂直方向の側面に対してパーセンテージを渡します。 これらの静的メソッドはすべて、コントロールの移動動作を指定するために使用できる、新しく作成された MoveSettings オブジェクトを返します。

    100 は、ダイアログのサイズが変更されたのと同じだけ移動することを意味します。これにより、コントロールの端が新しい境界線から一定の距離を保ちます。

    MoveSettings moveSettings = CMFCDynamicLayout::MoveHorizontal(100);
    
  4. SizeSettings 型を使用するサイズの動作に対して同じことを行います。 たとえば、ダイアログのサイズ変更時にコントロールのサイズが変更されないように指定するには、次のコードを使用します。

    SizeSettings sizeSettings = CMFCDynamicLayout::SizeNone();
    
  5. CMFCDynamicLayout::AddItem メソッドを使用して、動的レイアウト マネージャーにコントロールを追加します。 目的のコントロールを指定する方法に応じて、2 つのオーバーロードがあります。 1 つはコントロールのウィンドウ ハンドル (HWND) を受け取り、もう 1 つはコントロール ID を受け取ります。

    dynamicLayout->AddItem(hWndControl,
    moveSettings,
    sizeSettings);
    
  6. 移動またはサイズ変更する必要があるコントロールごとに、この操作を繰り返します。

  7. 必要に応じて、 CMFCDynamicLayout::HasItem メソッドを使用して、動的レイアウト変更の対象となるコントロールの一覧にコントロールが既にあるかどうかを判断するか、 CMFCDynamicLayout::IsEmpty メソッドを使用して、変更の対象となるコントロールがあるかどうかを判断できます。

  8. ダイアログ レイアウトを有効にするには、 CWnd::EnableDynamicLayout メソッドを 呼び出します。

    pDialog->EnableDynamicLayout(TRUE);
    
  9. 次回ユーザーがダイアログのサイズを変更すると、 CMFCDynamicLayout::Adjust メソッドが呼び出され、実際に設定が適用されます。

  10. 動的レイアウトを無効にする場合は、bEnabled パラメーターと同様に、FALSEを指定して CWnd::EnableDynamicLayout を呼び出します。

    pDialog->EnableDynamicLayout(FALSE);
    

リソース ファイルからプログラムで動的レイアウトを設定するには

  1. 次の例のように、 CMFCDynamicLayout::MoveHorizontalAndVertical メソッドを使用して、動的レイアウト情報を指定する関連するリソース スクリプト ファイル (.rc ファイル) にリソース名を指定します。

    dynamicLayout->LoadResource("IDD_DIALOG1");
    

    名前付きリソースは、次の例のように、リソース ファイル内の AFX_DIALOG_LAYOUT エントリの形式でレイアウト情報を含むダイアログを参照する必要があります。

    /////////////////////////////////////////////////////////////////////////////
    //
    // AFX_DIALOG_LAYOUT
    //
    
    IDD_MFCAPPLICATION1_DIALOG AFX_DIALOG_LAYOUT
    BEGIN
    0x0000,
    0x6400,
    0x0028,
    0x643c,
    0x0028
    END
    
    IDD_DIALOG1 AFX_DIALOG_LAYOUT
    BEGIN
    0x0000,
    0x6464,
    0x0000,
    0x6464,
    0x0000,
    0x0000,
    0x6464,
    0x0000,
    0x0000
    
    END
    

こちらも参照ください

CMFCDynamicLayout クラス
コントロール クラス
ダイアログ ボックス クラス
ダイアログ エディター
Visual C++ 2015 での MFC の動的ダイアログ レイアウト