SOUI中SRealWnd的使用

这里做一个VLC的例子(在SOUI中使用VLC来播放一下本地文件和流)

Step1 使用向导建立一个工程,将需要包含的VLC文件包含进去
Step2 SOUI 界面的一些设置
Step3 编写代码 实现对应的功能
Step4 查看效果

思考:怎么减小VLC的体积 减小plugins的体积?

  • Step1 使用向导建立工程 建立XML文件

主窗口

<SOUI name="mainWindow" title="@string/title" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" width="800" height="600" margin="5,5,5,5" resizable="0" wndType="appMain" appWnd="1" translucent="0">
    <root skin="skin_1_jpg" cache="1">
        <caption pos="0,0,-0,30" show="1" font="adding:0">
            <text pos="5,5" colorText="#ffffffff" font="face:宋体,size:20">VLC demo</text>
            <imgbtn name="btn_close" skin="_skin.sys.btn.close" pos="-45,0" tip="close" animate="1" />
        </caption>
        <window pos="5,[2,-5,-5">
            <text pos="26,16,@-1,@24" colorText="#ffffff">播放路径:</text>
            <edit pos="[10,{,-100,@24" colorBkgnd="#FFFFFF" cueText="" colorText="#000000" name="edit_playurl" colorBkgnd="RGBA(0,0,0,0)" margin="1,1,1,1" colorBorder="#F9E3F8" />
            <button pos="[5,{,@60,@24" colorText="#FFFFFF" skin="skin_1_jpg" name="btn_play">播 放</button>
            <window pos="26,[10,@730,@500">
                <realwnd pos="10,10,-10,-10" name="wnd_play" wndclass="SRealWnd" id="" wndname="playwnd" margin="1,1,1,1" colorBorder="#F9E3F8" />
            </window>
        </window>
    </root>
</SOUI>

子窗口

<?xml version="1.0"?>
<SOUI name="window" title="布局" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" width="400" height="300" margin="1,5,5,5" wndType="8" toolWindow="1">
    <root cache="1">
        <window pos="0,0,-0,-0" colorText="#ffffff" skin="skin_2_jpg" />
    </root>
</SOUI>
  • Step2 界面的设置

可以参照mfc.demo这个例子 
这里直接抄过来 改一下对应的类

#pragma once

#include <unknown/obj-ref-impl.hpp>

namespace SOUI
{
    class CSouiRealWndHandler :public TObjRefImpl2<IRealWndHandler,CSouiRealWndHandler>
    {
    public:
        CSouiRealWndHandler(void);
        ~CSouiRealWndHandler(void);

        /**
         * SRealWnd::OnRealWndCreate
         * @brief    创建真窗口
         * @param    SRealWnd * pRealWnd --  窗口指针
         * @return   HWND -- 创建出来的真窗口句柄
         * Describe  
         */    
        virtual HWND OnRealWndCreate(SRealWnd *pRealWnd);

        /**
        * SRealWnd::OnRealWndDestroy
        * @brief    销毁窗口
        * @param    SRealWnd *pRealWnd -- 窗口指针
        *
        * Describe  销毁窗口
        */
        virtual void OnRealWndDestroy(SRealWnd *pRealWnd);

        /**
        * SRealWnd::OnRealWndInit
        * @brief    初始化窗口
        * @param    SRealWnd *pRealWnd -- 窗口指针
        *
        * Describe  初始化窗口
        */
        virtual BOOL OnRealWndInit(SRealWnd *pRealWnd);

        /**
        * SRealWnd::OnRealWndSize
        * @brief    调整窗口大小
        * @param    SRealWnd *pRealWnd -- 窗口指针
        * @return   BOOL -- TRUE:用户管理窗口的移动;FALSE:交由SOUI自己管理。
        * Describe  调整窗口大小, 从pRealWnd中获得窗口位置。
        */
        virtual BOOL OnRealWndSize(SRealWnd *pRealWnd);
    };

}
#include "StdAfx.h"
#include "SouiRealWndHandler.h"
#include "SPlayDlg.h"

