多控件逻辑控制 [大三TJB_708]

来源:互联网 发布:网络40大禁书 编辑:程序博客网 时间:2024/06/06 02:36

1 背景

多于解决“多个控件的逻辑控制”方法不仅适合控件这个对象,同时适合多界面的问题。这里指的“多个控件的逻辑控制”是指每个控件能独立的发挥本身的作用,不受其它控件的任何干扰。让编写的程序能够运行处预定的效果。

 

2 DirectShow视频预览控件控制

先列举出视频预览涉及的控件,然后再描述能达到需求的逻辑控制。

 

2.1 DirectShow视频控件

好话不多说,先直接罗列出控件家族们

图1 DirectShow 视频控件图

 

2.2 逻辑控制

一般的逻辑控制都跟各按钮的功能挂钩,我们首先明确这些控件的功能,然后在根据功能需求来使它们达到预期的效果。

 

2.2.1 功能描述

设置图1中的那些按钮是为了达到这样的效果:

当运行程序后弹出一个对话框,当点击“全力预览视频”按钮时,程序会将枚举到的系统设备添加到“退出”上方的那个按钮之中,并同时显示在“可编辑框内”。并采用系统中被最后枚举到的那一个设备来进行视频预览,现在处于视频预览状态。

根据按钮的标题,很显然,当点击了“停览,没啥嫌疑”按钮时视频就停了下来,当点击“续览,嫌疑重大”按钮时视频继续显示。还有要考虑到的是如果视频正在显示再次点击了“全力预览视频”时应该给出“视频正在预览”的提示;当还没有进行视频显示的时候就点击“停览,没啥嫌疑”按钮时应该提示视频还从未显示过;当在没有停止过视频预览的时候点击了“续览”按钮时,就应该提示视频从来就没有停止过。

         为了让程序稍变灵活,从下拉列表中重新选择一个视频设备的时候,程序要重新遍历设备找到与列表中一样的设备来进行视频预览。

当然了,点击了退出按钮的时候,程序运行就结束了。

 

2.2.2 逻辑控制实现

满足2.2.1中所描述的功能。我们往往采用一种变量来标志各个控件的状态(当前是否被点击过),此种变量不妨有一个自己的名字---标志变量。用标志变量来控制各个按钮按需工作的方法称之为标志变量法。

通过标志变量法记住各个按钮的状态,让标志变量的值成为能够点击另外按钮的一个条件。这显然是离不开我们经常使用的if, switch语句了。

 

(1)视频预览按钮

如果视频预览按钮已经被点击过且其它按钮没有被点击,当再次点击视频预览按钮时应给出正在视频显示的消息。除此之外,视频预览按钮皆可被点击。

 

(2)视频停览按钮

如果当前视频没有进入显示状态,则应该给出当前视频没有进行显示的提示消息,除此之外,此按钮皆可被点击。

 

(3)视频继续按钮

A.   视频进行过预览(pContorl != NULL时,pContorlIMediaControl类指针)

B.   此按钮只有在视频停览的状态下被点击才有效。

点击此按钮需要同时满足A,B条件,否则点击此按钮都不符合逻辑,都应该给予消息提示。

 

(4)Combo Box 下拉列表

只要程序开始运行,Combo Box下拉列表随时都可以被点击,好让选择另一个设备来进行视频显示。由于选择具体设备时是运行的同一段程序,所以需要设置变量来告诉系统执行系统枚举函数的另一段代码(重新找到列表中所选择的设备)。在此表中进行下拉的时候需要停止当前预览的视频,等再点击视频预览按钮时,程序将系统找到的系统设备与下拉表中所选择的设备相比较,如果是同一个设备则进行视频预览,若非则寻找下一个,此时程序一定能将系统的某个设备和所选择的设备相匹配,列表中的设备就是从系统中枚举出来的。

有了控制需求之后,咱们设置标志变量来比较有效的控制它们。因为这些控件能被点击的条件就只跟一种状态有关(并非亮亮相关或者多多相关),所以选取一个标志变量用此标志变量的两个值就可以实现控制了。在程序中实现控制如下:

1)         在类中声明标志变量名为isPlayed,false表示当前没有视频显示,为true表示当前正在进行视频的显示。将isPlayed在继承的对话框类的构造函数中初始化为false

2)         设置视频预览按钮的逻辑控制条件。

在进入视频预览响应函数时首先判断isPlayed的值,如果为ture则需要提示就能达到控制效果。

if(isPlayed){MessageBox(_T("正在进行视频预览"));}isPlayed= true;


 

3)         设置停览按钮的逻辑控制条件。

在此按钮的响应函数内,只有当isPlayed的值为ture时操作才被许可。在停览视频之后设置视频状态。

if(!isPlayed){MessageBox(_T("当前视频没有在显示"));return;}pControl->Stoped();isPlayed= false;


 

4)         设置续览按钮的控制逻辑条件。

在此按钮的响应函数内,只有当isPlayed的值为false且pControl不为空(初始值为空)时操作才允许。操作执行后,isPlayed恢复为ture。

if (pControl == NULL)){MessageBox(_T"程序未就绪,需要先进行视频预览");return ;ê?}if(isPlayed){MessageBox(_T("当前视频正在显示"));return;}pControl->Run();isPlayed= true;


 

5)         Combo Box控件和设备匹配

这里需要设置一个变量来表示选中了一个特定的系统设备来进行视频预览。将此变量在对话框继承类中申明为compareToChooseDevice,当在Combo Box下拉表中选中一项时,compareToChooseDevice的值为ture,让视频预览函数执行函数内的另一段代码。同时,视频预览停止,isPlayed设置为停止状态。点击视频预览按钮时,寻找特定的系统设备,找寻到特定设备后将compareToChooseDevice的值设定为false。然后开始视频预览。

 

Combo Box响应函数逻辑控制代码

pControl->Stop();isPlayed= false;


 

视频预览响应函数设备枚举逻辑控制代码

if(!compareToChooseDevice){m_veideoSelect.AddString(var.bstrVal);SysFreeString(var.bstrVal);}else{CString varf(var.bstrVal);if(strOnSelctVedioStr.CompareNoCase(varf)){continue;}else {compareToChooseDevice= false;VariantClear(&var);pBag->Release();break;}}


如果compareToChooseDevice为真时就将当前被枚举到的设备与列表中被选择的设备进行匹配,直到匹配成功,匹配成功时compareToChooseDevice的值复位。释放资源

 

小小逻辑控制之应用于控件记录完成! 

原创粉丝点击