精华内容
下载资源
问答
  • vs设计视图和代码视图拆分When multitasking on the iPad, you’ll mainly use two screen modes called Split View and Slide Over. Both modes allow you to use two apps side-by-side, but each works in a ...
    vs设计视图和代码视图拆分

    vs设计视图和代码视图拆分

    Apple iPad Split View and Slide Over Hero

    When multitasking on the iPad, you’ll mainly use two screen modes called Split View and Slide Over. Both modes allow you to use two apps side-by-side, but each works in a slightly different way. Let’s talk about their similarities and differences.

    iPad上执行多任务处理时 ,您将主要使用两种屏幕模式,分别称为“拆分视图”和“滑行”。 两种模式都允许您并排使用两个应用程序,但是每种模式的工作方式略有不同。 让我们谈谈它们的异同。

    什么是分割视图? (What Is Split View?)

    The main difference between Split View and Slide Over is how much screen real estate each app takes up while using multiple apps. They also differ in functionality, each being suited to different types of tasks.

    “拆分视图”和“滑行”之间的主要区别在于,在使用多个应用程序时,每个应用程序占用多少屏幕空间。 它们的功能也各不相同,每种都适合不同类型的任务。

    Split View displays two windows side by side with a black partition in the middle. It is designed for using two apps at the same time in a situation where you may need to continuously reference each one or move information from one to the other.

    “拆分视图”并排显示两个窗口,中间有一个黑色分区。 它设计用于在您可能需要连续引用每个应用程序或将信息从一个应用程序转移到另一个应用程序的情况下同时使用两个应用程序的情况。

    Using your finger, you can drag the partition left or right and resize both windows proportionally.

    您可以用手指向左或向右拖动分区,并按比例调整两个窗口的大小。

    An example of Split View on the iPad

    To use Split View, open an app. Then swipe up from the bottom of the screen slowly to open the Dock. Place your finger on the icon for the second app you’d like to open, then slowly drag it to the left or right edge of the screen until it snaps into place.

    要使用拆分视图,请打开一个应用。 然后从屏幕底部向上轻扫以打开Dock。 将手指放在您要打开的第二个应用程序的图标上,然后将其缓慢拖动到屏幕的左边缘或右边缘,直到其卡入到位。

    To get rid of Split View, place your finger on the black partition line and drag it at a steady medium speed toward the edge of the screen until one of the windows disappears.

    要摆脱“拆分视图”,请将手指放在黑色的分隔线上,并以稳定的中速将其拖向屏幕边缘,直到其中一个窗口消失。

    Dismissing Split View on iPad Step 1

    什么是滑倒? (What Is Slide Over?)

    Slide Over displays a primary app in full-screen mode and secondary app in a small floating window on the left or right side of the screen.

    Slide Over在全屏模式下显示主要应用程序,在屏幕左侧或右侧的小浮动窗口中显示次要应用程序。

    The Slide Over window can be quickly dismissed and called back when needed, making it ideal for checking information from an app quickly while working on something else.

    滑盖窗口可以快速关闭,并在需要时调回,使其非常适合在处理其他内容时快速检查来自应用程序的信息。

    An example of Slide Over on the iPad

    To use Slide Over, open an app. Slowly swipe up from the bottom of the screen to open the Dock. Place your finger on the icon for the second app you’d like to open, then slowly drag it to the left or right half of the screen until it appears as a floating window.

    要使用Slide Over,请打开一个应用。 从屏幕底部慢慢向上滑动以打开Dock。 将手指放在您要打开的第二个应用程序的图标上,然后将其缓慢拖动到屏幕的左半部分或右半部分,直到它显示为浮动窗口为止。

    To hide the Slide Over window, place your finger on the control bar at the top and quickly swipe it toward the right or left edge of the screen. It can be recalled by swiping inward from the left or right edge of the screen, depending on which side you hid it on.

    要隐藏“滑动”窗口,请将手指放在顶部的控制栏上,然后向屏幕的右边缘或左边缘快速滑动。 可以通过从屏幕的左边缘或右边缘向内轻扫来调用它,具体取决于您将其隐藏在哪一侧。

    Slide side view window to dimiss on iPad

    To fully close a Slide Over window, hold your finger on the control bar at the top and slide it slowly toward the edge of the screen until it becomes part of Split View. You can then close the unwanted window by sliding the black partition between the two windows all the way to the edge of the screen until one window disappears.

    要完全关闭“滑动”窗口,请用手指按住顶部的控制栏,然后将其缓慢滑向屏幕边缘,直到它成为“拆分视图”的一部分。 然后,可以通过将两个窗口之间的黑色分区一直滑到屏幕边缘直到一个窗口消失,来关闭不需要的窗口。

    拆分视图并同时滑过 (Split View and Slide Over at the Same Time)

    It is possible to use Split View and Slide Over at the same time. That means you will have three app windows on the screen at once.

    可以同时使用“拆分视图”和“滑行”。 这意味着您将同时在屏幕上拥有三个应用程序窗口。

    Using Slide Over and Split View at the Same Time on iPad

    To do this, start in Split View mode, then open the dock by slowly swiping upward from the bottom edge of the screen. Slowly drag the app icon (for the third app that will be in Slide Over) on top of the black partition in the middle of the screen.

    为此,请从“拆分视图”模式开始,然后从屏幕底部边缘缓慢向上滑动以打开扩展坞。 慢慢将应用程序图标(对于将在“幻灯片上方”的第三个应用程序)拖动到屏幕中间黑色分区的顶部。

    To get rid of the Slide Over window, use its control bar at the top of the window to drag it to the side of the screen until it replaces one of the Split View apps. Then you can close the window by sliding the black center partition all the way to the edge of the screen until one window disappears.

    要摆脱“滑动”窗口,请使用其在窗口顶部的控制栏将其拖动到屏幕的一侧,直到它替换了“拆分视图”应用程序之一。 然后,您可以通过将黑色中间分区一直滑到屏幕边缘直到一个窗口消失来关闭窗口。

    了解有关多任务的更多信息-或完全禁用它 (Learn More About Multitasking—or Disable It Completely)

    Multitasking features on the iPad can be quite handy and powerful. The gestures do take some patience and practice to get just right.

    iPad上的多任务处理功能非常方便且强大 。 手势确实需要一些耐心和练习才能正确。

    On the other hand, if you prefer to use the iPad as a single-task device or you keep opening extra app windows by accident, you can turn off Split View and Slide Over in the Settings app.

    另一方面,如果您更喜欢将iPad用作单任务设备,或者意外打开了其他应用程序窗口,则可以在“设置”应用程序中关闭“拆分视图”和“滑行”

    翻译自: https://www.howtogeek.com/665906/whats-the-difference-between-split-view-and-slide-over-on-an-ipad/

    vs设计视图和代码视图拆分

    展开全文
  • 实战静态拆分视图

    2017-11-15 23:58:00
    该部分主要介绍一些基本概念和创建拆分视图的一般过程。 MFC支持两种类型的拆分窗口:静态的和动态的。这里只探讨静态拆分,不过首先还是要熟悉一下这些概念。 静态拆分窗口的行列数在拆分窗口被创建时就设置好了...
    该部分主要介绍一些基本概念和创建拆分视图的一般过程。
    MFC 支持两种类型的拆分窗口:静态的和动态的。这里只探讨静态拆分,不过首先还是要熟悉一下这些概念。
    静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。但是用户可以缩放各行各列。一个静态拆分窗口最多可以包含 16 16 列。要找一个使用了静态拆分窗口的应用程序,只要看一下 windows 管理器即可。
    动态拆分窗口最多可以有两行两列,但它们可以相互拆分和合并。 Vc 就使用了动态拆分窗口使得可以同时编辑源程序文件的两个以上不同的部分。
    选择静态或动态拆分的一个准则是是否希望用户能够交互地修改拆分窗口的行列配置。另一个决定因素是计划在拆分窗口中使用的视图种类。在静态拆分窗口中很容易使用两个以上不同种类的视图,因为您可以在每个窗格中指定所用的视图类型。但是在动态拆分窗口中, MFC 管理着视图,除非从 CsplitterWnd 派生一个新类并修改拆分窗口的默认操作性能,否则拆分窗口中的所有视图使用的都是相同的视图类。
    静态拆分窗口是用 CsplitterWnd::CreateStatic 而不是 CsplitterWnd::Create 创建,并且由于 MFC 不会自动创建静态拆分窗口中显示的视图,所以您要亲自在 CreateStatic 返回之后创建视图。 CsplitterWnd 为此提供了名为 CreateView 的函数。给框架窗口添加静态拆分视图的过程如下:
    <!--[if !supportLists]--> 1.  <!--[endif]--> 给框架窗口类添加一个 CsplitterWnd 数据成员。
    <!--[if !supportLists]--> 2.  <!--[endif]--> 覆盖框架窗口的 OnCreateClient 函数,并调用 CsplitterWnd::CreateStatic 来创建静态拆分视图。
    <!--[if !supportLists]--> 3.  <!--[endif]--> 使用 CsplitterWnd:: CreateView 在每个静态拆分窗口的窗格中创建视图。
    使用静态拆分窗口的一个优点是由于您自己给窗格添加视图,所以可以控制放入视图的种类。
    下列中创建的静态拆分窗口包含了两种不同的视图:
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CcreateContext* pContext)
    {
    if(!m_wndSplitter.CreateStatic(this, 1, 2) ||
    !m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CtextView), Csize(128, 0), pContext) ||
    !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CpictureView), Csize(0, 0),pContext) )

    return FALSE;
    <!--[if !supportEmptyParas]--> <!--[endif]-->

    return TRUE;
    }
    传递给 CreateStatic 的参数指定了拆分窗口的父亲以及拆分窗口包含的行列数。对每个窗格调用一次 CreateView 。用从 0 开始的行列编号来标示窗格。在上面的代码中,第一次调用 CreateView 在左窗格( 0 0 列)中加入类型为 CtextView 的视图,第二次调用在右窗格( 0 1 列)加入类型为 CpictureView 的视图。传递给 CreateView Csize 对象指定了窗格的初始尺寸。在上面的代码中, CtextView 窗格的初始宽度为 128 象素, CpictureView 窗格将占据剩余的窗口宽度。指定右窗格宽度的值和指定两个窗格高度的值都是 0 ,这是因为主结构会忽略它们。
     
    下面以一个单文档程序为例,说明静态拆分视图的实现过程:
    <!--[if !supportLists]--> 1.  <!--[endif]--> 首先建立一个单文档应用程序 SplitWnd ,视图 CSplitWndView 类型为列表视图。利用 CSplitWndView ::OnInitialUpdate 初始化列表视图。
    <!--[if !supportLists]--> 2.  <!--[endif]--> 为该工程新增一个树型视图类 CMyTreeView ,并在该类中添加 HTREEITEM 类型的成员变量 m_hSubTree[2] ,该成员变量用来保存树型视图的子树句柄。利用 CMyTreeView ::OnInitialUpdate 初始化树型视图,为该树型视图添加一个树根,两个子树,参考代码如下:
    HTREEITEM hRoot = GetTreeCtrl().InsertItem(_T(" 树根 "),  。。。。。。 , TVI_ROOT);
    m_hSubTree[0] = GetTreeCtrl().InsertItem(_T(" 子树 1"),  。。。。。。 , hRoot);  
    m_hSubTree [1] = GetTreeCtrl().InsertItem(_T(" 子树 2"),  。。。。。。 , hRoot);
    <!--[if !supportLists]--> 3.  <!--[endif]--> 在框架类中添加一个 CSplitterWnd  类型的成员变量 m_wndSplitter1 ,并重载 OnCreateClient 函数来拆分视图,代码如下:
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    if(!(m_wndSplitter1.CreateStatic(this, 1, 2) ) ||
                  !(m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(CSplitWndView), CSize(0,0), pContext) ) ||
                  !(m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(180 ,0), pContext) ) 
           {
                  return FALSE;
           }
           return TRUE;
    }
    如果你设计的程序需要更多的拆分视图,可以再在框架类中添加 CSplitterWnd  类型的成员变量 m_wndSplitter2 ,再次利用 CreateStatic 拆分视图,代码如下:
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {if(!(m_wndSplitter1.CreateStatic(this, 2, 1) ) ||
                  !(m_wndSplitter1.CreateView(1, 0, RUNTIME_CLASS(CMyListView), CSize(0,0), pContext) ) ||
                  !(m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,0)) ) ||
                  !(m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(180 ,0), pContext) ) ||
                  !(m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CSplitWndView), CSize(0,0), pContext) )
           )
    {
                  return FALSE;
           }
           m_wndSplitter1.SetRowInfo(0, 350, 0);  // 重新设置行宽
           m_wndSplitter1.RecalcLayout();
    <!--[if !supportEmptyParas]--> <!--[endif]-->

    return TRUE;
    }
    现在基本的界面就建立好了,有关初始化列表视图的代码要根据具体情况来添加。另外,别忘记在框架 .cpp 中包含视图类的头文件。
    为了视类之间的通讯,我们让这些视类共用一个文档类,现在来编写视图之间通讯的代码:
    1 .在文档类中添加 int  m_nViewType ,表示要显示的类型。当用户单击“子树 1 ”或“子树 2 ”时改变其值。
    <!--[if !supportLists]--> 2.  <!--[endif]--> 建立树型视图通知 TVN_SELCHANGED 响应函数 OnSelchanged ,添加如下代码:
    CSplitWndDoc* m_pDoc = (CSplitWndDoc*)GetDocument();
    HTREEITEM hTmp = GetTreeCtrl().GetSelectedItem();  // 得到当前选中的子树句柄
    <!--[if !supportEmptyParas]--> <!--[endif]-->

    // m_pDoc->m_nViewType 复位
    m_pDoc->m_nViewType = 1000;
    <!--[if !supportEmptyParas]--> <!--[endif]-->

    if(hTmp == m_hSubTree [0] && m_pDoc)
    {
           m_pDoc->m_nViewType = 0;       // 将显示类型设置为子树 1
    }
    if(hTmp == m_hSubTree [1] && m_pDoc)   
    {
    m_pDoc->m_nViewType = 1;  // 将显示类型设置为子树 2
    }
    // 在改变子树的情况下才刷新 CSplitWndView 视图
    if(hTmp == m_hSubTree [0] || hTmp == m_hSubTree [1] && m_pDoc)
    {
           // 通知视图更新 CSplitWndView
           m_pDoc->UpdateAllViews(this);
    }
    3 .在 CSplitWndView 中重载 OnUpdate 函数,响应 UpdateAllViews
    CSplitWndDoc* pDoc = GetDocument();
    GetListCtrl().DeleteAllItems();            // 删除列表视图中的项
           switch(pDoc->m_nViewType)        // 查看视图类型
           {
           case 0:
                  // 将与子树 1 相关的项添加到列表视图中
                  break;
           case 1:
                  // 将与子树 2 相关的项添加到列表视图中
                  break;
           }




    本文转自 张宇 51CTO博客,原文链接:http://blog.51cto.com/zhangyu/33861,如需转载请自行联系原作者
    展开全文
  • Split.js是一款可调节大小的拆分视图面板纯JavaScript插件。该插件的特点是轻量级,无需任何外部依赖。Split.js可以轻松的制作出拆分视图(或分割面板)效果。
  • MFC拆分视图.rar

    2009-09-17 15:55:23
    VC++6.0下做的SDI视图拆分。。。。。。。。。
  • Split.js是一款可调节大小的拆分视图面板纯JavaScript插件。该插件的特点是轻量级,无需任何外部依赖。Split.js可以轻松的制作出拆分视图(或分割面板)效果。
  • NGSplitMenuController:菜单驱动的拆分视图控制器
  • 一个拆分视图控制器,可以在同一屏幕上最多显示三个视图控制器。 TOSplitViewController是一个很“轻”重执行的UISplitViewController 。 在大多数情况下,它的行为类似于UISplitViewController ,但能够在一些较...
  • 但文档程序,利用CSplitterWnd类进行拆分成2个窗格。在每个窗格中关联视图,并实现视图间的通信。
  • SplitFix.js是一种苗条的,高性能的ES6模块,可实现拆分视图固定效果。 你可以看到一个演示 安装 npm install splitfix.js或dist.min.js上面包含dist.min.js 例子 SplitFix对您的网站布局进行了一些快速假设。 您...
  • SwiftUI动态水平/垂直拆分视图 :large_blue_diamond: 要求 :check_mark_button: macOS 10.15以上 :check_mark_button: Xcode 11.0 :check_mark_button: 迅捷5+ :check_mark_button: iOS 13以上 :check_mark_button...
  • 要实现比模块级别下更具体的视图函数的拆分,例如在用Flask制作REST API时版本号下根据不同业务对象的函数拆分时,我们就需要自定义一个跟蓝图功能相同的模块。在这里,为了体现它跟蓝图的异曲同工之妙,我们将它...

    蓝图是模块级别的拆分,它不是设计来让你拆分试图函数的。要实现比模块级别下更具体的视图函数的拆分,例如在用Flask制作REST API时版本号下根据不同业务对象的函数拆分时,我们就需要自定义一个跟蓝图功能相同的模块。在这里,为了体现它跟蓝图的异曲同工之妙,我们将它命名为红图!

    我们这里将示范上述场景中红图对象的制作。假设在v1版本的api中,有资源user, book等,我们希望对于每个资源对应的CURD方法分别放在各自的py文件中,如图所示:

    我的文件结构是 app/api/v1/redpoint。

    就像我们实例化蓝图对象一样,我们首先实例化我们的红图对象,虽然它暂时还未被定义,但我们会在后面补充它。我们分别在book.py和user.py里创建实例api:

    # book.py
    
    api = Redprint('book')
    # user.py
    
    api = Redprint('user')

    对了,在使用我们的红图对象前别忘了先注册蓝图对象,因为我们同样需要将红图对象注册到蓝图上,就像蓝图注册到核心对象app上一样,在这里我就不演示在创建核心对象app工厂函数中注册蓝图的步骤了,但千万别忘了这一步哦。在蓝图v1/__init__.py中,在实例化蓝图对象后,注册红图:

    from app.api.v1 import user, book
    
    def create_blueprint_v1():  
    bp_v1 = Blueprint(‘v1’,__name__)
    user.api.register(bp_v1, url_prefix=’/user’) # 红图向蓝图的注册 
    book.api.register(bp_v1, url_prefix=’/book’)
    return bp_v1

    这个register方法将是我们稍后自定义的红图注册方法,它的实现方式主要参考蓝图的注册函数register_blueprint。

    实现Redpoint

    接下来我们便可以着手来编写Redpoint的具体实现方法了。试想一下,我们使用蓝图时都用到了哪些相关方法,除了上述的register,还有路由装饰器中的“.route”方法。我们定义:

    class Redprint:
        def __init__(self, name):  
            self.name = name
            pass
    
        
        def route(self):
            pass
    
        
        def register(self):
            pass

    首先我们能想到的是,对于实例方法名字肯定是要传的。接下来怎么写呢?既然我们要参考蓝图的实现方式,那就Ctrl看看源码它对于接下来两个函数的实现,这是蓝图的route方法:

        def route(self, rule, **options):
            def decorator(f):
                endpoint = options.pop("endpoint", f.__name__)
                self.add_url_rule(rule, endpoint, f, **options)
                return f
            return decorator

    如果你对Flask的路由机制有所了解,你就知道它路由的实现其实就是内部调用了add_url_rule方法。它的参数”rule“就是我们装饰器中定义的url;就是我们定义的方法,也就是装饰器所作用的方法;endpoint照抄不误;**options是一系列关键字参数,例如methods。总的来说,route这个装饰器做的就是接收了一组参数并且调用了add_url_rule方法完成视图函数向蓝图的注册。我们要实现将红图的route代替蓝图的route,就需要在我们的Redprint里需要把我们的视图函数注册到蓝图里去,因为要传参f嘛,实现形式我们通过模仿蓝图得到:

    class Redprint:
        def __init__(self, name):
            self.name = name
            self.mound = []  # 把参数记录下来
            pass
    
        def route(self, endpoint, f, **options):
            def decorator(f):
                self.mound.append((f, rule, options))  # self是蓝图对象,以元组形式添加到列表中
                return f
            return decorator
    
        def register(self)
            pass

    在蓝图的路由装饰器里,实例方法调用了本身的蓝图对象,我们红图里面又如何拿到蓝图对象呢?我们的思路是先把参数记录下来,在后面的代码编写里,总会有一个地方是可以遇到蓝图对象的。我们把这个记录存储在self.mound列表中,我们要添加到的列表中的元素有三个f、rule和options,这里用元组来概括它们。还有一点,这里self.mound为什么是列表呢,因为我们不仅仅需要保存一个视图函数的信息。

    接着我们自己来实现红图的register方法:

    def register(self, bp, url_prefix=None):
            if url_prefix is None:
                url_prefix = ‘/’ + self.name
            for f, rule, options in self.mound:  # 将每个元组里的元素进行序列解包
                endpoint = options.pop(“endpoint”, f.__name__)
            bp.add_url_rule(url_prefix + rule, endpoint, f, **options) 

    该方法代替源代码中蓝图对象调用add_url_rule的注册方法。这里第一个参数是蓝图对象,第二个参数是url前缀,默认为None,在这个方法的中,我们能够得到蓝图对象,那么我们就可以在register方法里实现route装饰器的注册过程了。现在我们可以大胆放心的按照源码里的路由书写了。

    options是一个字典,字典的pop()方法是取到某一个值并把原来字典里的值删除, f.__name__为它的默认值,因为options里并不一定有一个名为endpoint的键的值,当有endpoint时取endpoint的值,如果没有,取该函数的名字作为endpoint的名。

    简化url结构

    在下述app/api/v1/__init__.py定义蓝图bp_v1的这里,url_prefix显得颇为冗长。

    from app.api.v1 import user, book
    
    def create_blueprint_v1():
        bp_v1 = Blueprint(‘v1’,__name__)
        user.api.register(bp_v1, url_prefix=’/user’) 
        book.api.register(bp_v1, url_prefix=’/book’)
        return bp_v1

    我们注册的红图对象名跟前缀名相同,我们决定把这两者结合一下以达到简洁的目的。在注册路由的方法里内部添加一个条件判断:

    if url_prefix is None:
        url_prefix = ‘/’ + self.name

    这样就可以去掉注册蓝图的url_prefix了。

    展开全文
  • CSplitterWnd 实现单文档拆分视图

    千次阅读 2013-06-02 20:27:48
    MFC支持两种类型的拆分窗口:静态的和动态的。这里只探讨静态拆分,不过首先还是要熟悉一下这些概念。 静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。但是用户可以缩放各行各列。一个静态...

    MFC支持两种类型的拆分窗口:静态的和动态的。这里只探讨静态拆分,不过首先还是要熟悉一下这些概念。

    静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。但是用户可以缩放各行各列。一个静态拆分窗口最多可以包含16行16列。要找一个使用了静态拆分窗口的应用程序,只要看一下windows管理器即可。

    动态拆分窗口最多可以有两行两列,但它们可以相互拆分和合并。Vc就使用了动态拆分窗口使得可以同时编辑源程序文件的两个以上不同的部分。

    选择静态或动态拆分的一个准则是是否希望用户能够交互地修改拆分窗口的行列配置。另一个决定因素是计划在拆分窗口中使用的视图种类。在静态拆分窗口中很容易使用两个以上不同种类的视图,因为您可以在每个窗格中指定所用的视图类型。但是在动态拆分窗口中,MFC管理着视图,除非从 CsplitterWnd派生一个新类并修改拆分窗口的默认操作性能,否则拆分窗口中的所有视图使用的都是相同的视图类。

    静态拆分窗口是用CsplitterWnd::CreateStatic而不是CsplitterWnd::Create创建,并且由于MFC不会自动创建静态拆分窗口中显示的视图,所以您要亲自在CreateStatic返回之后创建视图。CsplitterWnd为此提供了名为 CreateView的函数。给框架窗口添加静态拆分视图的过程如下:

    给框架窗口类添加一个CsplitterWnd数据成员。

    覆盖框架窗口的OnCreateClient函数,并调用CsplitterWnd::CreateStatic来创建静态拆分视图。

    使用CsplitterWnd:: CreateView在每个静态拆分窗口的窗格中创建视图。

    使用静态拆分窗口的一个优点是由于您自己给窗格添加视图,所以可以控制放入视图的种类。
    下列中创建的静态拆分窗口包含了两种不同的视图:

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CcreateContext* pContext)
    {
    if(!m_wndSplitter.CreateStatic(this, 1, 2) ||
    !m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CtextView), Csize(128, 0), pContext) ||
    !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CpictureView), Csize(0, 0),pContext) )
    return FALSE;
    return TRUE;
    }

    传递给CreateStatic的参数指定了拆分窗口的父亲以及拆分窗口包含的行列数。对每个窗格调用一次CreateView。用从0开始的行列编号来标示窗格。在上面的代码中,第一次调用CreateView在左窗格(0行0列)中加入类型为CtextView的视图,第二次调用在右窗格(0行 1列)加入类型为CpictureView的视图。传递给CreateView的Csize对象指定了窗格的初始尺寸。在上面的代码中,CtextView窗格的初始宽度为128象素,CpictureView窗格将占据剩余的窗口宽度。指定右窗格宽度的值和指定两个窗格高度的值都是 0,这是因为主结构会忽略它们。

    下面以一个单文档程序为例,说明静态拆分视图的实现过程:

    1. 首先建立一个单文档应用程序SplitWnd,视图CSplitWndView类型为列表视图。利用 CSplitWndView ::OnInitialUpdate初始化列表视图。

    2. 为该工程新增一个树型视图类CMyTreeView,并在该类中添加HTREEITEM类型的成员变量 m_hSubTree[2],该成员变量用来保存树型视图的子树句柄。利用CMyTreeView ::OnInitialUpdate初始化树型视图,为该树型视图添加一个树根,两个子树,参考代码如下:

    HTREEITEM hRoot = GetTreeCtrl().InsertItem(_T("树根"), 。。。, 。。。, TVI_ROOT);

    m_hSubTree[0] = GetTreeCtrl().InsertItem(_T("子树1"), 。。。, 。。。, hRoot);

    m_hSubTree [1] = GetTreeCtrl().InsertItem(_T("子树2"), 。。。, 。。。, hRoot);

    在框架类中添加一个CSplitterWnd 类型的成员变量m_wndSplitter1,并重载OnCreateClient函数来拆分视图,代码如下:

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    if(!(m_wndSplitter1.CreateStatic(this, 1, 2) ) ||

                  !(m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(CSplitWndView), CSize(0,0), pContext) ) ||

                  !(m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(180 ,0), pContext) ) )

           {
                  return FALSE;
           }
          return TRUE;
    }

    如果你设计的程序需要更多的拆分视图,可以再在框架类中添加CSplitterWnd 类型的成员变量m_wndSplitter2,再次利用CreateStatic拆分视图,代码如下:

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    if(!(m_wndSplitter1.CreateStatic(this, 2, 1) ) ||

                  !(m_wndSplitter1.CreateView(1, 0, RUNTIME_CLASS(CMyListView), CSize(0,0), pContext) ) ||

                  !(m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,0)) ) ||

                  !(m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(180 ,0), pContext) ) ||

                  !(m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CSplitWndView), CSize(0,0), pContext) )
           )

    {
                  return FALSE;
           }

           m_wndSplitter1.SetRowInfo(0, 350, 0); //重新设置行宽
           m_wndSplitter1.RecalcLayout();
           return TRUE;
    }

    现在基本的界面就建立好了,有关初始化列表视图的代码要根据具体情况来添加。另外,别忘记在框架.cpp中包含视图类的头文件。
    当你在CMainFrame中加入 #include "CSplitWndView.h"可能会报错
    error C2143: syntax error   : missing ';' before '*'
    error C2501: 'CSplitWndDoc' : missing storage-class or type specifiers
    error C2501: 'GetDocument' : missing storage-class or type specifiers
    因为我要在CChildFrame的onCreateClient中创建窗口的静态分割。
    最后的解决方法是:
    是在自己要使用的View类的.h文件中加入下面一句声明:
    class CSplitWndDoc;

     

    为了视类之间的通讯,我们让这些视类共用一个文档类,现在来编写视图之间通讯的代码:

    1.在文档类中添加int m_nViewType,表示要显示的类型。当用户单击“子树1”或“子树2”时改变其值。

    2.建立树型视图通知TVN_SELCHANGED响应函数OnSelchanged,添加如下代码:

    CSplitWndDoc* m_pDoc = (CSplitWndDoc*)GetDocument();

    HTREEITEM hTmp = GetTreeCtrl().GetSelectedItem(); //得到当前选中的子树句柄


    //将m_pDoc->m_nViewType复位

    m_pDoc->m_nViewType = 1000;

    if(hTmp == m_hSubTree [0] && m_pDoc)
    {
           m_pDoc->m_nViewType = 0;       //将显示类型设置为子树1
    }
    if(hTmp == m_hSubTree [1] && m_pDoc)  
    {
    m_pDoc->m_nViewType = 1; //将显示类型设置为子树2
    }
    //在改变子树的情况下才刷新CSplitWndView视图
    if(hTmp == m_hSubTree [0] || hTmp == m_hSubTree [1] && m_pDoc)
    {
           //通知视图更新CSplitWndView
           m_pDoc->UpdateAllViews(this);
    }

    3.在CSplitWndView中重载OnUpdate函数,响应UpdateAllViews。
    CSplitWndDoc* pDoc = GetDocument();
    GetListCtrl().DeleteAllItems();            //删除列表视图中的项
           switch(pDoc->m_nViewType)        //查看视图类型
           {
           case 0:
                  //将与子树1相关的项添加到列表视图中
                  break;
           case 1:
                  //将与子树2相关的项添加到列表视图中
                  break;
           }

     

    展开全文
  • 新版本添加了许多其他选项来控制音符的显示,功能十分不错,下面让小编为大家讲解一下Nisus Writer Pro拆分视图和注释的技巧吧!拆分视图同时编辑多个位置显示文档的两个或多个部分以进行同步编辑,或在查阅其他部分...
  • VC 单文拆分三个视图

    2011-07-22 11:20:39
    VC单文拆分视图,拆分为二行二列,三个视图
  • [cpp] view plaincopy // View.h  CSplitterWnd m_wndSplitter;  BOOL m_bSplitter; // 初始化为FALSE    // View.cpp  int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct)...{
  • MFC拆分窗口视图切换

    热门讨论 2009-04-30 18:32:43
    创建好静态的拆分视图窗口后,就可能需要通过在左边的区域来实施右边区域的视图切换,来显示不同的操作界面.
  • web developer tips (3):设置垂直拆分视图

    千次阅读 2009-06-05 01:06:00
    原文链接:Split View could be set vertically in VS 2008拆分视图是Visual Studio 2008 中除现有的“设计视图”和“源试图”外新的视图选项。在拆分割视图的情况下,可以打开源视图和设计视图并排排列,这将更容易...
  • 除了设计视图 Design View 与 原视图 Source View,VisualStudio 2008 还新增了一个拆分视图 Split View。选择了拆分视图,您可以同时查看 HTML 视图(原视图)与设计视图,这使您能够方便查看 HTML 代码更改如何...
  • SplitViewDragAndDrop 实现在一个拆分视图模式中通过拖拽来在彼此之间传递数据
  • vs设计视图和代码视图拆分Mac OS X 10.11, El Capitan ushers in a whole slew of new features, chief among them is split-view windows management. Yes, that’s right, OS X finally gives you the ability to ...
  • 可调整大小的拆分视图的非标准实用程序。 零延迟 微小:每个压缩后的1-2kb之间。 快速:没有开销或附加的窗口事件侦听器,使用纯CSS调整大小。 无限制:仅计算视图大小。 其他一切都取决于您。 两个实用程序: ...
  • CSplitterWnd 单文档拆分视图

    千次阅读 2011-12-10 20:51:28
    简单例子:  1.... ... 2.... BOOL CMainFrame::...创建三个视图CMyListView、CMyTreeView、CMyTextView。   最后生成如下图所示:                                        
  • Splitter是一个React组件,允许您将视图拆分为可调整大小的面板。 例如,类似于Visual Studio Code中的选项卡。 它在 (面向开发人员的搜索引擎)中使用。 这是您可以使用Splitter构建的gif图像: Splitter受到...
  • 本节书摘来自异步社区《Adobe Dreamweaver CC经典...1.2 切换和拆分视图 Dreamweaver分别为编码员和设计人员提供了专用的环境,还提供了一个把这二者混合在一起的复合选项。 1.2.1 “设计”视图“设计”视图在Dr...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,674
精华内容 19,069
关键字:

拆分视图的作用是什么