【发布时间】:2019-06-23 23:28:15
【问题描述】:
1997年,我用C++创建了一个MDI MFC程序。
我创建了一个名为 XFormFiew 的类,它扩展了 MFC CFormView 类。
在OnInitialUpdate()事件方法中,我写了一些代码来自动修改视图的缩放。
过去大部分的屏幕分辨率是800x600,但现在分辨率更高了。在自动放大XFormView 时,我避免在所有视图中进行一些修改。
缩放代码修改了活动CFormView中包含的每个CWnd的Left和Bottom以及Width和Height
代码如下
void XFormView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
pLogFont = new LOGFONT;
CFont* pDialogFont = GetFont();
pDialogFont->GetObject(sizeof(LOGFONT),pLogFont);
pLogFont->lfHeight = MulDiv(pLogFont->lfHeight, Config.GetDstH(), Config.GetSrcH());
pLogFont->lfWeight = FW_NORMAL;
pFont = new CFont;
pFont->CreateFontIndirect(pLogFont);
SetFont(pFont);
CWnd* pWnd;
pWnd = GetWindow(GW_CHILD);
while (pWnd != NULL)
{
ZoomWnd(pWnd);
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
// TRY to modify WIDTH and HEIGTH of CFormView
ZoomWnd(this);
}
void XFormView::ZoomWnd(CWnd* pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.left = (int)((long)rect.left * Config.GetDstH() / Config.GetSrcH());
rect.top = (int)((long)rect.top * Config.GetDstV() / Config.GetSrcV());
rect.right = (int)((long)rect.right * Config.GetDstH() / Config.GetSrcH());
rect.bottom = (int)((long)rect.bottom * Config.GetDstV() / Config.GetSrcV());
pWnd->MoveWindow(&rect);
pWnd->SetFont(pFont);
}
代码运行良好,但对于某些视图,缺少垂直和水平滚动条。
窗口总是被最大化加载。如果我取消最大化窗口,滚动条总是丢失。
如果我减小 WIDTH 或 HEIGHT,当宽度或高度达到 RC 资源文件中定义的值时,将显示滚动条。
例子:
IDD_OVFORM DIALOGEX 0, 0, 370, 297
其中 370 是 Form 的宽度,297 是高度。
如果我减小子窗口的宽度,在宽度减小到 370 之前什么都不会发生。此时会自动显示一个水平滚动条。
我的问题是如何动态(不在 RC 文件中)更改 IDD_OVFORM 的宽度和高度以对应缩放级别,以便正确显示水平和垂直滚动条?
我已经尝试在 OnInitialUpdate() 方法中更改这些属性,但没有任何效果。
如果我在 RC 资源文件中更改宽度和高度,缩放对于特定缩放级别(但不是所有缩放级别)都可以正常工作。
在互联网上,我找到了一些关于删除滚动条的解决方案,但不是关于使用 MDI MFC 表单进行缩放和缺少滚动条的解决方案。
有没有人已经找到解决这个问题的方法?
2019-02-12:感谢 Barmak Shemirani 的完美解决方案(选项 3)。
【问题讨论】: