SOUI官方论坛

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

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

  [复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 97 天

    [LV.6]常住居民II

    13

    主题

    112

    帖子

    3323

    积分

    08:00大乘期

    Rank: 8Rank: 8

    积分
    3323
    发表于 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, 下载次数: 10, 下载积分: 金钱 -2

    售价: 1 SOUI币  [记录]

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 97 天

    [LV.6]常住居民II

    13

    主题

    112

    帖子

    3323

    积分

    08:00大乘期

    Rank: 8Rank: 8

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

    这代码有什么问题吗?
  • TA的每日心情
    开心
    昨天 10:37
  • 签到天数: 127 天

    [LV.7]常住居民III

    436

    主题

    1018

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

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

    没有问题,我在测试论坛的代码高亮插件,结果没一个能用的
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 97 天

    [LV.6]常住居民II

    13

    主题

    112

    帖子

    3323

    积分

    08:00大乘期

    Rank: 8Rank: 8

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

    其实Demo早写了,就是论坛的排版不会弄,浪费了不少时间:dizzy:
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    41

    主题

    424

    帖子

    2648

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2648

    突出贡献优秀版主

    发表于 2019-8-15 11:28:07 | 显示全部楼层
    其实你自己扩展一个swindow更简单。在这个swindow里重写layoutChildren,手动布局子窗口就好了。不需要构造SOUI的布局pos属性。
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 97 天

    [LV.6]常住居民II

    13

    主题

    112

    帖子

    3323

    积分

    08:00大乘期

    Rank: 8Rank: 8

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

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

    该用户从未签到

    8

    主题

    46

    帖子

    245

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    245
    发表于 2019-8-16 10:10:39 | 显示全部楼层
    大佬,请教一个问题,我在主界面创建了一个非模态窗口(继承SHostWnd),在关闭这个窗口时,整个程序都退出了,我只是想关闭创建的这个窗口
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 97 天

    [LV.6]常住居民II

    13

    主题

    112

    帖子

    3323

    积分

    08:00大乘期

    Rank: 8Rank: 8

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

    可能是你XML属性没做好设置吧
  • TA的每日心情
    开心
    昨天 10:37
  • 签到天数: 127 天

    [LV.7]常住居民III

    436

    主题

    1018

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

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

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

    该用户从未签到

    8

    主题

    46

    帖子

    245

    积分

    02:00元婴期

    Rank: 3Rank: 3

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

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

    本版积分规则

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

    GMT+8, 2020-7-6 00:33

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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