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





  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/Alberl/p/3379098.html
Copyright © 2011-2022 走看看