单文档多视图,窗口大小改变问题。

在读完Visual C++ 单文档界面中创建视图 这篇文章以后,感觉受益匪浅,但是发现一个问题,在两个视图之间切换以后,窗口的大小无法使用MoveWindow()函数来改变,MoveWindow函数原型如下:

MoveWindow()

函数功能:改变指定窗口的位置和大小.对顶窗口来说,位置和大小取决于屏幕的左上角;对子窗口来说,位置和大小取决于父窗口客户区的左上角.

  函数原型:BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );   

      参数   

                   hWnd指定了窗口的句柄   

                   x指定了CWnd的左边的新位置。   

                   y指定了CWnd的顶部的新位置。   

                   nWidth指定了CWnd的新宽度。   

                   nHeight指定了CWnd的新高度。   

                   bRepaint指定了是否要重画CWnd。如果为TRUE,则CWnd象通常那样在 OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包 括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分 无效或重画。

      MoveWindow给窗口发送WM_WfNOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE消息

MoveWindow()的两个重载函数

  void CWnd::MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );   

      void CWnd::MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );   

      参数   

            x指定了CWnd的左边的新位置。   

            y指定了CWnd的顶部的新位置。   

            nWidth指定了CWnd的新宽度。   

            nHeight指定了CWnd的新高度。   

            bRepaint指定了是否要重画CWnd。如果为TRUE,则CWnd象通常那样在 OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包 括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分 无效或重画。   

      lpRectCRect对象或RECT结构,指定了新的大小和位置。说明这个函数改变窗口的位置和大小。对于顶层的CWnd对象,x和y参数是相对于屏幕的左上角的。对于子对象,它们是相对于父窗口客户区的左上角的。   

      MoveWindow函数发送一条WM_GETMINMAXINFO消息。处理这个消息 时,CWnd得到一个改变最大和最小的窗口缺省值的机会。如果传递给MoveWindow成员函数的参数超过了这些值,则在 WM_GETMINMAXINFO处理函数中可以用最小或最大值来代替这些值。

究其原因是因为在新创建的视图CAnotherView 在创建时大小已经固定,所以在改变窗口大小时要先改变视图的大小。

你可能感兴趣的:(技术知识)