[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)を加算せずにサイズを変更しても
最下端コントロールの下に余白が出来るので、
縦幅の設定に問題があるようです。
ですが、原因が分かりません…。
ご教授のほど、宜しくお願い致します。
また、不明な点がありましたらご質問下さい。
お礼
FAYさんのおっしゃるように、明示的にCWnd::GetDesktopWindowを呼んで親ウィンドウにしてやったところ解決しました。 Spy++で見ると親ウィンドウをNULLでCreateしたときにも確かにデスクトップの下にあるようなんですけどねぇw