MFC对话框调整大小问题:未考虑状态栏尺寸
解决对话框最小尺寸未包含状态栏高度的问题
问题原因
你的自定义基类CResizingDialog在OnGetMinMaxInfo中使用的m_rcInit是对话框初始化时的原始尺寸,但状态栏是在OnInitDialog中动态创建并添加的,初始尺寸并未包含状态栏的高度,导致缩小窗口时状态栏被遮挡。手动拉高对话框后m_rcInit的高度包含了状态栏的空间,因此问题得到缓解。
解决方案
方案1:初始化时更新m_rcInit包含状态栏高度
在OnInitDialog中创建状态栏并调用RepositionBars后,更新m_rcInit的高度,将状态栏的高度加入其中:
// 获取状态栏高度 CRect statusBarRect; m_StatusBar.GetWindowRect(statusBarRect); int statusBarHeight = statusBarRect.Height(); // 更新m_rcInit的高度 m_rcInit.bottom += statusBarHeight;
或者直接获取调用RepositionBars后的窗口整体尺寸来覆盖m_rcInit:
CRect windowRect; GetWindowRect(windowRect); m_rcInit = windowRect;
方案2:在OnGetMinMaxInfo中动态计算状态栏高度
修改CResizingDialog::OnGetMinMaxInfo,动态获取状态栏高度并加到最小窗口高度上:
void CResizingDialog::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { if (!m_rcInit.IsRectEmpty()) { lpMMI->ptMinTrackSize.x = m_rcInit.Width(); // 获取状态栏高度(确保状态栏已创建) int statusBarHeight = 0; if (m_StatusBar.GetSafeHwnd()) { CRect rect; m_StatusBar.GetWindowRect(rect); statusBarHeight = rect.Height(); } lpMMI->ptMinTrackSize.y = m_rcInit.Height() + statusBarHeight; if (m_bLimitToHorizontalResizing) lpMMI->ptMaxTrackSize.y = m_rcInit.Height() + statusBarHeight; } __super::OnGetMinMaxInfo(lpMMI); }
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

