大约1个半月前,发布了自己写的HEVC码流分析工具。当时的版本显示语法元素使用是的Edit控件。很多主流分析工具都使用树形控件,看上去觉得比较高端,于是在纠结一天后下定决心自己也实现树形的HEVC语法显示。经历漫长的业余时间,终于完成了,于是便有了此文。

树形控件可展开、折叠内容,无论是显示还是外观,都比较一般的编辑框好,所以最终还是选择树形控件。刚开始了解时,网上完整的资料不多,还以为很复杂,搞完后,其实并不复杂。更多的是工作量,因为要将所有的语法元素一一修改。

在VS中拖一个Tree Control到界面上,其属性可以在资源视图中设置,也可以在代码中设置。在资源视图中,设置“Has Bottons”、“Has Lines”、“Lines At Root”的值为True即可。

下面是一个小示例:

#define AddTreeItem(item, buffer) m_cTree.InsertItem(buffer,item)HTREEITEM hItem = m_cTree.InsertItem("根节点NAL",TVI_ROOT);///rootCString strTemp;strTemp.Format("NAL头节点nal_unit_header");HTREEITEM hSubItem = AddTreeItem(hItem, strTemp.GetBuffer());strTemp.Format("forbidden_zero_bit \t\t:0 (1 bit)");AddTreeItem(hSubItem, strTemp.GetBuffer());strTemp.Format("nal_unit_type \t\t:32 (6 bit)");AddTreeItem(hSubItem, strTemp.GetBuffer());strTemp.Format("nal_ref_idc \t\t:0 (6 bit)");AddTreeItem(hSubItem, strTemp.GetBuffer());strTemp.Format("nuh_temporal_id_plus1 \t\t:0 (3 bit)");AddTreeItem(hSubItem, strTemp.GetBuffer());strTemp.Format("VPS节点video_parameter_set_rbsp()");HTREEITEM hItem1 = AddTreeItem(hItem, strTemp.GetBuffer());strTemp.Format("header()");HTREEITEM hItem2 = AddTreeItem(hItem1, strTemp.GetBuffer());strTemp.Format("fist slice)");AddTreeItem(hItem2, strTemp.GetBuffer());strTemp.Format("no output");AddTreeItem(hItem2, strTemp.GetBuffer());strTemp.Format("data()");AddTreeItem(hItem1, strTemp.GetBuffer());

代码很简单,主要调用InsertItem函数,该函数有很多个重载函数,这里用的是两个参数,第一个要显示的字符串,第二个是要在哪个节点上插入,根节点的值为TVI_ROOT。

下面是上述代码在不同的外观风格的图示:

可见,下图具有明显优势。

在文章《我的YUV播放器MFC小笔记:设置picture控件背景为黑色、窗口缩放》中简单记录了如何实现窗口缩放。这个工具有一点不同,就是使用缩放比例对各控件进行缩放。

首先在对话框初始化中获取主窗口坐标:

// 主窗口大小GetClientRect(&m_rectMainWnd);

在窗口缩放的响应函数OnSize中通过中cx和主窗口的Width计算X轴比例,cy和Height计算Y轴比例:

    float fXRatio = (float)cx / (float)(m_rectMainWnd.Width());float fYRatio = (float)cy / (float)(m_rectMainWnd.Height());

在实际测试发现,只有用GetClientRect获致的坐标、宽高,才能与OnSize函数的参数cx、cy对应起来。另外使用GetWindowRect和ScreenToClient用于确定控件的坐标和大小。真正调整位置的函数为MoveWindow。下面以工具左上角的列表框控件为例给出示例代码:

    // 获取列表框坐标CRect rectList;GetDlgItem(IDC_H264_NALLIST)->GetWindowRect(&rectList);ScreenToClient(rectList);// 计算比例float fXRatio = (float)cx / (float)(m_rectMainWnd.Width());float fYRatio = (float)cy / (float)(m_rectMainWnd.Height());int nNewWidth = 0;int nNewHeight = 0;// 重新移动列表框pWnd = GetDlgItem(IDC_H264_NALLIST);nNewWidth = (int)(fXRatio * (float)rectList.Width());nNewHeight = (int)(fYRatio * (float)rectList.Height());pWnd->MoveWindow(rectList.left, rectList.top, nNewWidth, nNewHeight);pWnd->Invalidate();pWnd->UpdateData();// 更新,以便下面的控件可参考pWnd->GetWindowRect(&rectList);ScreenToClient(rectList);

具体的代码,可以参考代码仓库: https://github.com/latelee/H264BSAnalyzer

李迟 2015.11.18 晚

我的HEVC码流分析工具MFC小笔记:树形控件使用及窗口缩放相关推荐

  1. 完成一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  2. 一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  3. MFC小笔记:控件随窗口变化

    一.需求 当窗口大小变化时,如最大化.最小化时,控件位置和大小并没有变化,本文实现此功能. 二.界面 主界面为对话框,有最小化.最大化.关闭等功能. 三.原理 当窗口变化时,响应 OnSize 函数, ...

  4. android代码流分析工具,视频码流分析工具(Elecard StreamAnalyzer)下载 v4.0.171116 官方版 - 比克尔下载...

    Elecard StreamAnalyzer是一个专业的视频码流分析工具,拥有码流错误报告.TS错误侦测和基于ETSI TR101-290的分析功能,能够对编码器媒体流进行深入的句法分析,支持H.26 ...

  5. 实现一个avs2码流分析工具

    最近在做avs2编码器项目,但是却没有成熟的码流分析工具,于是抽空学习了QT,业余时间写了一个avs2码流分析工具. 软件的界面如下: 图1.avs2码流分析仪界面 UI的左边框为NAL列表或者语法元 ...

  6. FFmpeg入门详解之12:Elecard Stream Analyzer码流分析工具

    简介 Elecard Stream Analyzer是一款简单小巧的码流分析工具,通过该软件,用户可以快速的分析查看视频序列码流:软件操作简单,使用方便,用户只需将视频文件导入软件内,系统就会自动帮您 ...

  7. Elecard Stream Analyzer码流分析工具

    1.简介   Elecard Stream Analyzer是一款简单小巧的码流分析工具,通过该软件,用户可以快速的分析查看视频序列码流:软件操作简单,使用方便,用户只需将视频文件导入软件内,系统就会 ...

  8. H264/H265/YUV码流分析工具推荐(一)

    1.CodecVisa(跨平台:H264/H265...) http://www.codecian.com/downloads.html2.H264BSAnalyzer(H264/H265) http ...

  9. H264码流分析工具

    概述 本文作为一个笔记,记录笔者学习H264码流的过程.重点记录使用工具分析H264码流.使用该工具,可方便查看码流中NALU的结构,为我们学习和理解有很大帮助. H264码流介绍 笔者直接参考:ht ...

最新文章

  1. 基于三层BP神经网络的人脸识别
  2. Python基础----python的使用(二)
  3. Nginx —— nginx的命令行控制(nginx的启动与停止、重载配置文件、回滚日志文件、平滑升级等操作)
  4. kalman滤波的解释
  5. easyDarwin--开源流媒体实现
  6. Android利用Jsoup解析html 开发网站客户端小记。
  7. linux下vim的安装与配置(centos)
  8. [转]DPM2012系列之十九:配置辅助备份服务器
  9. OpenLinux平台学习(参照Neoway N720/N75 系列产品)
  10. 从古代遗传下来的设计值得一看!
  11. C# Wpf Binding 使用详解
  12. 洛谷P1725 琪露诺(单调队列优化dp)
  13. lempel ziv matlab,1.9 Lempel-Ziv算法
  14. python之freshman00
  15. Linux磁盘分区以及多重引导简述
  16. unity接入facebook SDK时 警告:“OpenSSL not found. Make sure that OpenSSL is installed
  17. Perforce 密码有效期
  18. adreno源码系列(九)全局内存申请
  19. UA:User-agent是什么?
  20. npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the node-sass@4.14.1 postinstall script.

热门文章

  1. 史上最大内存!曝iPhone 14 Pro系列运行内存将增至8GB
  2. 三部门部署开展非学科类校外培训收费专项整治工作
  3. 最新数据:中国网民超10亿,中老年群体增速最快
  4. 网红品牌,都是“营销狗”?
  5. 二手机Q1行情报告:iPhone 11、华为Mate、P40(5G)等小幅涨价
  6. 一个德国设计奖,怎么就成了中国品牌的财富密码
  7. 苹果关闭iOS 14.1验证通道,阻止 iOS 14.2 降级
  8. 刚嘲讽过iPhone 12,三星就打算“抄”了:取消赠送充电头和耳机?
  9. 京东健康上线“新冠病毒”核酸检测 在线预约服务
  10. 打扰了!MacBook Pro 16英寸国行版正式开售:顶配46421元