功能窗口A 需要进一步设计。这个设计主要是按钮“启动仿真”和“停止仿真”的功能实现。
实现“启动仿真”按钮的功能需要几个步骤:第一步,启动VP 展示窗口,并放置到合适位置,同时启动进度显示窗口;第二步,在VP 展示窗口的初始化事件里启动VP 线程;第三步,在启动进度显示窗口中显示加载进度,并判断VP 线程是否加载完毕,完毕后,关闭计时窗口。
功能窗口A 中的按钮“启动仿真”涉及另外两个窗口,一个是VP 场景仿真窗口,另一个是仿真场景加载进度显示窗口。首先,需要完成这两个窗口的设计。
对于 VP 场景仿真窗口,在预备设计中,只完成了最基本的设计,得到 ID 为 IDD_ VPWindow,类名为VPWindow,窗口指针为PublicMember::VPWindow。对于该窗口的外观,需要在属性栏中进行设置。把标题栏(Title Bar)设置为False,把边界(Border)设置为None,删除掉原来的“确定”和“取消”按钮,效果如图10.2.21所示。当然,也可以根据需求,自行设计。例如,可以按照前面的方法,为该窗口设计背景颜色。
对于VP 场景仿真窗口,另外一个重要的设计是为其添加初始化函数OnInitDialog。在所有窗口中,只有主窗口IDD_VP2DIALOGVS2003_DIALOG 一开始就有初始化函数,其他窗口都需要手动添加。参考主窗口初始化函数OnInitDialog,其返回类型为BOOL 类型,函数最开始有一个系统的对话框初始化函数“CDialog::OnInitDialog();”,然后才是加入自己需要完成的功能代码。其添加过程如图10.2.22所示,切换到类视图,然后右键单击VP 场景仿真窗口类VPWindow,在弹出菜单中选择“添加”→“添加函数”,在弹出窗口中输入函数范围类型及名称,如图10.2.23所示。
图10.221 设置VPWindow
图10.2.23 添加初始化函数
图10.2.23 添加初始化函数
输入完成后,需要在BOOL VPWindow::OnInitDialog(void)函数中输入功能代码,具体代码如图10.2.24所示。这里,首先调用系统的对话框初始化函数。然后是设置一个静态变量,在仿真场景加载前设置为false,进入帧循环后设置为true,加载进度显示窗口可依据此变量进行相关操作。另外一个功能就是启动VP 仿真线程。
图10.2.24 VPWindow 初始化函数代码
仿真场景加载进度控制变量PublicMember::LoadVPSuccess 在VP的主线程中还有一个修改,具体代码如图10.2.25所示的VP 主线程代码。该线程非常简单,加载一个acf 文件,设置窗口属性,在进入帧循环后,修改加载进度控制变量的值为true。
图10.2.25 TabControl 标签切换代码
对于加载进度显示窗口,在前面的设计中没有过多提及,因为该窗口寿命本身很短,只在VP 线程加载时出现,在加载过程中显示加载进度,在VP 线程加载结束后自动退出。在进一步设计之前,需要确认前面的设计,该窗口ID 为IDD_NotifyMSG,类名为NotifyWindow。
对于加载进度显示窗口,删掉原来的“确认”和“取消”按钮,添加一个标签控件,设置其ID 为IDC_Notify,添加一个进度条控件,界面如图10.2.26所示。另外,在窗口属性栏设置该窗口的标题栏(Title Bar)为False,边界(Border)为None,设置透明属性(Transparen)为True。
图10.2.26 设置加载进度显示窗口
对于仿真场景进度的显示,还需要一些辅助设计:第一,为该窗口类添加一个整数int 数据成员“int proress;”,用于记录加载进度;第二,为进度控制条设置一个控件成员“CProgressCtrl m_p;”,其过程如图10.2.27所示。在资源视图中,右键单击进度条按钮,在弹出菜单中选择“添加变量”,在弹出的窗口中输入名称m_p,然后确认完成,如图10.2.28所示。另外的工作,就是为该窗口添加初始化函数和窗口定时器相应函数。(www.daowen.com)
图10.2.27 添加进度条成员变量
图10.2.28 设置进度条成员
对于初始化函数,添加和设置过程与VP 场景运行窗口类似,其代码如图10.2.29所示。其主要功能是设置进度值progress 为0,启动一个窗口定时器,其每秒执行一次功能代码。
图10.2.29 进度显示窗口的初始化函数
初始化函数启动了一个ID 为1的定时器,但定时器的功能代码还需要额外的添加设置。对于窗口定时器,需要在窗口消息中,启用窗口的时钟消息,如图10.2.30所示。选择窗口定时器事件OnTimer,其功能代码如图10.2.31所示。
图10.2.30 设置窗口的定时器
图10.2.31 进度显示窗口定时器相应函数
定时器函数的功能,主要是判断进度控制变量PublicMember::LoadVPSuccess。如果加载成功,就先停止定时器,移动刷新VP 仿真窗口,最后关闭进度显示窗口。如果还在加载过程中,就判断进度是否超过90,如果超过,一般让用户无法接受,则可以强行停止加载,这里,没有做任何处理。如果进度值没有超过90,则进度值增加2,设置进度条进度,显示已经耗费的时间。
完成前面的设计以后,回到功能窗口A的按钮功能设计。对于“启动仿真”按钮,其代码如图10.2.32所示。第一步是判断仿真是否已经开始,开始了就直接返回。第二步是修改加载进度显示控制变量为false,表示加载没有完成。第三步是以非模态方式启动VP 仿真窗口,并自适应屏幕尺寸。第四步是以模态方式启动加载进度显示窗口。
图10.2.32 启动仿真函数
对于“停止仿真”按钮,首先是停止VP的仿真,直接修改变量PublicMember::vpContinue的值,然后是销毁VP 显示窗口,其代码为:
PublicMember::vpContinue=false;
::DestroyWindow(PublicMember::pVPWindow);
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。