{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这是包含到项目中。|亚历山大库兹明