none
Window幅を縮めたときのCPaneDialogの横幅について RRS feed

  • 質問

  • いつもお世話になっています。

    CPaneDialogをドッキングしたWindowがありまして、そのWindowを最小幅まで縮めたとします。

    そうすると、CPaneDialogの横幅がWindowの横幅になってしまい、Windowサイズを元に戻してもCPaneDialogのサイズは元に戻りません。

    MSDNのサンプルのSetPaneSizeのソースでも同様の現象が起こりますので、よろしければご確認いただければと思います。

    ただ、このサンプルの場合、CPaneDialogがReSizeできるようになっているため、手動でサイズを調整しなおすことはできました。

    できれば、ReSizeはできないようにしておきたいと思っています。

    何かよい方法がございましたら教えてください。

    よろしくお願いいたします。

    2011年7月25日 8:35

回答

  • 対象としているCPaneDialogから派生したクラスのWM_EXITSIZEMOVEで、
    所定サイズより小さくならないようにしてみてはどうでしょう。OnSize()でうまくいくなら
    そっちでも良いですけど。


    • 回答としてマーク 山本春海 2011年9月2日 5:28
    2011年7月25日 10:42
  • WM_SIZEでも良いですが、なるべく他でやりたいですね。
    WM_EXITSIZEMOVEがだめなら、WM_WINDOWSPOSCHANGEDが良いでしょう。
    たとえば幅を150pixl未満にしたくなかったら上記のタイミングで、
    幅が150pixl未満に指定された場合に
      SetWindowPos( NULL, 0, 0, 150, cy,
            SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
      RedrawWindow();
    してみたらどうでしょう。
    cyはWM_SIZEの場合は引数のもの、WM_WINDOWSPOSCHANGEDの
    場合は同じく引数のWINDOWPOS::cyが使えます。
    最大化、最小化時は、別の考慮が必要になるかもしれませんが、
    とりあえずやってみてはどうでしょう。

    • 回答としてマーク 山本春海 2011年9月2日 5:28
    2011年7月26日 9:28
  • 少し見てみました。

    CFrameWndEx::OnSize()
    CFrameWndEx::AdjustDockingLayout()
    CDockingManager::AdjustDockingLayout()
    CBasePane->CalcFixedLayout() < ここで最小sizeが設定できるかも
    CBasePane->SetWindowPos()
    ・・・

    AdjustDockingLayoutで各CBasePaneのLayout調整を行っているため、
    DockingManagerのLayout処理を利用する場合は、
    UIの乱れを考慮する必要がありますね。

    また、一瞥する限りでは、型に当てはめた使い方が前提になっているように見えます。

    現状のUI構成・仕様にもよりますが、
    AdjustDockingLayoutをoverrideして、
    parentを呼んでから自分で該当PaneのSizeを調整し、
    もう一度不整合を解消するためparentを呼ぶような処理になるかと思います。

    この挙動が嫌なら、自分でDockingManagerを作ることになりそうです。

    • 回答としてマーク 山本春海 2011年9月2日 5:28
    2011年7月26日 11:49

すべての返信

  • 対象としているCPaneDialogから派生したクラスのWM_EXITSIZEMOVEで、
    所定サイズより小さくならないようにしてみてはどうでしょう。OnSize()でうまくいくなら
    そっちでも良いですけど。


    • 回答としてマーク 山本春海 2011年9月2日 5:28
    2011年7月25日 10:42
  • 返信ありがとうございます。

    WM_EXITSIZEMOVEを試したのですが、上記の操作では処理を通らないようでした。WM_ENTERSIZEMOVEも試したのですが、同様でした。

    WindowサイズがCPaneDialogの横幅よりも狭くなった時点で、OnSize()を通るので、ここで処理すればいいのかな、と思うのですが、具体的に何をすればよいのかわかりません。

    元のサイズと思しきCRectの値は、CPaneDialogのメンバ、m_rectRestoredにセットされているようなのですが、このメンバに関する情報がなく使ってよいのかわからなかったのと、その値をどう使えばよいのかもわからなかったので処理ができていません。

    よろしくお願いいたします。

    2011年7月26日 7:41
  • WM_SIZEでも良いですが、なるべく他でやりたいですね。
    WM_EXITSIZEMOVEがだめなら、WM_WINDOWSPOSCHANGEDが良いでしょう。
    たとえば幅を150pixl未満にしたくなかったら上記のタイミングで、
    幅が150pixl未満に指定された場合に
      SetWindowPos( NULL, 0, 0, 150, cy,
            SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
      RedrawWindow();
    してみたらどうでしょう。
    cyはWM_SIZEの場合は引数のもの、WM_WINDOWSPOSCHANGEDの
    場合は同じく引数のWINDOWPOS::cyが使えます。
    最大化、最小化時は、別の考慮が必要になるかもしれませんが、
    とりあえずやってみてはどうでしょう。

    • 回答としてマーク 山本春海 2011年9月2日 5:28
    2011年7月26日 9:28
  • 少し見てみました。

    CFrameWndEx::OnSize()
    CFrameWndEx::AdjustDockingLayout()
    CDockingManager::AdjustDockingLayout()
    CBasePane->CalcFixedLayout() < ここで最小sizeが設定できるかも
    CBasePane->SetWindowPos()
    ・・・

    AdjustDockingLayoutで各CBasePaneのLayout調整を行っているため、
    DockingManagerのLayout処理を利用する場合は、
    UIの乱れを考慮する必要がありますね。

    また、一瞥する限りでは、型に当てはめた使い方が前提になっているように見えます。

    現状のUI構成・仕様にもよりますが、
    AdjustDockingLayoutをoverrideして、
    parentを呼んでから自分で該当PaneのSizeを調整し、
    もう一度不整合を解消するためparentを呼ぶような処理になるかと思います。

    この挙動が嫌なら、自分でDockingManagerを作ることになりそうです。

    • 回答としてマーク 山本春海 2011年9月2日 5:28
    2011年7月26日 11:49