SOUI官方论坛

 找回密码
 立即注册
查看: 560|回复: 13

SOUI之动态插入及多分屏视频监控简单实现

  [复制链接]

12

主题

100

帖子

1582

积分

06:00合体期

Rank: 6Rank: 6

积分
1582
发表于 2019-8-14 18:30:49 | 显示全部楼层 |阅读模式
本帖最后由 xiaoke 于 2019-9-5 09:37 编辑

思路:通过查看SOUI源码,可通过main窗口调用CreateChildren函数实现
步骤:
1.先写一个组整体分屏子窗口XML的算法方法
2.调用CreateChildren动态插入窗口
3.根据父窗口的大小重新布局当前要显示都分屏
关键代码如下:
  1. void CMainDlg::CreateSlicesWnd(int sliceNum)//创建分屏
  2. {
  3.         SLOG_INFO("CMainDlg::CreateSlicesWnd()");
  4.         printf(SStringA().Format("CreateSlicesWnd num:%d -------------------- beg ***ke \n", sliceNum));

  5.         if (sliceNum > SLICE_WINDOWS)//如果大于最大分屏数则退出 用此方法有***问题
  6.                 return;
  7.         SWindow *video_wnd = FindChildByName("video");
  8.         if (video_wnd)
  9.         {
  10.                 CRect rect = video_wnd->GetWindowRect();
  11.                 int dx = 100 / (int)sqrt((double)sliceNum);
  12.                 int dy = 100 / (int)sqrt((double)sliceNum);
  13.                 int left = 0;
  14.                 int right = 0;
  15.                 int top = 0;
  16.                 int buttom = 0;
  17.                 int nNum = 0;

  18.                 SStringT strDlg;
  19.                 stringstream sTemp;
  20.                 std::string str("");
  21.                 std::string strLeft("");
  22.                 std::string strtop("");
  23.                
  24.                 for (int i = 1; i <= (int)sqrt((double)sliceNum); i++)
  25.                 {
  26.                         strLeft = "0,";
  27.                         strtop = "[1,%";

  28.                         for (int j = 1; j <= (int)sqrt((double)sliceNum); j++)
  29.                         {
  30.                                 strDlg.Format(_T("%d"), nNum);

  31.                                 left = (j - 1)*dx;
  32.                                 right = j*dx;
  33.                                 top = (i - 1)*dy;
  34.                                 buttom = i*dy;

  35.                                 if (j != 1)
  36.                                 {
  37.                                         strLeft = "[1,";
  38.                                         strtop = "{0,%";
  39.                                 }

  40.                                 str += "<window pos="";
  41.                                 str += strLeft;
  42.                                 str += strtop;

  43.                                 sTemp << right;
  44.                                 str += sTemp.str();
  45.                                 str += ",%";

  46.                                 sTemp.str("");
  47.                                 sTemp << buttom;
  48.                                 str += sTemp.str();
  49.                                 str += "" colorBkgnd = "RGB(0, 0, 0)" name = "video_show";

  50.                                 sTemp.str("");
  51.                                 sTemp << nNum;
  52.                                 str += sTemp.str();
  53.                                 str += ""><realwnd pos = "3, 3, -3, -3" name = "vlcwnd";
  54.                                 str += sTemp.str();
  55.                                 str += "" wndclass = "videoforms" show="1"><realwnd pos = "0,0,-0,-0" name = "videodlg";
  56.                                 str += sTemp.str();
  57.                                 str += "" wndclass = "videoforms"></realwnd></realwnd></window>";//cache = "1"
  58.                                 nNum++;
  59.                         }
  60.                 }
  61.                 video_wnd->CreateChildren(S_CA2W(str.c_str()));

  62.                 video_wnd->Invalidate();

  63.                 printf(SStringA().Format("CreateSlicesWnd num:%d -------------------- end ***ke \n", sliceNum));
  64.         }
  65. }
