4-10源码分析-client界面

在上节课中呢,我已经向你详细讲述了图案端界面实现的过程,那今天呢,我再带你通过阅读源码。加深一下这块逻辑的理解,那在开始之前呢?我们先来回顾一下,前面我们介绍的client类之间的关系图。那之所以要回顾这张图呢,是因为我们在看代码的时候呢,你通过这张图就可以更好的理解代码之间的逻辑关系。

那了解了这个逻辑关系之后,我们再阅读代码就会更加轻松是吧?从这张图中呢,我们可以看到,对于client端来说,它包括了三大块儿。第一大块儿呢,是mainwindow,主要用于处理界面儿相关的内容,比如说创建窗口儿,切换页面等等,这些工作呢,都是在mainwindow这个类中实现的。

那第二个类呢,是conductor类conductor类主要完成两件事,第一件事呢是调用webrtc的native API。实现音视频的通信,那第二个功能呢?是协调mainwindow以及peerconnectclient类之间的这个逻辑关系.

这是conductor那第三块儿呢peerconnectclient,主要用于信令的发送与接收。对吧,那实际上这些内容呢?我在前面的课程中都向你做过详细的介绍。

那有了这些知识之后,我们现在再来看这个代码就比较容易了,我们切到WINDOWS环境下。当我们通过VS打开webrtc源码之后呢你会看到在这个源码中啊,包含了很多的目录。

其中呢,peerconnectclient就存放于examples这个目录下。在这个目录下呢,我们可以找到peerconnectclient的项目。在这个项目中的client目录下。里边儿存放的就是它全部的代码,那通过这个名字呢,我们就可以与刚才那张图对应上了,其中mainwindow相关的文件呢,就是mainwindow类。

在H文件中呢,定义的mainwindow类在CC文件中呢,是它的实现,那第二个呢,是conductor类。其中,点H文件是它的类定义。点CC文件呢?是它的实现。那最后一个呢?是peerconnectclient的相关的代码。程序的入口点呢,就是焖点,我们可以点开这个文件,在这个文件中啊,找到焖这个函数。好,我们看一下文本中都实现了哪些功能?其实在文本中,它实际上逻辑还是非常简单的。

第一部分是对socket的一些初始化,这个主要是用于我们后边儿进行数据的发送。接下来呢,是线程相关的一些设置,对于这部分知识呢,我们后边会再做详细的介绍,再接下来呢,是与命令行相关的一些参数。对于这块儿内容呢,我们不做过多讲解。一般我们也用不上,再往下从102行到108行,就是我们非常熟悉的代码了,对吧?这块呢,

实际在我们上节课中,我已经向你做过详细的介绍。那首先呢,在maven中会创建一个maven do的对象。之后呢,会调用mainwindow的create方法创建窗口,创建窗口需要三大步,第一大步呢是注册窗口类,第二步是创建窗口。第三步呢,是显示窗口所有的这些操作呢,都是在create这个函数中执行的。再接下来呢,是初始化SSL创建peer connection c对象用于信令的发送。再后边呢,

是创建conductor对象,用于调度peer connection cld以及温这两个对象。所以在创建这个对象的时候呢,我们需要把client以及window这两个对象呢,当做参数放到conductor对象中,这样呢,它才能协调两个对象之间的关系是吧?好,那接下来的幺幺六到幺二三也是我们非常熟悉代码,因为这一块我前面也向你做过详细介绍,首先它会通过get message。获取消息之后呢,对消息进行转换,最后呢,会通过dispatch message将这个消息分发给。

wndproc消息处理函数那么在消息处理函数中呢?再对具体消息进行处理,那对于我们今天这节课来讲呢?实际还是带大家。看一下,create这个函数,以及让大家了解一下WINDOWS是如何进行消息分发的,也就是这块好,那再下边的逻辑呢?实际是当我们的客户端关闭之后。它要做一些善后的处理,也就是这一块逻辑,那这些呢,我们留作以后再做介绍,实际这一块逻辑啊,

我们不看也可以。因为它已经不影响我们对主程序的理解了,对吧?好,那接下来呢?我们就一步一步来看,为了更好的来阅读这个代码啊,我们在使用的时候可以给它设置断点。在这设一个断点之后。运行这样可以使我们更方便的来阅读代码,就是跟着程序执行的顺序。来看一遍它是怎么做的?好,那首先我们进入到create这个函数中。那这个时候呢,

