windows编程 12文档与视图(6)

2019-05-18 17:37

则MFC会在主(SDI)或子(MDI)框架窗口类的头文件中,自动添加成员变量:

// 属性 protected:

CSplitterWnd m_wndSplitter;

和重写型消息响应成员函数:

// 重写 public:

virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs,

CCreateContext* pContext);

在框架窗口类的代码文件中,自动添加该函数的函数体:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, }

其中,默认的最大窗格数为2×2 = 4,默认的最小窗格大小为10×10。这些都可以手工进行调整和修改,例如将窗格的行列数改为“2, 1,”,则最多只能创建2×1 = 2个(上下垂直划分的)窗格。

MFC还会在程序的“视图”菜单中自动添加“拆分”菜单项,用户选中该菜单项后,就可以用鼠标动态确定窗格数目和大小。

2)例子

为了说明动态拆分窗口的具体步骤和应用,我们创建一个名为DSplit的带滚动视图的传统SDI MFC应用程序。设置其滚动窗口的总体大小为2000×2000,并在窗口四角输出表示当前位置的文本串。

具体步骤为:

? 创建一个名为DSplit的带滚动视图的传统单文档MFC应用程序,注意:

? 在“MFC应用程序向导”对话框中的“用户界面功能”页中,选中“拆分窗

口”多选框,参见图12-18。

26

CCreateContext* pContext) { return m_wndSplitter.Create(this,

2, 2, // TODO: 调整行数和列数 CSize(10, 10), // TODO: 调整最小窗格大小 pContext);

? 在“生成的类”页中,将视图类CDSplitView的基类,改为CScrollView,参

见图12-22。

图12-22 修改视图类的基类为“CScrollView”

? 在视图类的初始化函数OnInitialUpdate中,将原来100×100的滚动窗口的整体大

小修改为2000×2000:

void CDSplitView::OnInitialUpdate() { }

? 在视图类的OnDraw函数体中,去掉输入参数中的“/*”和“*/”,并添加若干文本

输出语句:

void CDSplitView::OnDraw(CDC* pDC) {

CScrollView::OnInitialUpdate(); CSize sizeTotal;

// TODO: 计算此视图的合计大小

sizeTotal.cx = sizeTotal.cy = 2000; SetScrollSizes(MM_TEXT, sizeTotal);

CDSplitDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return;

// TODO: 在此处为本机数据添加绘制代码

27

}

// 默认为“TA_LEFT | TA_TOP”

pDC->TextOut(10, 10, L\这是窗口左上角\pDC->SetTextAlign(TA_BOTTOM);

pDC->TextOut(10, 1990, L\这是窗口左下角\pDC->SetTextAlign(TA_RIGHT);

pDC->TextOut(1990, 10, L\这是窗口右上角\pDC->SetTextAlign(TA_BOTTOM | TA_RIGHT); pDC->TextOut(1990, 1990, L\这是窗口右下角\

? 编译、连接、运行该程序

开始时,只有一个窗格,参见图12-23 a);选择“视图”菜单中的“拆分”菜单项,参见图12-23 b);用鼠标动态设置窗格的数目和大小,参见图12-23 c);滚动各个窗格(上窗格到顶、下窗格到底、左窗格到左端、右窗格到右端),就可以同时看到位于窗口四角的4个文本串,参见图12-23 d)。

a)

b)

c)

d)

图12-23 拆分窗口例

28

3.静态拆分

静态拆分指拆分窗格的数量从一开始就是固定的,不能由用户动态改变。在静态拆分的情形下,每个窗格可以对应不同的视图类。因此,这种拆分主要用于,对同一个文档的不同显示方式的多视。

例如,对于一个图片文件,可以在一个窗格显示图片,在另一个窗格显示文件的二进制内容。又例如,对一个数值数据文件,可以在一个窗格显示数据表格,在另一个窗格显示数据所对应的图形(如曲线、条状图或饼图)。

1)使用方法

为了实现静态多视,可以在(SDI的主 / MDI的子)框架窗口类中定义一个CSplitterWnd对象的类变量,例如:

CSplitterWnd m_wndSplitter;

然后为框架窗口类添加(重写型)消息响应函数OnCreateClient,在该函数中调用CSplitterWnd 类的CreateStatic和CreateView函数来创建拆分窗口。例如:

m_wndSplitter.CreateStatic(this, 2, 2);

m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMy1View),

CSize(200, 100), pContext);

m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMy2View),

CSize(400, 100), pContext);

m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMy3View),

CSize(200, 200), pContext);

m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CMy4View),

CSize(400, 200), pContext);

return TRUE; // 注意:必须返回TRUE

还需要为项目添加若干新的视图类(从C[Scroll]View派生),并为每个新的视图类添加GetDocument成员函数(包括内联版和调试版),以返回对应的文档类对象。

最后就可以在各个视图类里绘制和输出同一文档数据所对应的不同图形和文本了。 2)例子

编写一个具有拆分窗口的SDI型图像显示程序。文档窗口被垂直拆分成两个窗格,左边窗格显示各向同性(保持原图像的长宽比)的(小)图像,右边窗格显示各向异性(不保

29

持原图像的长宽比)的(大)图像(充满窗格),参见图12-24。图像显示使用CImage类。

图12-24 具有静态拆分窗口的图像显示程序

下面是主要的编程步骤(粗体部分为自己添加的):

(1)创建一个名为SSplit的SDI型传统MFC应用程序,在主框架类中添加拆分窗口类对象的类变量m_wndSplitter:

class CMainFrame : public CFrameWnd { …… // 属性 public: …… }

(2)为主框架窗口类和(重写型)消息响应函数OnCreateClient(注意必须返回TRUE),需要添加对应的头文件包含(不然编译器会找不到相关的视图类):

#include \#include \#include \……

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,

CCreateContext* pContext) {

// TODO: 在此添加专用代码和/或调用基类 m_wndSplitter.CreateStatic(this, 1, 2); CSplitterWnd m_wndSplitter;

30


windows编程 12文档与视图(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:山东省2009届各地期末考试数学(新课标)章节分类试题《数列》(

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: