ダイアログバーの角でサイズ変更するには?

解決


PiNMeN  2011-02-09 21:08:31  No: 72328

CDialogBarを使用して、ダイアログバーを作成しています。
ダイアログバーをウィンドウ状態にしたとき、
ウィンドウの角をドラッグして、高さと幅を一度に変更させたいのですが
実現方法が分かりません。

CalcDynamicLayout をオーバライドするのでしょうか?

知っているかたいましたら、ご教授下さい。

以上、よろしくお願いします。

環境
 Windows XP以降
 VC++ 6


gak  2011-02-11 03:09:04  No: 72329

> 高さと幅を一度に変更させたいのですが実現方法が分かりません。
4辺をドラッグしてのサイズ変更は実現できていると考えて良いのだろうか?

http://support.microsoft.com/kb/143255/ja
一応参考ページ。

> ウィンドウの角をドラッグして、
> 知っているかたいましたら、ご教授下さい。
↑で示したページに載っているコードを元に、とりあえず簡単に実現できた方法を一つ紹介。

ダイアログバーでこれが出来ないのは、フローティングツールバーで使われる CMiniDockFrameWnd に MFS_4THICKFRAME というスタイルが設定されているせい。
なので、MFS_4THICKFRAME を外す。

  #include <afxpriv.h>
  CMainFrame::xxxxxxx {
      FloatControlBar(&dialogbar, ...);
      if (dialogbar.m_pDockBar != NULL) {
          dialogbar.m_pDockBar->GetParent()->ModifyStyle(MFS_4THICKFRAME, MFS_THICKFRAME);
      }
  }

次に CResizableDlgBar::CalcDynamicLayout(from http://support.microsoft.com/kb/143255/ja) に処理追加。

  #include <afxpriv.h>
  CSize CResizableDlgBar::CalcDynamicLayout(int nLength, DWORD dwMode) {
        :
     if (dwMode & LM_MRUWIDTH)
         return m_sizeFloating;
// ↓ここから追加
      if (IsFloating()) {
          const int hittest = m_pDockContext->m_nHitTest;
          if (hittest == HTTOPLEFT || hittest == HTBOTTOMLEFT || hittest == HTTOPRIGHT || hittest == HTBOTTOMRIGHT) {
              CPoint cursor;
              ::GetCursorPos(&cursor);
              CRect rect;
              GetParentFrame()->GetClientRect(rect);
              GetParentFrame()->ClientToScreen(rect);

              if (nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMLEFT) {
                  m_sizeFloating.cx = max(0, rect.right - cursor.x);
                  m_pDockContext->m_rectFrameDragHorz.left = rect.right - m_sizeFloating.cx;
              }
              if (nHitTest == HTTOPLEFT || nHitTest == HTTOPRIGHT) {
                  m_sizeFloating.cy = max(0, rect.bottom - cursor.y);
                  m_pDockContext->m_rectFrameDragHorz.top = rect.bottom - m_sizeFloating.cy;
              }
              if (nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMRIGHT) {
                  m_sizeFloating.cx = max(0, cursor.x - rect.left);
              }
              if (nHitTest == HTBOTTOMLEFT || nHitTest == HTBOTTOMRIGHT) {
                  m_sizeFloating.cy = max(0, cursor.y - rect.top);
              }
              return m_sizeFloating;
          }
      }
        :
  }

これで一応それらしい動作はした。ただ細かな調整・制御は面倒なのでしていない。
実際にこのコードを使うなら細かな調整を加えた方が多分良い。


gak  2011-02-11 03:23:30  No: 72330

あ〜、CResizableDlgBar::m_bChangeDockedSize の対応抜けてるな。
m_bChangeDockedSize を有効にするならその対応も入れてやって。


PiNMeN  2011-02-14 19:11:52  No: 72331

gakさん、回答ありがとうございます。

スタイルの変更と、CalcDynamicLayoutでの制御で、
サイズ変更できる様になりました。

サンプルソースまで載せて頂き、ありがとうございました。

> 4辺をドラッグしてのサイズ変更は実現できていると考えて良いのだろうか?
は、出来ています。
ので、今回の質問の制御を追加実装しようと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加