叉分窗口

 

前段时间弄了个读文件的程序,之前把它差分为了两个窗口:1行2列;今天把第一列又分割成2行。

 

参考的程序为:

以单文档SDI应用程序为例,在框架客户区实现三叉切分窗口,且每个窗格使用不同的视图。

  实现步骤:

  1、 利用VC++6.0 的AppWizard创建一个单文档SDI应用程序,项目名为Test。

  2、 使用New Class对话框添加新的视图类:

  CinfoView 基类为列表视图类ClistView

  CLineView 基类为表单视图类CFormView

  CMyEditView 基类为编辑视图类CEditView

  要点:在添加ClineView之前,需要先创建一个对话模板资源,ID为IDD_FORMVIEW,

  3、在框架窗口类CMainFrame中声明一个CsplitterWnd类的成员变量m_wndSplitter1,用于第一次切分。

  4、 使用ClassWizard为框架窗口类添加OnCreateClient函数。

  注意:OnCreateClient函数的调用在OnCreate函数之后,在构造视图对象和产生视图窗口之前。

  5、在OnCreateClient函数中调用CsplitterWnd::CreateStatic,产生静态切分。该函数的原形如下:

  BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle =

  WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );

  函数有5个参数,意义如下:

  ● pParentWnd:切分窗口的父窗口指针

  ● nRows:水平方向分隔窗口的数目

  ● nCols:垂直方向分隔窗口的数目

  ● dwStyle:切分窗口的风格

  ● nID:子窗口的ID值,默认为系统定义的AFX_IDW_PANE_FIRST

  返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)。

  m_wndSplitter1.CreateStatic(this, 2,1); // 切分为2行1列

  6、 使用CreateView产生每个视图窗口

  virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );

  函数有5个参数,意义如下:

  ● row:窗格的行标,从0开始

  ● col:窗格的列标,从0开始

  ● pViewClass:视图的执行期类CRuntimeClass指针,可以用宏RUNTIME_CLASS获得

  ● sizeInit:一个SIZE(或者CSize)类型的数据,指定窗格的初始大小

  ● pContext:一般是由父窗口传递过来,包含窗口的创建信息

  返回值:如果创建成功,返回非零值(TRUE),否则返回0(FALSE)。

  OnCreateClient函数的全部代码:

 

  BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

  {

  // TODO: Add your specialized code here and/or call the base class

  CRect rect;

  GetClientRect(&rect);

  //产生第一次静态切分

  m_wndSplitter1.CreateStatic(this, //父窗口指针

  2, // 切分的行数

  1); // 切分的列数

  //为第一个窗格产生视图

  m_wndSplitter1.CreateView(0,0, // 窗格的行、列序数

  RUNTIME_CLASS(CTestView),//视图类

  CSize(rect.Width(),rect.Height()-rect.Height()/5),//初始化大小

  pContext);//父窗口的创建参数

  //为第二个窗格产生视图

  m_wndSplitter1.CreateView(1,0,

  RUNTIME_CLASS(CMyEditView),

  CSize(rect.Width(),rect.Height()/5),

  pContext);

  return TRUE;//不再调用基类的OnCreateClient函数

  //return CFrameWnd::OnCreateClient(lpcs, pContext);

  } 

