• 締切済み

[MFC]コントロールに合わせてフレームサイズ変更

OS -> Windows7 Enterprice SP1 VSバージョン -> VS2008 Professional Edition メインフレーム(CFrameWnd)内に分割ウィンドウでCFormViewを縦2つ内包した画面です。 (内1つはダミーで縦サイズが0指定) フォームビューの初期表示時にデータの有無を判定し、 データが無ければリストコントロールを非表示にして、 それ以下のコントロールを上詰めする、という処理を取っています。 その際、フレームサイズもコントロールの非表示に伴い サイズを縮小したいのですが、現状のやり方では 想定よりも縦幅が大きくなってしまいます。 以下にコードを記述します。 // CFormView void CSumpleFormView::InitFormView() { // データ取得、コントロールの位置変更は省略 // 現在のフレームサイズを取得 RECT stFrameRect; GetParentFrame()->GetWindowRect(&stFrameRect); // フレーム幅 int iFrameWidth = stFrameRect.right - stFrameRect.left; // 最下端(OKボタン)のコントロール RECT stBtnRect; m_BtnOk.GetWindowRect(&stBtnRect); // ダイアログベース単位を取得 iDlgBaseY = HIWORD(GetDialogBaseUnits()); // 余白をピクセル高さに換算する int iYPadding = MulDiv(4, iDlgBaseY, 8); // フレーム高さ // 最下端コントロールのbottom + 余白をフレーム高さとする int iFrameHeight = stBtnRect.bottom + iYPadding; // メインフレームにサイズを渡す pclMainFrame->ChangeSize(iFrameWidth, iFrameHeight); } // CFrameWnd void CSumpleFrameWnd::ChangeSize(int iWidth, int iHeight) { RECT stRect; GetWindowRect(&stRect); SetWindowPos(&CWnd::wndTop, stRect.left, stRect.top , iWidth, iHeight, SWP_SHOWWINDOW); } 余白(iYPadding)を加算せずにサイズを変更しても 最下端コントロールの下に余白が出来るので、 縦幅の設定に問題があるようです。 ですが、原因が分かりません…。 ご教授のほど、宜しくお願い致します。 また、不明な点がありましたらご質問下さい。

みんなの回答

  • davidfox
  • ベストアンサー率58% (21/36)
回答No.1

単純な事なので要所要所でトレース出力して見ればすぐに判ると思うのですが... ざっと眺めた感じでは、 SetWindowPosは座標ではなく、マニュアル通りに高さを要求するので、ちゃんと高さを計算した方がいいと思います。 何だかスクリーン座標のまま計算してあるように見えます。理屈が合えばそれでもいいのですが。

関連するQ&A