在收到需求之前,程序的进度显示方案是在状态栏中建立一个进度条控件。该进度条只具有显示仿真进度的功能。

仿真程序框架中进度条(Slider)创建总结

 

新的需求要求进度条控件能够拖动以控制仿真进度。

根据新的需求,制定更改方案1

方案1

在进度条控件建立的类(CMainFrame)框架类中添加滑块拖动的消息相应函数(OnHScroll函数),加入函数后发现滑块拖动后,函数并没有响应。原因在于该进度条控件(m_slider)是在状态栏m_wndMenuBar上建立的,也就是m_slider的父窗口。

// 创建滑动条控制 控件

         m_slider.Create(WS_VISIBLE | TBS_AUTOTICKS | TBS_ENABLESELRANGE  ,CRect(450,2,650,23), &m_wndMenuBar, ID_SliderControl);

         m_slider.SetRange(0,500);

所以m_slider控件拖动事件发生后,拖动消息应该由状态栏相应,而不是框架类。但是程序中并没有状态栏类,无法对该事件进行响应。而且进度条控件放置在状态栏中确实看上去不合适,也不专业。

方案1行不通,在网上看到一篇文章《在VC++工具栏中添加Slider控件实现视图实时缩放》,觉得这个思路可以。所以指定方案2

方案2

从面向对象的思想出发,以一个工具条(toolbar)作为一个整体,封装一个类,进度条控件作为这个类的一个成员变量。在框架类中对封装的类进行实例化,进而实现进度条的功能。该方案貌似可以。

开干,因为在原程序框架中,原生的工具栏类是CMFCToolBar类,所以我们可以从该类派生出一个新类CMyToolBar。

生成新类过程如下:

       (1) 首先在设计窗口中新建一个工具栏(IDR_TOOLBAR1),并在工具栏中新建一个按钮(ID_Slider_ToolBar)。

仿真程序框架中进度条(Slider)创建总结

        (2) 打开类向导

仿真程序框架中进度条(Slider)创建总结

        (3) 利用类向导添加以CMFCToolBar类为基类的CMyToolBar

仿真程序框架中进度条(Slider)创建总结

单击完成后,会生成两个文件MyToolBar.cpp和MyToolBar.h文件。

        (4) 在MainFrm.h文件中添加新类的引用,并新建CMyToolBar类的对象

仿真程序框架中进度条(Slider)创建总结

仿真程序框架中进度条(Slider)创建总结

         (5) 在MyToolBar.h中新建CSliderCtrl变量用来实现进度条控件的建立

CSliderCtrl              m_slider2;

         (6) 在CMainFrame::OnCreate函数中实现该工具栏的建立

仿真程序框架中进度条(Slider)创建总结

       (7) 生成效果如图所示:

仿真程序框架中进度条(Slider)创建总结

 

从生成页面来看,存在两点的不足:

(1). 新生成的工具栏中,进度条控件没有完全显示出来,影响拖动操作;

(2). 生成新的工具栏后,原工具栏中的组合框(用来选择机型)反而消失了,需要进行“右键-自定义-工具栏-全部重置”的操作后才能正常显示出来;

虽然这种方案可以响应OnHScroll函数,但在进行多次解决上述问题的尝试失败后,决定放弃该方案。

遂构思方案3

方案3

即在CPoseidonMFCView类中的CPoseidonMFCView::OnCreate函数中实现对进度条控件的加载

仿真程序框架中进度条(Slider)创建总结

方案3可以实现进度条在视窗上的加载,也能通过拖动实现对进度的控制,但带来的问题是:拖动改变仿真程序进度后,视焦点发生了变化,无法再通过键盘控制模型的姿态。需要手动对界面进行“最小化-最大化”的操作之后才能重新控制模型的姿态。所以方案3也不行。

最后在网上搜索,可以知道工具栏上的按钮毕竟不是窗口,是一个一个画上去的,所以当我们用代码在MFC单文档程序的工具栏中要生成一个进度条时,可能会出现不能完全显示的问题,或者是自己的水平确实没有到位。

最后确定采用CDockablePane方案。不多废话,直接上流程:

CDockablePane方案