在这里需注意3点:

  ① 必须为每个静态切分窗格创建视图窗口,不能漏掉一个;

  ② 必须包含相应的类的头文件,在MainFrm.cpp文件的开始包含一下头文件:

  #include "TestView.h"

  #include "MyEditView.h"

  ③产生静态切分后,就不能调用默认的基类的OnCreateClient函数。

  7、在视图窗口类CTestView中声明一个CsplitterWnd类的成员变量m_wndSplitter2,用于第二次切分。

  8、使用ClassWizard为视图窗口类CTestView添加OnCreate函数,在该函数中调用CreateStatic函数和CreateView函数,类似CMainFrame::OnCreateClient函数中的调用

  代码如下:

 

  int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

  {

  if (CView::OnCreate(lpCreateStruct) == -1)

  return -1;

  // TODO: Add your specialized creation code here

  CRect rect;

  GetClientRect(&rect);

  //获得窗口的创建信息指针

  CCreateContext *pContext = (CCreateContext*) lpCreateStruct->lpCreateParams;

  //产生二次静态切分

  m_wndSplitter2.CreateStatic(this,1, 2);

  //为第一个窗格产生视图

  m_wndSplitter2.CreateView(0,0,// 窗格的行、列序数

  RUNTIME_CLASS(CLineView),//视图类

  CSize(rect.Width()/4,rect.Height()),//初始化大小

  pContext);//父窗口的创建参数

  //为第二个窗格产生视图

  m_wndSplitter2.CreateView(0,1,

  RUNTIME_CLASS(CInfoView),

  CSize(1,1),

  pContext);

  return 0;

  } 

  注意:二次切分的父窗口是第一次切分的第一个窗格,其视图类是CTestView

  9、使用ClassWizard为视图窗口类CTestView添加OnSize函数,在该函数中调用子函数

  SwitchView(),子函数的代码如下:

 

  void CTestView::SwitchView()

  {

  CRect rect;

  GetClientRect(&rect);

  int cx = rect.Width();

  int cy = rect.Height();

  m_wndSplitter2.MoveWindow(-2,-2,cx,cy+3);

  m_wndSplitter2.SetColumnInfo(0, cx/4,0);

  m_wndSplitter2.SetColumnInfo(1, cx-cx/4, 0);

  m_wndSplitter2.RecalcLayout();

  } 

  该子函数主要用于设置二次切分后的各列信息,通过CSplitterWnd::SetColumnInfo函数实现,原型为:void SetColumnInfo( int col, int cxIdeal, int cxMin );

  由3 个参数,意义如下:

  ● col:切分窗口的列标识

  ● cxIdeal:列的实际宽度,单位为像素

  ● cxMin:列的最小宽度,单位为像素

 

 

 

遇到的一个问题:就是现在要分的视图类之前写过代码,现在要把它分割成两个视图的话如果按上面的程序的话就不行,改动会很复杂。

解决方法:重新新建了一个CTempView:CView类,把第一次分割的类换成CTempView然后再将CTempView分割成之前的视图类和新增的视图类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在风能领域,准确预测风速对于风电场的运行与管理至关重要。Matlab作为一个强大的数学计算和数据分析平台,被广泛应用于风速预测模型的构建。本文将深入探讨基于四种风速——随机风、基本风、阵风和渐变风的组合风速预测技术。 我们来理解这四种风速类型: 1. **随机风**:随机风是指风速呈现出随机性的变化,通常由大气湍流引起。在建模中,通常通过统计方法如高斯分布或Weibull分布来模拟这种不确定性。 2. **基本风**:基本风速是指在无特定扰动条件下的平均风速,它是长期观测结果的平均值,通常用于结构设计和风能评估。 3. **阵风**:阵风是短时间内风速显著增强的现象,对建筑物和风力发电机造成的主要威胁之一。阵风的预测涉及到风的脉动特性分析。 4. **渐变风**:渐变风是指风速随时间和空间逐渐变化的过程,常见于风向转变或地形影响下的风场变化。 在Matlab中,利用这四种风速类型进行组合预测,可以提高预测的准确性。预测模型可能包括以下几个步骤: 1. **数据收集与预处理**:收集历史风速数据,包括随机风、基本风、阵风和渐变风的数据,进行异常值检测、缺失值填充以及数据标准化。 2. **特征工程**:提取风速变化的相关特征,如平均值、标准差、极值、频率分布等,这些特征可能对预测有重要影响。 3. **模型选择**:可以选择多种预测模型,如时间序列分析(ARIMA、状态空间模型等)、机器学习算法(线性回归、决策树、支持向量机、神经网络等)或深度学习模型(LSTM、GRU等)。 4. **模型训练**:利用历史数据训练选定的模型,调整模型参数以优化性能,例如通过交验证来避免过拟合。 5. **模型验证与评估**:使用独立的测试集验证模型预测效果,常见的评估指标有均方误差(MSE)、平均绝对误差(MAE)和决定系数(R²)。 6. **组合预测**:结合四种风速的不同模型预测结果,可以采用加权平均、集成学习(如bagging、boosting)等方式,以提升整体预测精度。 7. **实时更新与动态调整**:实际应用中,模型需要不断接收新的风速数据并进行在线更新,以适应风场环境的变化。 通过以上步骤,可以构建一个综合考虑各种风速特性的预测系统,这对于风电场的功率输出预测、风电设备的维护计划以及电网调度都具有重要价值。然而,需要注意的是,每个风场的地理环境、气候条件和设备状况都有所不同,因此模型的建立应根据实际情况进行定制和优
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值