视频定位控件数据可分为两部分:

可见部分:播放按钮、加载按钮、视频第一帧图片、视频时长

不可见部分:视频URL

以下为VideoOle控件头文件部分:

 extern "C" const GUID IID_VideoOleCtrl;class RichEditVideoOle :public RichEditOleBase{DECLARE_REOBJ(RichEditVideoOle, L"video")public:enum ReVideoState{REVIDEO_STATE_NORMAL,REVIDEO_STATE_LOADING,};RichEditVideoOle();~RichEditVideoOle();BOOL InitOleWindow(IRichEditObjHost* pHost);int GetVideoState(){return _state;}SStringW GetVideoUrl(){return _video_url;}SStringW GetVideoDuration(){return _video_duration;}SStringW GetVideoId(){return GetId();}void SetVideoPlayState(ReVideoState state);protected:void UpdatePosition();bool OnBnClickPlay(SOUI::EventArgs* pEvt);protected:SOUI_ATTRS_BEGIN()ATTR_STRINGW(L"video_duration", _video_duration, FALSE)ATTR_STRINGW(L"video_url", _video_url, FALSE)ATTR_STRINGW(L"video_cover_path", _video_cover_path, FALSE)SOUI_ATTRS_END()private:int            _state;SStringW _video_duration;            //视频时长SStringW  _video_url;             //视频文件路径SStringW    _video_cover_path;          //视频第一帧图片路径};

以下为VideoOle控件的源文件部分代码:

 //// ------------------------------------------------------------------------------// impl RichEditVideoOle//// {FAB32B7E-AC02-468c-A615-1E730243B62E}static const GUID IID_VideoOleCtrl = { 0xfab32b7e, 0xac02, 0x468c, { 0xa6, 0x15, 0x1e, 0x73, 0x2, 0x43, 0xb6, 0x2e } };RichEditVideoOle::RichEditVideoOle(){_oleGuid = IID_VideoOleCtrl;_sizeNatural.cx = 300;_sizeNatural.cy = 160;_state = REVIDEO_STATE_NORMAL;_canBeSelect = FALSE;_xmlLayout = L"LAYOUT:VideoOleLayout";}RichEditVideoOle::~RichEditVideoOle(){}BOOL RichEditVideoOle::InitOleWindow(IRichEditObjHost* pHost){BOOL ret = RichEditOleBase::InitOleWindow(pHost);SWindow* pVideoWnd = _oleView.FindChildByName2<SWindow>(L"video_frame");if (pVideoWnd){SImageWnd* pVideoCoverWnd = pVideoWnd->FindChildByName2<SImageWnd>(L"video_cover_img");IBitmap* pFrameImg = SResLoadFromFile::LoadImage(_video_cover_path);if (pVideoCoverWnd && pFrameImg){pVideoCoverWnd->SetImage(pFrameImg);UpdateWindowLayout(pVideoCoverWnd);}}SImageView* pPlay = _oleView.FindChildByName2<SImageView>(L"play");ISkinObj* pPlaySkin = GETSKIN(L"skin.richvideo_play", 100);if (pPlay && pPlaySkin){pPlay->SetSkin(pPlaySkin);pPlay->SetVisible(TRUE, TRUE);pPlay->Resume();SUBSCRIBE(pPlay, EVT_CMD, RichEditVideoOle::OnBnClickPlay);}SImageView* pLoading = _oleView.FindChildByName2<SImageView>(L"loading");ISkinObj* pLoadingSkin = GETSKIN(L"skin.richvideo_loading", 100);if (pLoading && pLoadingSkin){pLoading->SetSkin(pLoadingSkin);pLoading->SetVisible(FALSE, TRUE);pLoading->Resume();}SStatic* pVideoDuration = _oleView.FindChildByName2<SStatic>(L"video_duration");if (pVideoDuration){pVideoDuration->SetWindowText(L"00:30");}return ret;}bool RichEditVideoOle::OnBnClickPlay(SOUI::EventArgs* pEvt){_state = REVIDEO_STATE_LOADING;SWindow* pVideoWnd = _oleView.FindChildByName2<SWindow>(L"video_frame");if (pVideoWnd){SImageWnd* pVideoCoverWnd = pVideoWnd->FindChildByName2<SImageWnd>(L"video_cover_img");IBitmap* pFrameImg = SResLoadFromFile::LoadImage(_video_cover_path);if (pVideoCoverWnd && pFrameImg){pVideoCoverWnd->SetImage(pFrameImg);UpdateWindowLayout(pVideoCoverWnd);}}SImageView* pPlay = _oleView.FindChildByName2<SImageView>(L"play");ISkinObj* pPlaySkin = GETSKIN(L"skin.richvideo_play", 100);if (pPlay && pPlaySkin){pPlay->SetSkin(pPlaySkin);pPlay->SetVisible(FALSE, TRUE);pPlay->Resume();}SImageView* pLoading = _oleView.FindChildByName2<SImageView>(L"loading");ISkinObj* pLoadingSkin = GETSKIN(L"skin.richvideo_loading", 100);if (pLoading && pLoadingSkin){pLoading->SetSkin(pLoadingSkin);pLoading->SetVisible(TRUE, TRUE);pLoading->Resume();}SStatic* pVideoDuration = _oleView.FindChildByName2<SStatic>(L"video_duration");if (pVideoDuration){pVideoDuration->SetWindowText(L"00:30");}_pObjHost->NotifyRichObjEvent(this, CLICK_VIDEOPLAY, 0, 0);return true;}void RichEditVideoOle::SetVideoPlayState(ReVideoState state){_state = state;if (REVIDEO_STATE_NORMAL == state){SWindow* pVideoWnd = _oleView.FindChildByName2<SWindow>(L"video_frame");if (pVideoWnd){SImageWnd* pVideoCoverWnd = pVideoWnd->FindChildByName2<SImageWnd>(L"video_cover_img");IBitmap* pFrameImg = SResLoadFromFile::LoadImage(_video_cover_path);if (pVideoCoverWnd && pFrameImg){pVideoCoverWnd->SetImage(pFrameImg);UpdateWindowLayout(pVideoCoverWnd);}}SImageView* pPlay = _oleView.FindChildByName2<SImageView>(L"play");ISkinObj* pPlaySkin = GETSKIN(L"skin.richvideo_play", 100);if (pPlay && pPlaySkin){pPlay->SetSkin(pPlaySkin);pPlay->SetVisible(TRUE, TRUE);pPlay->Resume();}SImageView* pLoading = _oleView.FindChildByName2<SImageView>(L"loading");ISkinObj* pLoadingSkin = GETSKIN(L"skin.richvideo_loading", 100);if (pLoading && pLoadingSkin){pLoading->SetSkin(pLoadingSkin);pLoading->SetVisible(FALSE, TRUE);pLoading->Resume();}SStatic* pVideoDuration = _oleView.FindChildByName2<SStatic>(L"video_duration");if (pVideoDuration){pVideoDuration->SetWindowText(L"00:30");}}}void RichEditVideoOle::UpdatePosition(){if (_spAdviseSink){_oleView.SetOleWindowRect(CRect(0, 0, 0, 0)); // 已经失效_oleView.Move(0, 0, _sizeNatural.cx, _sizeNatural.cy);CalculateExtentSize(_sizeNatural);_spAdviseSink->OnViewChange(DVASPECT_CONTENT, -1);}}

IID_VideoOleCtrl为控件GUID,可以自己生成。

接口说明:

InitOleWindow:初始化Ole窗口

GetVideoState:获取视频状态

GetVideoUrl:获取视频URL

GetVideoId:获取元素ID

GetVideoDuration:获取视频时长

OnBnClickPlay:播放按钮点击事件

void SetVideoPlayState:设置视频状态,主要是在下载完成后设置控件状态时使用

以下是布局相关xml:

<root><window pos="0,0,-0,-0" skin="skin.empty"><window name="video_frame" pos="0,0,-0,-0"><img name="video_cover_img" pos="0,0,-0,-0" /></window><image name="play" pos="130,60,-130,-60" cursor="hand" /><image name="loading" pos="130,60,-130,-60" /><window name="durationWnd" pos="0,-20,-0,-0" skin="skin.richvideo_timebg"><text name="video_duration" pos="-40,3,@40,@13" align="center" colorText="#FFFFFF" font="size:12" /></window></window>
</root>

控件需要在uires.idx文件中添加相关映射关系

注意事项跟《拓展SOUI中SImRichEdit控件的语音OLE控件(AudioOle)》中一样;

以下为使用示例代码:

        SStringW strVideo;std::string strVideoId = KfUtility::GenerateUUID();std::wstring wstrVideoId;KfUtility::ConvertUtf8ToUtf16(strVideoId, wstrVideoId);strVideo.Format(L"<video id=\"%s\" video_duration=\"120\" video_url=\"\" video_cover_path=\"D:\\imrepose\\trunk\\KFClient6\\output\\Debug_Unicode\\default_res\\location.jpg\" />", wstrAudioId.c_str());SStringW strContentVideo;strContentVideo.Format(L"<RichEditContent  type=\"ContentRight\" align=\"right\" auto-layout=\"1\">"L"<para break=\"1\" align=\"left\" />"L"<bkele data=\"avatar\" id=\"%s\" skin=\"%s\" left-pos=\"0,]-6,@40,@40\" right-pos=\"-50,]-10,@40,@40\" cursor=\"hand\" interactive=\"1\"/>"L"<para id=\"msgbody\" margin=\"65,0,45,0\" break=\"1\" simulate-align=\"1\">"        L"%s"L"</para>"L"<bkele data=\"bubble\" left-skin=\"skin_left_bubble\" right-skin=\"skin_right_otherbubble\" left-pos=\"50,{-9,[10,[10\" right-pos=\"{-10,{-9,-55,[10\" />"L"%s"L"</RichEditContent>",wstrId.c_str(), wstrFaceId.c_str(), strVideo, pEmpty);pRecvRichEdit->InsertContent(strContentVideo, RECONTENT_LAST);

控件效果图如下:

拓展SOUI中SImRichEdit控件的视频OLE控件(VideoOle)相关推荐

  1. PowerBuilder打开OLE控件页崩溃的解决办法

    PowerBuilder打开OLE控件页崩溃的解决办法 PB 执行 Insert -> OLE... -> Insert Control  - 崩溃 的解决办法 工具/原料 * PB12及 ...

  2. 浅谈ASP.NET 4中构造“.NET研究”HTML5视频控件

    在本文中,将一步步地指导你如何使用Visual Studio 2010和ASP.NET 4的相关知识,打造一个基于HTML5标准规范的视频播放控件,其中你会学习到一些关于HTML 5的知识,还会学到如 ...

  3. android 继承现有控件,Android继承现有控件拓展实现自定义控件textView

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文重点讨论继承现有 ...

  4. 海康威视视频ocx控件开发总结

    因工作需要,需要开发一个海康威视的视频ocx控件,嵌入到intouch,组态王一类的组态软件中使用. 之前从没做过ocx控件的开发,连MFC的开发也没做过,折腾了几天,终于基本完成.记录一下这个过程. ...

  5. dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件

    DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件,它和我们传统Winform的TreeView控件使用上有所不同,我一 ...

  6. vue树形结构html,怎么在vue中利用递归组件实现一个树形控件

    怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...

  7. C#中如何将光标定位在某个控件中?

    C#中如何将光标定位在某个控件中? 例子:当打开如下界面时,如何将光标定位在Form9界面中的用户名combox1框中? (1)首先将界面Form9事件中的shown选择Form9_Load,如下图所 ...

  8. Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)

    原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) ------------------------------ ...

  9. Leaflet中实现添加比例尺控件与自定义版权控件与链接

    场景 Leaflet快速入门与加载OSM显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122290880 上面加载显示 ...

