如何在MFC SDI CFormView应用程序中调整窗体(对话框)的大小

How does one resize the form(dialog) in a MFC SDI CFormView application?

本文关键字:对话框 窗体 调整 MFC SDI 应用程序 CFormView      更新时间:2023-10-16

我试过了CMyFormView::OnInitialUpdate();中的MoveWindow(50,50,150,200,TRUE)

此外,我在中尝试了以下代码

CWinApp::InitInstance();
RECT desktop;
const HWND hDesktop = ::GetDesktopWindow();
::GetWindowRect(hDesktop,&desktop);
MoveWindow(hDesktop,0,0,900,400,TRUE);  

调整窗体(对话框)的大小时运气不佳
如果有任何建议,我将不胜感激。

在SDI程序中,对话框的大小由大型机窗口决定,以填充客户端区域。调整框架窗口的大小,随后将出现对话框。将其放入表单视图的OnInitialUpdate

AfxGetMainWnd()->MoveWindow(....);

关键事项:

  1. 最小尺寸-您设置-您创建的对话框模板或表单视图是绝对最小尺寸CFormview将使用

  2. 最大尺寸-自动尺寸-对话框模板没有最大值。CFormview动态拉伸它以适应CMainFrame窗口。

  3. 启动模板大小的应用程序当然,您可能希望CMainFrame窗口尽可能紧凑,这是通过在CFormView::OnInitialUpdate()中使用3行强制性代码来实现的

void CSimpleSDIView::OnInitialUpdate(){

CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit(); // FORCES CMainframe to be as small as the dialog template

}

  1. 强制CMainFrame限制最小尺寸-如有必要。使用WM_GETMINMAXINFO以下是代码:

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI){

lpMMI->ptMinTrackSize.x = 500; // absolute minimum width for CMainFrame
lpMMI->ptMinTrackSize.y = 500; // absolute minimum height for CMainFrame
CFrameWnd::OnGetMinMaxInfo(lpMMI);

}

  1. 设置为理想大小这可以在CFormView::OnInitialUpdate中使用以下代码实现(仍然需要步骤3):

    AfxGetMainWnd()->MoveWindow(0, 0, 1024, 600, 1);
    
  2. TWEAK CONTROL POSITIONS随着MFC功能区的出现,情况看起来不错,但如果不进行额外的调整,使用步骤1-5就无法工作。基本上,功能区会向主窗口发送一个额外的大小调整,所以即使您发送了一个最小的模板大小,由于额外的大小,事情也会变得有点不成比例——主要是因为功能区中的一个组可以折叠成一个图标。**在执行步骤5**之前,您可能需要添加以下代码:

if(::GetSystemMetrics(SM_CXSCREEN) > 1024){

RECT r;
CWnd *someControl = GetDlgItem(IDC_SOMECONTROL);
someControl->GetWindowRect(&r);
ScreenToClient(&r);
r.right += 300;//r.right += 30;
r.bottom += 150;
someControl->MoveWindow(&r)
}

解释:

简短的回答是,你没有!基本上,我也遇到了同样的问题,制作了一个对话框模板,用于CFormView派生类。当我想像任何普通窗口一样拉伸CMainFrame窗口时,我希望表单视图的内容相应地调整大小。这在某些代码中运行得很好,但当我将窗口设置得很小时,问题就出现了。当我这样做的时候,我会得到这些丑陋的滚动条。我的想法是滚动条在那里,因为它们试图尊重原始对话框模板的大小。这个想法是正确的!例如,如果您将对话框设置为500 x 500,并且您的大小小于500,您将得到滚动条,因为CFormview尊重应用程序必须至少为500 x 100。最小大小由您制作的模板决定,不能动态地使其变小。

通常,子窗口的大小和位置在子窗口的init代码中会发生变化。如果在父窗口代码中更改此项,则必须始终检查子窗口句柄值是否有效。我输入了这个代码CAboutDlgWM_CREATE处理程序。

int CAboutDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO:  Add your specialized creation code here
RECT desktop;
const HWND hDesktop = ::GetDesktopWindow();
::GetWindowRect(hDesktop,&desktop);
MoveWindow(&desktop,TRUE);
return 0;
}