zoukankan      html  css  js  c++  java
  • duilib进阶教程 -- 在MFC中使用duilib (1)

      由于入门教程的反响还不错,因此Alberl就以直播的形式来写《进阶教程》啦,本教程的前提:

      1、请先阅读《仿迅雷播放器教程

      2、要有一定的duilib基础,如果还没,请先阅读《2013 duilib入门简明教程》。

      3、下载基于VLC的MFC播放器(包含VLC等所有文件),csdn不允许上传相似的代码,因此后面的教程将不再上传VLC的dll、头文件等没有改变的文件。

      《仿迅雷播放器教程 -- 基于VLC的MFC播放器 (6)》中界面是用MFC做的,因此我们要将它换成duilib。而在《2013 duilib入门简明教程 -- 结合win32和MFC (16)》中只讲了怎么在duilib中显示MFC窗口,以及在MFC中显示duilib窗口,但是没有讲消息的响应,因此有些基础薄弱的小伙伴还是不懂,这里借着这个机会讲解一下消息的响应,下面进入正题。

      之前的MFC界面如下: 

      现在我们将左边的三个按钮换成迅雷的,如下:

      其中左边那块是纯duilib的界面,右边那块是在duilib的窗口里放了一个win32控件,这六个按钮都是有消息响应的,因此本教程实现了以下功能:

      1、在MFC窗口显示了duilib窗口,并响应了duilib的控件。

      2、在duilib的窗口显示了win32的控件,并响应了win32的控件。

      所以与MFC结合的知识已经全面覆盖了(与win32结合也是类似的),到此,就不用担心老项目使用duilib带来问题了。

      界面显示已经在《2013 duilib入门简明教程 -- 结合win32和MFC (16)》讲过了,那么这里只讲消息响应。

    一、纯duilib控件的响应:

      只需在Notify函数做响应就行了,其中m_pDlgMain是MFC主窗口的指针。

    void CDuiFrameWnd::Notify( TNotifyUI& msg )
    {
        if (m_pDlgMain)
        {
            if( msg.sType == _T("click") ) 
            {
                if( msg.pSender->GetName() == _T("btnPrevious") ) 
                {
                    m_pDlgMain->OnBnClickedButtonPlayPrevious();
                }
                else if( msg.pSender->GetName() == _T("btnNext") ) 
                {
                    m_pDlgMain->OnBnClickedButtonPlayNext();
                }
                else if( msg.pSender->GetName() == _T("btnPlay") ) 
                {
                    m_pDlgMain->OnBnClickedButtonPlay();
                }
            }
        }
    
        __super::Notify(msg);
    }

      可见原有的MFC代码基本无需改动,是不是很简单呢~O(∩_∩)O~

    二、duilib中MFC控件的响应

      由于duilib不够成熟,很多东西都要自己去处理,而如果水平不够的话,就很可能做不出来,已经有很多网友因为有些控件很难实现而放弃了。因此这种情况下,如果某个控件很难实现,我们用MFC的控件代替就是非常适合的,并且很多控件即使duilib能做出来,也还是取代不了MFC控件,比如虚拟表格等等,这些MFC控件已经很成熟了,并且界面也不难看,可自行定制,而如果用duilib去做虚拟表格的话,工作量肯定是很大的,因此这种情况下,也建议用MFC控件。那么在duilib中显示的MFC控件怎么响应呢?

      其实也很简单,回到win32就行了,我们只需截获WM_COMMAND,而duilib的WM_COMMAND等windows消息可以在HandleMessage函数里截获,代码如下:

    LRESULT CDuiFrameWnd::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
        switch (uMsg)
        {
        case WM_COMMAND:
            if (IDC_BUTTON_DUI_NEXT == wParam)
            {
                if (m_pDlgMain)
                {
                    m_pDlgMain->OnBnClickedButtonPlayNext();
                }
            }
            break;
        default:
            break;
        }
    
        return __super::HandleMessage(uMsg, wParam, lParam);
    }

      也是非常简单!

      现在已经可以去试试效果啦,左边那三个按钮和右边那三个按钮的效果完全一样!

      从这个例子可以看出,无论是在duilib里使用MFC,还是在MFC中使用duilib,都不需要改动原有项目,和MFC结合是不是很有用呢~O(∩_∩)O~

      代码下载:http://download.csdn.net/detail/qq316293804/6426325





  • 相关阅读:
    SpringBoot启动里的细节问题
    SpringBoot运行过程从SpringApplication开始解读
    SpringBoot应用启动流程
    SpringBoot上传相关配置
    planUML时序图
    JAVA设计模式--单例模式
    中国云运营商横向对比——IaaS服务对标
    ansible api2.0 多进程执行不同的playbook
    自动化运维平台搭建
    django-将数据库数据转换成JSON格式(ORM和SQL两种情况)
  • 原文地址:https://www.cnblogs.com/Alberl/p/3379098.html
Copyright © 2011-2022 走看看