最新文章

  1. 初识Linux C线程
  2. android eclipse 环境
  3. js window.event 对象学习
  4. C#中搜索关键词高亮显示
  5. 64位Ubuntu kylin 16.04 安装laptop mode解决关闭盖子无法唤醒,并解决安装此模式后鼠标间歇断电
  6. 上传图片插件鼠标手cursor:pointer;不生效
  7. Layui在表格中无法显示进度条(layui-progress)的值
  8. softmax函数_干货 | 浅谈Softmax函数
  9. YouTube视频数据分析报告
  10. 宏观经济学 马工程教材个人笔记整理
  11. 国家集训队 矩阵乘法
  12. 一个页面中有两个iframe
  13. 关于获取日周月的时间处理与日期联动处理
  14. 操作系统学习笔记(五)---进程同步
  15. Overlaps的压盖计数规则
  16. ipad协议最新替代
  17. python求15的因数_python学习第15期
  18. 【正向偏置和反向偏置的区别】
  19. 从 0-1 构建指标体系
  20. 什么是ISO(国际标准化组织)?

热门文章

  1. ev ev2 evplayer2加密视频播放器翻录录屏教程
  2. kali linux2.0安装中文输入法,KaliLinux安装中文输入法
  3. 数学建模学习笔记(2.3)lingo软件求解线性规划问题
  4. 第一章 计算机概要和技术
  5. 【RTX51 Tiny入门】01_RTX51 Full Tiny简介
  6. IT专业人士:Windows 7部署的攻坚兵
  7. Delphi 2007 代码补全、语句提示的快捷键是什么?
  8. 一文读懂:程序员为什么要学会画流程图 11种流程图的绘制工具:processon,wps,draw.io, 迅捷画图等 详细说明使用processon绘制流程图 详细说明绘制流程图
  9. 系统入门到实战学习某项技术、有问题找“百度“、学习优秀的技术博客、找开源代码等资料
  10. 计算机网络名为pc是什么意思啊,网络pc的意思 什么叫网络pc - 云骑士一键重装系统...