namespace SOUI
{
    CSouiRealWndHandler::CSouiRealWndHandler(void)
    {
    }

    CSouiRealWndHandler::~CSouiRealWndHandler(void)
    {
    }

    HWND CSouiRealWndHandler::OnRealWndCreate( SRealWnd *pRealWnd )
    {
        const SRealWndParam &param=pRealWnd->GetRealWndParam();
        if(param.m_strClassName==_T("SRealWnd"))
        {
            SPlayDlg *pWnd = new SPlayDlg;
            //mfc.demo中的例子 pbtn->Create(param.m_strWindowName,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,::CRect(0,0,0,0),CWnd::FromHandle(pRealWnd->GetContainer()->GetHostHwnd()),pRealWnd->GetID());
            pWnd->Create(pRealWnd->GetContainer()->GetHostHwnd(), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, 0);
            pRealWnd->SetData(pWnd);
            //返回成功创建后的窗口句柄
            return pWnd->m_hWnd;
        }else
        {
            return 0;
        }
    }

    void CSouiRealWndHandler::OnRealWndDestroy( SRealWnd *pRealWnd )
    {
        const SRealWndParam &param=pRealWnd->GetRealWndParam();
        if(param.m_strClassName==_T("SRealWnd"))
        {//销毁真窗口,释放窗口占用的内存
            SPlayDlg * pWnd = (SPlayDlg*) pRealWnd->GetData();
            if(pWnd)
            {
                pWnd->DestroyWindow();
                delete pWnd;
            }
        }
    }
    
    //不处理,返回FALSE
    BOOL CSouiRealWndHandler::OnRealWndSize( SRealWnd *pRealWnd )
    {
        return FALSE;
    }

    //不处理,返回FALSE
    BOOL CSouiRealWndHandler::OnRealWndInit( SRealWnd *pRealWnd )
    {
        return FALSE;
    }
}


Step3 处理播放的逻辑
关于vlc怎么包含对应的文件 文末给出github上整个工程地址(这个后续增加)

void CMainDlg::OnPlay()
{
    //SMessageBox(NULL, L"点击了播放", L"提示", MB_OK);
    ReleaseVlc();
    //处理播放的逻辑
    SRealWnd* pWnd = (SRealWnd*)FindChildByName(L"wnd_play");
    SASSERT(pWnd);

    SStringT strPath = L"";
    SEdit* pEdit = FindChildByName2<SEdit>(L"edit_playurl");
    strPath = pEdit->GetWindowTextW();
    
    

    //对路径进行一个编码的转换 转换成UTF8来进行调用
    wchar_t* wchar = strPath.GetBuffer(strPath.GetLength());
    strPath.ReleaseBuffer();
    size_t len = wcslen(wchar) + 1;
    size_t converted = 0;
    char* format = (char*)malloc(len * sizeof(char));
    wcstombs_s(&converted, format, len, wchar, _TRUNCATE);

    //根据strPath判断播放的类型 如果是本地则使用本地的播放方法 区别 m_media 的创建方法
    int type = strPath.Find(L"http");
    m_media = strPath.Find(L"http") == -1 ? libvlc_media_new_path(m_inst, format) : libvlc_media_new_location(m_inst, format);
    if (!m_media)
    {
        SMessageBox(NULL, L"输入文件名有误,请重新输入!\n正确输入例如:F:\\1.jpg", L"提示", MB_OK);
        return;
    }
    m_player = libvlc_media_player_new_from_media(m_media);
    libvlc_media_release(m_media);
    libvlc_media_player_set_hwnd(m_player, (void*)pWnd->GetRealHwnd());
    int ret = libvlc_media_player_play(m_player);
    if (0 != ret)
    {
        SMessageBox(NULL,L"播放文件失败",L"提示",MB_OK);
    }
    free(format);
}

void CMainDlg::ReleaseVlc()
{
    if (m_player != nullptr)
    {
        libvlc_media_player_stop(m_player);
        libvlc_media_player_release(m_player);
    }
    m_player = nullptr;

}

Step4 效果图

111

 

Guess you like

Origin blog.csdn.net/Wuzm_/article/details/101471538