科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件例程分析窗口的切分和动态改变

例程分析窗口的切分和动态改变

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们在VC编程环境中可以发现,在一个界面上开启多个窗口是非常方便的

作者:bull77 来源:yesky 2007年11月16日

关键字: 分析 窗口 切分 动态改变

  • 评论
  • 分享微博
  • 分享邮件
大多数情况下与文档相连的视只有一个。我们在VC编程环境中可以发现,在一个界面上开启多个窗口是非常方便的。我们可以让一个窗口控制视的显示,另一个窗口具体显示。应用框架有若干种方式表示多视,这些方式包括切分窗口和MDI子窗口。切分窗口看上去像是一种特殊的框架窗口,在各个窗片中包含了若干个视。应用程序在创建的时候就可以对窗口进行划分,也可以通过选择菜单命令或拖动切分窗口滚动条中的切分框对窗口进行划分。窗口被切分之后,用户可以通过鼠标移动来调整窗片的相对尺寸。切分窗口即适用于SDI应用程序又适用于MDI应用程序。

  切分窗口是通过类CSplitterWnd来实现的。对Windows来说,CSplitterWnd是一个真正的窗口,它完全占据了框架窗口的用户区域,而视窗则占据了切分窗口的窗片区域。切分窗口不参与命令传递机制

  切分窗口有动态切分和静态切分两种方式。动态切分窗口允许用户在任何时候都对窗口进行切分,即可以通过选择菜单项来对窗口进行切分,也可以通过滚动条中的切分框对窗口进行切分。动态切分窗口中的窗片通常使用的是同一个视类。当切分窗口被创建时,左上窗片通常被初始化成一个特殊的视。在动态切分窗口中,滚动条在视中是被共用的。例如,在只进行了一次水平切分的窗口中,底滚动条同时控制着上下两个视。对于静态切分窗口,当窗口被第一次创建时,窗片就已经被切分好了,用户可以移动窗棱,但此时已不可能对窗口进行合并或再次切分。静态切分窗口允许使用多个视类,并且可在创建时对这些视类进行配置。在静态切分窗口中,每个窗片都有自己的滚动条。为了使一静态分割窗口拥有滚动条,可以把WS_HSCROLL和WS_VSCROLL风格加到dwStyle上。

  下面就一个例子对静态切分进行详细说明。

  第一步:建立一个基于单视窗的工程test。所有都取默认值。

  第二步:在类CmainFrame中重载虚函数OnCreateClient,生成虚函数

virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);

   在类CmainFrame中定义变量CSplitterWnd m_wndSplitter;

  第三步:生成一个CformView类。分析如下:CformView类是一个非常有用的类,具有许多无模式对话框的特点。象Cdialog派生类一样,CformView的派生类也与相应的对话框资源相联系。对话框资源中定义了格式视的框架特性,并且列举出了它所包含的所有的控件。CformView类也支持DDX和DDV。用定义一个对话框来生成一个CformView类,此对话框要作如下设置:

style=Child
Border=None
Visible=不选中

  定义一个对话框,其属性按上述要求设置。定义其对应的类Cview1,基类为CformView。在其中设置一个按钮IDD_BUTTON1,IDC_BUTTON2,IDC_BUTTON3。同样的方式添加Cview2。

  第四步:在OnCreateClient中添加如下代码:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
 BOOL ret=m_wndSplitter.CreateStatic(this,3,1);
 ret|=m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CTestView),CSize(100,100),pContext);
 ret|=m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,200),pCon text);
 ret|=m_wndSplitter.CreateView(2,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext);
 return ret;
}

  此时,即可以产生多个视的窗口。

  第五步:添加功能函数。实现在Cview1中点击Button1实现在视中画图,编写函数如下:

void CView1::OnButton1()
{
 file://得到一SplitterView的指针
 CTestView*   pView=(CTestView*)(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.GetPane(1,0));
 file://定义View的DC
 CClientDC dc(pView);
 dc.MoveTo(10,10);
 dc.LineTo(10,100);
 dc.TextOut(10,10,"guanximing");
}

  第六步;实现某一窗片的尺寸变化。定义函数如下:

void CView1::OnButton2()
{
(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.SetRowInfo(0,4,0));
(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.RecalcLayout());
}

  第七步:实现通过键盘对切分窗口进行尺寸改变,这种方法对窗片的尺寸改变很方便。编写代码如下:

void CView1::OnButton3()
{
(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.DoKeyboardSplit());
}

  好了,现在功能都实现了,试一下吧。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章