拓展SOUI中SImRichEdit控件的视频OLE控件(VideoOle)
视频定位控件数据可分为两部分:
可见部分:播放按钮、加载按钮、视频第一帧图片、视频时长
不可见部分:视频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)相关推荐
- PowerBuilder打开OLE控件页崩溃的解决办法
PowerBuilder打开OLE控件页崩溃的解决办法 PB 执行 Insert -> OLE... -> Insert Control - 崩溃 的解决办法 工具/原料 * PB12及 ...
- 浅谈ASP.NET 4中构造“.NET研究”HTML5视频控件
在本文中,将一步步地指导你如何使用Visual Studio 2010和ASP.NET 4的相关知识,打造一个基于HTML5标准规范的视频播放控件,其中你会学习到一些关于HTML 5的知识,还会学到如 ...
- android 继承现有控件,Android继承现有控件拓展实现自定义控件textView
通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文重点讨论继承现有 ...
- 海康威视视频ocx控件开发总结
因工作需要,需要开发一个海康威视的视频ocx控件,嵌入到intouch,组态王一类的组态软件中使用. 之前从没做过ocx控件的开发,连MFC的开发也没做过,折腾了几天,终于基本完成.记录一下这个过程. ...
- dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件
DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件,它和我们传统Winform的TreeView控件使用上有所不同,我一 ...
- vue树形结构html,怎么在vue中利用递归组件实现一个树形控件
怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...
- C#中如何将光标定位在某个控件中?
C#中如何将光标定位在某个控件中? 例子:当打开如下界面时,如何将光标定位在Form9界面中的用户名combox1框中? (1)首先将界面Form9事件中的shown选择Form9_Load,如下图所 ...
- Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)
原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) ------------------------------ ...
- Leaflet中实现添加比例尺控件与自定义版权控件与链接
场景 Leaflet快速入门与加载OSM显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122290880 上面加载显示 ...
最新文章
- 初识Linux C线程
- android eclipse 环境
- js window.event 对象学习
- C#中搜索关键词高亮显示
- 64位Ubuntu kylin 16.04 安装laptop mode解决关闭盖子无法唤醒,并解决安装此模式后鼠标间歇断电
- 上传图片插件鼠标手cursor:pointer;不生效
- Layui在表格中无法显示进度条(layui-progress)的值
- softmax函数_干货 | 浅谈Softmax函数
- YouTube视频数据分析报告
- 宏观经济学 马工程教材个人笔记整理
- 国家集训队 矩阵乘法
- 一个页面中有两个iframe
- 关于获取日周月的时间处理与日期联动处理
- 操作系统学习笔记(五)---进程同步
- Overlaps的压盖计数规则
- ipad协议最新替代
- python求15的因数_python学习第15期
- 【正向偏置和反向偏置的区别】
- 从 0-1 构建指标体系
- 什么是ISO(国际标准化组织)?
热门文章
- ev ev2 evplayer2加密视频播放器翻录录屏教程
- kali linux2.0安装中文输入法,KaliLinux安装中文输入法
- 数学建模学习笔记(2.3)lingo软件求解线性规划问题
- 第一章 计算机概要和技术
- 【RTX51 Tiny入门】01_RTX51 Full Tiny简介
- IT专业人士:Windows 7部署的攻坚兵
- Delphi 2007 代码补全、语句提示的快捷键是什么?
- 一文读懂:程序员为什么要学会画流程图 11种流程图的绘制工具:processon,wps,draw.io, 迅捷画图等 详细说明使用processon绘制流程图 详细说明绘制流程图
- 系统入门到实战学习某项技术、有问题找“百度“、学习优秀的技术博客、找开源代码等资料
- 计算机网络名为pc是什么意思啊,网络pc的意思 什么叫网络pc - 云骑士一键重装系统...