トップ回答者
Window幅を縮めたときのCPaneDialogの横幅について

質問
-
いつもお世話になっています。
CPaneDialogをドッキングしたWindowがありまして、そのWindowを最小幅まで縮めたとします。
そうすると、CPaneDialogの横幅がWindowの横幅になってしまい、Windowサイズを元に戻してもCPaneDialogのサイズは元に戻りません。
MSDNのサンプルのSetPaneSizeのソースでも同様の現象が起こりますので、よろしければご確認いただければと思います。
ただ、このサンプルの場合、CPaneDialogがReSizeできるようになっているため、手動でサイズを調整しなおすことはできました。
できれば、ReSizeはできないようにしておきたいと思っています。
何かよい方法がございましたら教えてください。
よろしくお願いいたします。
回答
-
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
-
少し見てみました。
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
すべての返信
-
返信ありがとうございます。
WM_EXITSIZEMOVEを試したのですが、上記の操作では処理を通らないようでした。WM_ENTERSIZEMOVEも試したのですが、同様でした。
WindowサイズがCPaneDialogの横幅よりも狭くなった時点で、OnSize()を通るので、ここで処理すればいいのかな、と思うのですが、具体的に何をすればよいのかわかりません。
元のサイズと思しきCRectの値は、CPaneDialogのメンバ、m_rectRestoredにセットされているようなのですが、このメンバに関する情報がなく使ってよいのかわからなかったのと、その値をどう使えばよいのかもわからなかったので処理ができていません。
よろしくお願いいたします。
-
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
-
少し見てみました。
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