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

时间:2014-01-06 00:12:16

标签: c++ mfc

我已经尝试过了     MoveWindow(50,50,150,200,TRUE)

中的CMyFormView::OnInitialUpdate();

另外,我在

中尝试了以下代码
CWinApp::InitInstance();
RECT desktop;

const HWND hDesktop = ::GetDesktopWindow();
::GetWindowRect(hDesktop,&desktop);

MoveWindow(hDesktop,0,0,900,400,TRUE);  

我没有运气调整表格(对话框) 我将不胜感激任何建议。

3 个答案:

答案 0 :(得分:3)

在SDI程序中,对话框由大型机窗口调整大小以填充客户区。调整框架窗口的大小,然后会出现对话框。把它放在formview的OnInitialUpdate

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

答案 1 :(得分:1)

关键事项:

  1. MINIMUM SIZE - 您设置 - 对话框模板 - 或表单视图 - 您使IS成为CFormview将使用的绝对最小尺寸

  2. MAXIMUM SIZE - 自动调整大小 - 对话框模板没有最大值。 CFormview动态地将其拉伸以适合CMainFrame窗口。

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

  4. void CSimpleSDIView::OnInitialUpdate() {

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

    }

    1. FORCE CMainFrame限制最小尺寸 - 如有必要。使用 WM_GETMINMAXINFO 以下是代码:
    2. 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. 设置为IDEAL SIZE 这可以通过使用以下代码在CFormView :: OnInitialUpdate中实现(仍然需要步骤3):

        AfxGetMainWnd()->MoveWindow(0, 0, 1024, 600, 1);
        
      2. TWEAK控制位置随着MFC中功能区的出现,一切看起来不错,但如果没有额外的调整,使用步骤1 - 5是行不通的。基本上,功能区会向主窗口发送额外的调整大小,因此即使您发送了最小的模板大小,由于额外的大小调整,事情会有一些不成比例 - 主要是因为功能区内的组可能会崩溃成一个图标。 **在执行第5步之前**您可能需要添加以下代码:

      3. 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窗口时,我希望formview的内容相应地调整大小。一些代码工作得很好,但是当我把窗口做得很小时问题出现了。当我这样做时,我会得到这些丑陋的滚动条。我的想法是滚动条在那里,因为他们试图尊重原始的对话框模板大小。那个想法是对的!例如,您将对话框设置为500 x 500并且调整大小小于此值,您将获得滚动条 - 因为CFormview认为应用程序必须在最小500x500。最小大小由您制作的模板控制,您无法动态缩小。

答案 2 :(得分:0)

通常,子窗口的大小,位置在子的初始化代码中更改。 如果在父窗口代码中更改此项,则始终必须检查子窗口句柄值是否有效。 我输入WM_CREATE的代码CAboutDlg处理程序。

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;
}