1.  新建一个对话框资源IDD_SliderDlg,style设置为Child,Border设为None,把默认的OK和Cancel按键去掉,在对话框中新建进度条控件IDC_SLIDER1和静态文本框控件IDC_Static_Time;并为这两个控件添加响应的变量

仿真程序框架中进度条(Slider)创建总结

仿真程序框架中进度条(Slider)创建总结

m_Static_Dlg同上,需要注意的是,这两个变量需要在其他类中引用,要求他们是全局变量。所以我更改了他们的定义的位置,把这两个变量从头文件(SliderDlg.h)中的定义迁移到SliderDlg.cpp中来

CSliderCtrl m_Slider_Dlg;

CStatic m_Static_Dlg;

2.为对话框添加类

仿真程序框架中进度条(Slider)创建总结

         如图所示:新的类名为CSliderDlg,基于CDialog,对话框ID为第一步新建的对话框IDD_SliderDlg,生成SliderDlg.h,SliderDlg.cpp两个文件。

        3. 派生CDockablePane类

(1)添加继承自CDockablePane的类CMyPane类

仿真程序框架中进度条(Slider)创建总结

(2)添加此类的WM_CREATE和WM_SIZE消息响应,并添加上面对话框的成员变量

CSliderDlg    m_TestDlg;

(3)在CMyPane::OnCreateCMyPane::OnSize函数中添加代码

仿真程序框架中进度条(Slider)创建总结

仿真程序框架中进度条(Slider)创建总结

4.修改MainFrame类

(1) 在MainFrm.h中添加CMyPane类的引用和成员变量

#include "MyPane.h"

 

CMyPane    m_MyPane;

(2)在CMainFrame::OnCreate函数中添加红色显示的代码

//////////////////////////////////////////////////////////////////////////

//新建Pane窗口区域

         if (!m_MyPane.Create(_T("进度控制条"), this, CRect(0, 0, 400, 100), TRUE, IDD_SliderDlg,

                   WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

         {

                   TRACE0("未能创建输出窗口\n");

                   return false;

         }

         m_MyPane.EnableDocking(CBRS_ALIGN_ANY);

         //////////////////////////////////////////////////////////////////////////

 

         // TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行

         m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);

         m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

         EnableDocking(CBRS_ALIGN_ANY);

         DockPane(&m_wndMenuBar);

         DockPane(&m_wndToolBar);

 

DockPane(&m_MyPane);      //调整m_Mypane的大小使之适合父窗口

5. 运行结果

仿真程序框架中进度条(Slider)创建总结

6. 在对话框类CSliderDlg中添加进图条拖动事件的消息响应函数:

仿真程序框架中进度条(Slider)创建总结

添加响应的代码

void CSliderDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

         // TODO: 在此添加消息处理程序代码和/或调用默认值

         //判断拖动事件是否是IDC_SLIDER1控件发出的

         if (pScrollBar->GetDlgCtrlID()==IDC_SLIDER1)

         {

                   //获取IDC_SLIDER1控件中滑块的位置并赋值给m_SliderValue

                   m_SliderValue = m_Slider_Dlg.GetPos();

                   m_currentCount = int(m_TotalCount*m_SliderValue / 500);

                  

         }

         CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

7. 在视类CPoseidonMFCView::OnTimer函数中添加对进度条滑块和静态文本框的实时更新:

//设置进度控制条对话空中的滑块位置和时间显示

         m_Slider_Dlg.SetPos(m_SliderValue);

         format_time = formatting_Time;

         m_Static_Dlg.SetWindowTextW(format_time);

效果如下图所示:

仿真程序框架中进度条(Slider)创建总结

最终实现了用进度条控件控制仿真进度,用静态文本框控件显示时间;而且不影响程序其他功能。

相关文章:

  • 2018-07-19
  • 2021-12-02
  • 2021-10-13
  • 2021-07-01
  • 2018-08-28
  • 2021-10-15
  • 2021-12-31
  • 2021-11-05
猜你喜欢
  • 2021-07-02
  • 2021-12-31
  • 2021-09-11
  • 2021-12-04
  • 2021-10-04
  • 2021-11-23
  • 2021-08-22
相关资源
相似解决方案