复制代码
  1. void CMainDlg::MoveSlicesWnd(int sliceNum)//排列分屏
  2. {
  3.         m_bMoveSlice = true;
  4.         SLOG_INFO("CMainDlg::MoveSlicesWnd()");
  5.         printf(SStringA().Format("MoveSlicesWnd num:%d -------------------- beg ***ke \n", sliceNum));

  6.         if (sliceNum > SLICE_WINDOWS)//如果大于最大分屏数则退出 用此方法有***问题
  7.                 return;
  8.         SStringW dlgName;
  9.         for (int i = 0; i < SLICE_WINDOWS; i++)
  10.         {
  11.                 dlgName = SStringW().Format(L"video_show%d", i);
  12.                 SWindow   *p_videoWnd = FindChildByName2<SWindow>(dlgName);
  13.                 if (p_videoWnd)
  14.                 {
  15.                         if (1 == sliceNum)
  16.                         {
  17.                                 if (0 == i)
  18.                                         p_videoWnd->SetAttribute(L"pos", L"0, 0, -0, -0");
  19.                                 else
  20.                                         p_videoWnd->SetAttribute(L"show", L"0");

  21.                         }
  22.                         else if (4 == sliceNum)
  23.                         {
  24.                                 p_videoWnd->SetAttribute(L"show", L"1");
  25.                                 if (0 == i)
  26.                                         p_videoWnd->SetAttribute(L"pos", L"0,0,%50,%50");
  27.                                 else if (1 == i)
  28.                                         p_videoWnd->SetAttribute(L"pos", L"[1,0,-0,%50");
  29.                                 else if (2 == i)
  30.                                         p_videoWnd->SetAttribute(L"pos", L"0,[1,%50,-0");
  31.                                 else if (3 == i)
  32.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,-0,-0");
  33.                                 else
  34.                                         p_videoWnd->SetAttribute(L"show", L"0");
  35.                         }
  36.                         else if (9 == sliceNum)
  37.                         {
  38.                                 // 九分屏的
  39.                                 p_videoWnd->SetAttribute(L"show", L"1");
  40.                                 if (0 == i)
  41.                                         p_videoWnd->SetAttribute(L"pos", L"%0,%0,%33,%33");
  42.                                 else if (1 == i)
  43.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%66,%33");
  44.                                 else if (2 == i)
  45.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%100,%33");
  46.                                 else if (3 == i)
  47.                                         p_videoWnd->SetAttribute(L"pos", L"0,[1,%33,%66");
  48.                                 else if (4 == i)
  49.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%66,%66");
  50.                                 else if (5 == i)
  51.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%100,%66");
  52.                                 else if (6 == i)
  53.                                         p_videoWnd->SetAttribute(L"pos", L"0,[1,%33,%100");
  54.                                 else if (7 == i)
  55.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%66,%100");
  56.                                 else if (8 == i)
  57.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%100,%100");
  58.                                 else
  59.                                         p_videoWnd->SetAttribute(L"show", L"0");
  60.                         }
  61.                         else if (16 == sliceNum)
  62.                         {
  63.                                 // 十六分屏的
  64.                                 if (0 == i)
  65.                                         p_videoWnd->SetAttribute(L"pos", L"0,[1,%25,%25");
  66.                                 else if (1 == i)
  67.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%50,%25");
  68.                                 else if (2 == i)
  69.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%75,%25");
  70.                                 else if (3 == i)
  71.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%100,%25");
  72.                                 else if (4 == i)
  73.                                         p_videoWnd->SetAttribute(L"pos", L"0,[1,%25,%50");
  74.                                 else if (5 == i)
  75.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%50,%50");
  76.                                 else if (6 == i)
  77.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%75,%50");
  78.                                 else if (7 == i)
  79.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%100,%50");
  80.                                 else if (8 == i)
  81.                                         p_videoWnd->SetAttribute(L"pos", L"0,[1,%25,%75");
  82.                                 else if (9 == i)
  83.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%50,%75");
  84.                                 else if (10 == i)
  85.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%75,%75");
  86.                                 else if (11 == i)
  87.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%100,%75");
  88.                                 else if (12 == i)
  89.                                         p_videoWnd->SetAttribute(L"pos", L"0,[1,%25,%100");
  90.                                 else if (13 == i)
  91.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%50,%100");
  92.                                 else if (14 == i)
  93.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%75,%100");
  94.                                 else if (15 == i)
  95.                                         p_videoWnd->SetAttribute(L"pos", L"[1,{0,%100,%100");
  96.                                 p_videoWnd->SetAttribute(L"show", L"1");
  97.                         }

  98.                 }
  99.         }
  100.         m_bMoveSlice = false;

  101.         printf(SStringA().Format("MoveSlicesWnd num:%d -------------------- end ***ke \n", sliceNum));
  102. }
