使用VC实现窗口的任意分割 南京邮政局计算机中心 张中庆 一关于CSplitterWnd类 我们在使用CuteFtp或者NetAnt等工具的时候一般都会被其复杂的界面所吸引在这些界面中窗口被分割为若干的区域真正做到了窗口的任意分割 那么我们自己如何创建类似的界面也实现窗口的任意的分割呢 ?在VC中这就需要使用到CSplitterWnd类CSplitterWnd看上去像是一种特殊的框架窗口每个窗口都被相同的或者不同的视图所填充当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸虽然VC支持从AppWizard中创建分割窗口但是自动加入的分割条总是不能让我们满意因此我们还是通过手工增加代码来熟悉这个类 CSplitterWnd的构造函数主要包括下面三个 BOOL Create(CWnd* pParentWndint nMaxRowsint nMaxColsSIZE sizeMinCCreateContext* pContextDWORD dwStyleUINT nID); 功能描述该函数用来创建动态切分窗口 参数含义pParentWnd 切分窗口的父框架窗口 nMaxRowsnMaxCols是创建的最大的列数和行数 sizeMin是窗格的现实大小 pContext 大多数情况下传给父窗口 nID是字窗口的ID号BOOL CreateStatic(CWnd* pParentWndint nRowsint nColsDWORD dwStyleUINT nID) 功能描述用来创建切分窗口 参数含义同上BOOL CreateView (int rowint colCruntimeClass* pViewClassSIZE sizeinitCcreateContext* pContext); 功能描述为静态切分的窗口的网格填充视图在将视图于切分窗口联系在一起的时候必 须先将切分窗口创建好 参数含义同上 从CSplitterWnd源程序可以看出不管是使用动态创建Create还是使用静态创建CreateStatic在函数中都调用了一个保护函数CreateCommon从下面的CreateCommon函数中的关键代码可以看出创建CSplitterWnd的实质是创建了一系列的MDI子窗口 DWORD dwCreateStyle = dwStyle & ~(WS_HSCROLL|WS_VSCROLL);if (afxDatabWin) dwCreateStyle &= ~WS_BORDER; //create with the same wndclass as MDIFrame (no erase bkgnd) if (!CreateEx( _afxWndMDIFrame NULL dwCreateStyle pParentWnd>m_hWnd (HMENU)nID NULL)) return FALSE; // create invisible 二创建嵌套分割窗口 创建动态分割窗口 动态分割窗口使用Create方法下面的代码将创建x的窗格 m_wndSplitterCreate(thisCSize()pContext); 但是动态创建的分割窗口的窗格数目不能超过x而且对于所有的窗格都必须共享同一个视图所受的限制也比较多因此我们不将动态创建作为重点我们的主要精力放在静态分割窗口的创建上 创建静态分割窗口 与动态创建相比静态创建的代码要简单许多而且可以最多创建x的窗格不同的窗格我们可以使用CreateView填充不同的视图 在这里我们将创建CuteFtp的窗口分割CuteFtp的分割情况如下CCuteFTPView CView CView |