我们就可以进行单步执行。那首先呢,是对窗口类的注册。好,我们跳到这个函数中去。那在这个函数中呢,实际就是设置一些参数,对吧?最关键的还是设置消息处理函数wndproc。当这些参数都设置好之后呢,就调用register classes w对这个窗口类呢进行注册。那在这里呢,我们就将这个窗口类注册好了,窗口类注册好之后呢,我们就可以创建窗口了,

在创建窗口时,我们需要注意的一点是什么呢?就是在这个API的第四个参数,它设置了一个ws visible。那设置这个标记之后呢?之前说的创建窗口的三大步,实际只需要两步就可以了,也就是说需要注册窗口类以及创建窗口。这样它就可以自动显示出来,如果我们没有设置这个标记呢,还要调用一个show window API对吧,这样才能将窗口显示出来,所以这块儿呢,我们一定要注意。因为我们在看这个代码的时候呢,

你会发现它并没有调show window这个API,但仍然可以将窗口显示出来,其中的原因呢,就是由于这个标志所造成的。那再接下来呢,是创建子窗口,我们进入到创建子窗口这个代码中。从这个函数中,我们可以看到,它就是将所有的子窗口一个个都创建出来是吧?分别是label 1 edit 1 label 2 edit 2。button以及mix box那这个呢,其实就非常简单,对于这段代码来说呢,我们需要注意的就是在create child window这个里边儿。

创建子窗口的时候一定要注意这个参数,这个呢,就是我们前面介绍的指定子窗口的父窗口是谁,对吧?那父窗口呢,就是w nd杠,这样才能在父子窗口之间建立关系,当我们处理一些与所有窗口相关的逻辑的时候。这就会非常的方便以上呢,就是子窗口的创建,再接下来呢,我们来看看切换页面,当所有的子窗口创建完成之后。下面我们就要进入到显示界面了,对于来说呢,

它对界面的切换是通过switch函数进行切换的,比如说switch to connect UI。switch two plistui switch two stream UI等等等,对吧?那对于我们第一个页面呢?当然就是切换到connect UI这里边去。我们进入到这个函数中,在这个函数中呢,实际就像我们前面介绍的,首先呢,是对peer list UI进行一个布局。之后再对进行一下布局,布局完成之后是否显示是通过传入的参数来决定的。对于PR list来说呢,我们给它传入的是FALSE对connect UI,

我们传入的是true,这样我们第一个页面就是连接的页面。再后边的这些逻辑呢,是设置焦点,也就是说当这个页面显示出来之后,我们的光标是在哪个控件上?如果说设置了自动连接,它就会发送一个消息。通过内部就直接连接服务器了,那对于现在这个逻辑来说呢,它并没有设置auto connect,所以也不会走这个逻辑。OK,那通过上面的设置,我们第一个页面就创建好了,

对吧?我们可以继续执行好当create创建好之后呢,就会初始化SSL。创建心灵对象构造conductor,最终呢,进入到消息的处理函数中。这个时候呢,我们就可以到消息处理函数wndproc中设置一个断点,找到这个消息处理函数。首先,我们大体来浏览一下wndproc这个函数,它都做了哪些工作?前面的这些代码呢?实际就是为了获取这个对象。这里呢,

我就不详细介绍了,好,那再接下来当mainwindow获取到之后,它会将所有的处理都交由mainwindow的message进行处理。后边的一些逻辑呢,都是一些不太重要的逻辑了,好,如果在这个过程中呢,我们没有获得mainwindow,那它会将所有的消息呢都交由。default window proc进行默认处理,这就是它的一个大体逻辑。实际上,这个函数的关键逻辑是交由。问window的on message进行处理了,

那我们就在这里打一个断点,继续执行这个时候呢,我们就可以看到现在指令呢,已经执行到419行了,我们可以跳进去看一下这个函数实现了哪些功能?在我们window的on message函数中呢,它对各种消息做了处理,其中有wm pen set focus size command等等这些消息。那这些消息的具体含义呢?一会儿我再向你做介绍,现在我们只要知道对于WINDOWS所有消息的处理呢?实际最终呢,都会调用到那WINDOWS的on message进行处理。对吧,那在这些禁令中啊,