复制代码

代码都是很简单逻辑,最后实现效果如下(双击看大图效果)

源码-网盘链接: https://pan.baidu.com/s/1_Cd6671vo-AjlkWyWLr20g

动态插入分屏实现

动态插入分屏实现

简单播放逻辑

简单播放逻辑

show.zip

940.84 KB, 下载次数: 8, 下载积分: 金钱 -2

售价: 1 SOUI币  [记录]

12

主题

100

帖子

1582

积分

06:00合体期

Rank: 6Rank: 6

积分
1582
 楼主| 发表于 2019-8-14 22:42:29 | 显示全部楼层

这代码有什么问题吗?

303

主题

656

帖子

4623

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4623
发表于 2019-8-14 22:47:43 | 显示全部楼层
xiaoke 发表于 2019-8-14 22:42
这代码有什么问题吗?

没有问题,我在测试论坛的代码高亮插件,结果没一个能用的

12

主题

100

帖子

1582

积分

06:00合体期

Rank: 6Rank: 6

积分
1582
 楼主| 发表于 2019-8-14 22:51:51 | 显示全部楼层

其实Demo早写了,就是论坛的排版不会弄,浪费了不少时间:dizzy:

16

主题

194

帖子

785

积分

版主

Rank: 7Rank: 7Rank: 7

积分
785

突出贡献优秀版主

发表于 2019-8-15 11:28:07 | 显示全部楼层
其实你自己扩展一个swindow更简单。在这个swindow里重写layoutChildren,手动布局子窗口就好了。不需要构造SOUI的布局pos属性。

12

主题

100

帖子

1582

积分

06:00合体期

Rank: 6Rank: 6

积分
1582
 楼主| 发表于 2019-8-15 11:33:13 | 显示全部楼层
setoutsoft 发表于 2019-8-15 11:28
其实你自己扩展一个swindow更简单。在这个swindow里重写layoutChildren,手动布局子窗口就好了。不需要构造 ...

是么 好的 抽空试试 谢谢老大{:3_46:} 久不接触SOUI了 更新太大了

5

主题

29

帖子

147

积分

24:00金丹期

Rank: 2

积分
147
发表于 2019-8-16 10:10:39 | 显示全部楼层
大佬,请教一个问题,我在主界面创建了一个非模态窗口(继承SHostWnd),在关闭这个窗口时,整个程序都退出了,我只是想关闭创建的这个窗口

12

主题

100

帖子

1582

积分

06:00合体期

Rank: 6Rank: 6

积分
1582
 楼主| 发表于 2019-8-16 11:30:08 | 显示全部楼层
WuFuck 发表于 2019-8-16 10:10
大佬,请教一个问题,我在主界面创建了一个非模态窗口(继承SHostWnd),在关闭这个窗口时,整个程序都退出 ...

可能是你XML属性没做好设置吧

303

主题

656

帖子

4623

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4623
发表于 2019-8-16 11:31:33 | 显示全部楼层
WuFuck 发表于 2019-8-16 10:10
大佬,请教一个问题,我在主界面创建了一个非模态窗口(继承SHostWnd),在关闭这个窗口时,整个程序都退出 ...

你的问题在你的帖子里老大不是回复过了吗?那个不对吗?

5

主题

29

帖子

147

积分

24:00金丹期

Rank: 2

积分
147
发表于 2019-8-16 11:35:25 | 显示全部楼层
admin 发表于 2019-8-16 11:31
你的问题在你的帖子里老大不是回复过了吗?那个不对吗?

对对对,已经解决了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|SOUI官方论坛 ( 粤ICP备18103663号-2 )

GMT+8, 2019-12-11 02:57

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表