返回首页


{S0}简介
当我对应用程序的工作,我意识到它需要一个静态分离器的能力,同时隐藏/显示几行或列。令人惊讶的是,我找不到这样的组件。最接近的解决方案,提出了奥列格Galkin http://www.codeguru.com/splitter/show_hide_static_panes.shtml。他分配器可以隐藏/显示拆分行(列),但只有一个。一个静态建议在此分路器是隐藏/显示多个列/行的能力文章。算法扩展的问题
MFC的CSplitterWnd的访问ID其窗格和ID定义窗格的位置在分离器。假设n是列被隐藏。在奥列格Galkin算法,列ñ得到的最后一列编号。以下n列被转移 1左侧,即N - 1控制的ID分配给控制N,N 2的ID分配给N 1,尝试扩展这种方法为多列隐藏导致过于复杂的算法。每当你隐藏列,IDS在以前的操作中隐藏的列再次改变。所以,如果你隐藏了三个列,一些控件的ID改变了三次。这是一个不平凡的问题跟踪所有这些变化。新方法
CExtSplitter类使用绝对和相对地址与分离器窗格。绝对列地址是一个初始列数量和相对地址是在分离器的当前列号。HideColumn和ShowColumn公共职能工作绝对地址。内部使用相对地址。 CExtSplitter级的扑救指针到内部数组中的所有控件。数组初始化一旦当分路器是创建和不改变在分配器存在。这个数组的行和列是用来访问分路器窗格绝对编号。如果分配器m行n列,然后被初始化隐藏列K(0 LT; LT,N),是指隐藏的列柱K最初。注意几个隐藏操作后,柱K可以在分离器出现在任何位置低于K.实施细节
CExtSplitter类的显示和隐藏的列清单。 "列表成员的值是一个绝对列地址的位置,而相对列地址。

class CExtSplitter : public CSplitterWnd

{

public:

    typedef std::list < int > LIST_INT;



    CExtSplitter();   



    virtual  CExtSplitter();



    BOOL CreateStatic(CWnd* pParentWnd,

        int nRows, int nCols,

        DWORD dwStyle = WS_CHILD | WS_VISIBLE,

        UINT nID = AFX_IDW_PANE_FIRST);



    virtual BOOL CreateView( int row, int col, 

        CRuntimeClass* pViewClass, SIZE sizeInit,

        CCreateContext* pContext );



    void    HideColumn(int colHide);

    void    ShowColumn(int colShow);

    void    HideRow(int colRow);

    void    ShowRow(int row);



public: 

    LIST_INT m_shown_cols;      //shown  column list

    LIST_INT m_hid_cols;        //hidden column list

    LIST_INT m_shown_rows;      //shown  rows list

    LIST_INT m_hid_rows;        //hidden rows list



protected:

    //array of pointers to splitter panes

    C2DArray m_pane_ptr_array;  

};


功能HideColumn移动显​​示的列清单列隐藏的列和重新且具分离器窗格的列表。 C代码重新记数的规则如下所示{C}
RelToAbsPosition功能改造相对窗格位置的绝对窗格位置。示范项目
在演示项目,你可以调用的隐藏和显示功能通过"; Viewquot;子菜单。 CExtSplitter类取决于C2DArray这是包含到项目中。|亚历山大库兹明

回答