比较关键的一个禁令呢,是wm command。那它的含义是什么呢?就是窗口中子窗口发送的消息呢?统一叫做wm command。这时候大家就会有疑问了,所有的子窗口发送的消息都是command,那我如何去区分每个不同的子窗口发送的消息呢?那这个呢,就是通过其他参数来识别的,那首先我们要清楚每一个消息发送过来的时候。除了message这个消息之外呢,还包括了WP以及lp这两个参数,那这两个参数就可以用于我们区分。不同子控件发来的消息看一下,

对于peer connection cld,它是如何处理的?当cld收到子控件的消息之后呢?它首先判断。是由哪个控件发出来的?这个怎么判断呢?实际上,发送这个消息的子控件的实例呢,是存放在lp这个输入参数中的。所以我们只要判断lp的内容,就可以知道是哪个控件发送出来的OK,那当我们知道是哪个控件发送的消息之后呢?我们还要判断它发送的具体是哪个消息。对吧,你是单机的消息还是双机的消息?

这个呢,就是由另外一个参数WP来指定的了解了这些之后呢,我们现在再看这段代码就非常容易理解了,对吧?首先,当他收到子控件发来的消息之后,他要判断是哪个控件发送的。是button发送的,还是listbox发送的,我们知道某个控件发送的消息之后呢?我们再判断它发送的消息具体是什么?对于button来说呢,我们只要单击一下,它就会做相应的处理,对吧?

对于listbox来说呢?它需要双击之后才能做相应的处理。当然最后呢,他们都是进入到on defer的action这个函数中,那总之呢,通过上面分析呢,你应该知道了wndproc是如何处理子控件消息的。是吧,实际就是通过command这个消息,然后再对command传进来时带入的其他参数。进行一个综合的这个判断,我们就知道具体是哪个子供件儿发送的消息,它发送的到底是什么消息了?好,那了解了这些信息之后呢?

现在我们再继续执行,就可以看到我们的第一个页面了,对吧?这就是用户的登录页面。当我们点击connect button的时候呢,那它就会进入到387行这个代码库。我们来看一下在on defer的action这个函数中啊,它做了哪些事情?那首先呢,它会判断我现在的界面是哪一个,那通过UI这个状态机来获知对吧?那现在呢?肯定是在connect to server状态下,我们弹幕执行一下,在这个状态下呢,

它首先获得服务端的。地址端口号之后呢,会调用call back四二的login,最终呢,连接限定服务器。对于call back start login这一块儿内容呢,我们在信令相关的分析中呢,再向你做详细介绍。那以上呢,就是peerconnectclient端界面相关的逻辑,那最后呢,我们再来看看WINDOWS下常见的几个消息。那刚才呢?我已经向你详细介绍了command,这个消息是吧?

它是子控件儿的消息,那lp中呢?存放的是子控件儿的实例。WP中呢,存放的是子控件发送的事件,这是第一个,那第二个呢是size,就是在窗口发生变化的时候会发送size消息。比如说,当我们的窗口显示出来之后,我们通过鼠标将它进行缩放,那这个时候呢,我们就。可以收到赛字这个消息,当收到赛字消息之后,

我们需要根据赛字大小重新绘制窗口的内容。好再下来呢,是pen的消息。pen的消息呢,是在窗口内容无效时触发的。通常情况下,我们会通过一个专用的API来触发pen的消息。关于这块内容呢,我们后边会再做详细的介绍好再下来是create。create是在调用create window函数之后产生的。如果我们有一些逻辑是在窗口创建之后才能做的,那在收到create消息之后,我们去做这件事儿就比较合适。再下来呢,还有一个非常特别的消息,

就是wm APP,那这个消息呢,实际是用户自定义消息。当我们的系统消息无法满足用户需求的时候,这个时候我们就需要定义一个APP的消息来实现我们自己的这个逻辑。那APP消息呢?实际它是一个固定的值,我们在定义自己消息的时候呢,一般情况下都是在wm APP之上进行一个累加。比如说我们定义了十个自定义消息,第一个自定义消息呢,就是wm APP+1,第二个呢,就是wm APP+2,以此类推。

那以上呢,就是我们这节课内容在阅读代码的过程中呢,向你介绍了一些细节,比如说我们在创建窗口的时候可。可以不调用show window,而通过一个标志位就可以让它显示出来。还有我们在创建子窗口的时候呢,需要把父窗口的指针呢传进去。那对于peerconnectclient来说呢,这个指针就是w nd杠对吧?

如有侵权,请联系我删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值