评论会员:游客 时间:2011/11/29
您好,我只需要单个文档的多个视图上运行时,意味着第一个应用程序应显示一个空文件,然后选择要显示的意见没有意见anyno是可能的。以同样的方式,我需要删除视图的功能。关于阿贾伊kumar.ajay.thakur@gmail.com
srikadi
评论会员:游客 时间:2011/11/29
您好,请帮我创造4次使用splitterwnd。我有1左窗格中,右键pane.agian我需要分成3窗格右窗格中。,plz帮助我..提前thanx..
斯特凡温古雷亚努
评论会员:游客 时间:2011/11/29
------启动生成:项目:MSP,配置:发行的Win32------{BR}编译...StdAfx.cppWINVER不定义。默认为0x0502(WindowsServer2003的)编译...Msp.cppD:\devtemp\MSP\2DArray.h(20):错误C4430:缺少类型说明符-假定为int。注意:C不支持默认intD:\devtemp\MSP\2DArray.h(20):警告C4183:"初始化":缺少返回类型;假设一个成员函数返回"int"的MainFrm.cppD:\devtemp\MSP\2DArray.h(20):错误C4430:缺少类型说明符-假定为int。注意:C不支持默认intD:\devtemp\MSP\2DArray.h(20):警告C4183:"初始化":缺少返回类型;假设一个成员函数返回"int"的\MainFrm.cpp(149):错误C2065:"我":未声明的标识符ExtSplitter.cppD:\devtemp\MSP\2DArray.h(20):错误C4430:缺少类型说明符-假定为int。注意:C不支持默认intD:\devtemp\MSP\2DArray.h(20):警告C4183:"初始化":缺少返回类型;假设一个成员函数返回"int"的。\ExtSplitter.cpp(202):警告C4018:"安德烈亚斯
Oreille
评论会员:游客 时间:2011/11/29
嵌套分配器有一个问题,当使用这个类:创建一个静态nesteed分配器时,它会不会被添加到m_pane_ptr_array,和,显然,它崩溃。一种方式来解决这个类添加新的方法,并调用它后立即创建嵌套分割。布尔CExtSplitter:AddPane(INT行,列){的CWnd*pWnd=GetPane(行,列)ASSERT(pWnd) m_pane_ptr_array(行,列)=pWnd; 返回TRUE;} m_nestedSplitter.CreateStatic(m_masterSplitter,1,2,WS_CHILD|WS_VISIBLE|WS_BORDER,m_masterSplitter.IdFromRowCol(2,0))m_masterSplitter.AddPane(2,0);否则,它工作得很好。感谢。
niallmack
评论会员:游客 时间:2011/11/29
演示的发行版本可以运行,水湿运行调试版本,但你可以在程序中使用它,它可以很好的工作。
Repsej
评论会员:游客 时间:2011/11/29
您好,我新的VC和分割窗口。我需要在PPC上了类似的功能,您的代码不正是我所需要的。我在我的要求如下specfic方式的逻辑。它仍然是在原油的形式。我需要显示在拆分窗口现有的5张/列,我的任何一个。出现的问题是,出现任何两​​个窗格之间的分隔栏没有得到清除。一个分隔栏出现在屏幕上的极右势力。我该如何摆脱?添加到我现有的代码,我需要什么。我将不胜感激尽快得到答复。在此先感谢。使用的代码如下:BOOL的CMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){BOOLbCreateSpltr=m_pSplitterWnd.CreateStatic(,1,5,WS_CHILD|WS_VISIBLE|WS_BORDER,AFX_IDW_PANE_FIRST);m_pSplitterWnd.CreateView(0,0,RUNTIME_CLASS(CSoftcorderAlbumView),CSIZE(240270),pContext); /*pWnd是CWnd的一个数组(*)------它是一个大型机类的成员变量*/pWnd[0]=m_pSplitterWnd.GetPane(0,0);m_pSplitterWnd.CreateView(0,1,RUNTIME_CLASS(CFeaturesDlgView),CSIZE(240270),pContext);pWnd[1]=m_pSplitterWnd.GetPane(0,1);m_pSplitterWnd.CreateView(0,2,RUNTIME_CLASS(CFOpenThumbnailView),CSIZE(240270),pContext)pWnd[2]=m_pSplitterWnd.GetPane(0,2);m_pSplitterWnd.CreateView(0,3,RUNTIME_CLASS(CImageView),CSIZE(240270),pContext)pWnd[3]=m_pSplitterWnd.GetPane(0,3);m_pSplitterWnd.CreateView(0,4,RUNTIME_CLASS(CImageEditorView),CSIZE(240270),pContext)pWnd[4]=m_pSplitterWnd.GetPane(0,4);ShowOnlyColumn(4);m_pSplitterWnd.RecalcLayout()返回bCreateSpltr;//返回CFrameWnd的::OnCreateClient(lpcs,pContext)}无效的CMainFrame::ShowOnlyColumn(INTcolNum){INTcolCtr,idColIdx,nMaxCols=5,身份证;(colCtr=0,idColIdx=1;colCtrSetDlgCtrlID(ID);pWnd[colNum]-的ShowWindow(SW_SHOW);继续;}ID=AFX_IDW_PANE_FIRST0*16idColIdx;pWnd[colCtr]-SetDlgCtrlID(ID)pWnd[colCtr]-的ShowWindow(SW_HIDE);idColIdx;//m_pSplitterWnd.RecalcLayout()}}
cmd673
评论会员:游客 时间:2011/11/29
,本文帮助解决一个错误,我在几个星期了。(试图从一个我已经实施了另一个布局的目的完全不同的看法splitterview)我想一个propertysheet实施的意见之一,我似乎无法得到它的工作。我试图从地面向上第13章到MFC类似的代码,resizeable形式查看SDI在另一篇文章,但没有成功。有任何意见,将不胜感激,我什至没有能够创建propertysheet。
Davidi
评论会员:游客 时间:2011/11/29
我有一个关于这个ID算法不好的感觉。CSplitterWnd的自身IdFromRowCol(),该算法有云:ID=AFX_IDW_PANE_FIRST行*16COL几篇文章在CodeProject提供分配器显示/隐藏父分离器内的窗格像http://www.codeproject.com/splitter/st_splitterwnd.asp。但是如何处理ID的这里?该算法没有意义了..它是确定以提供独特的随机ID的窗格AFX_IDW_PANE_FIRST范围,如何妥善处理?感谢你有何评论("任何"imgsrc=http://www.orcode.com/upimg/2011_11_29_03_36_15_1.gif)加斯帕
马克Ruzon
评论会员:游客 时间:2011/11/29
你在HideRow断言()越野车。它看起来像他们HideCol()不正确地复制和修改。应改为"COLS"变量"行"的变量下面是我纠正的assert语句:无效CExtSplitter:HideRow(INTrowHide){ASSERT_VALID(本);断言(m_nRows1)ASSERT(rowHidem_nMaxRows)