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

原创 2015年11月18日 21:35:11

大约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);///root
    CString 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 晚

版权声明:本文为迟思堂主人李迟原创文章,如转载请注明出处,并附带原文超链接地址。用于商业用途请付稿费¥100/千字。谢谢。

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

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

HEVC码流简单分析

初步分析了一下HEVC的码流。 使用了Elecard HEVC Analyzer打开了一个《阿凡达>720P的视频片段 P帧得到如下结果: 宏块划分 运动矢量: CU的大小: QP: ...
  • leixiaohua1020
  • leixiaohua1020
  • 2013年09月20日 13:03
  • 15728

H.265/HEVC学习笔记之二:码流分析

与H.264/AVC类似,H.265/HEVC采用了视频编码层(Video Code Layer,VCL)和网络适配层(Network Abstract Layer,NAL),VLC层包含了视频数据的...
  • c250456789
  • c250456789
  • 2017年03月16日 17:04
  • 886

单文档mfc添加树形控件

本文转自:http://blog.csdn.net/lh1162810317/article/details/11820889 一般的控件在基于对话框的mfc程序中使用非常方便,但在单文档的mfc中...
  • zhaoxiatengkong_1
  • zhaoxiatengkong_1
  • 2013年09月21日 08:44
  • 1561

MFC 对话框所有控件同时缩放

一、将对话框属性设置为 Resizing
  • coolcool13
  • coolcool13
  • 2014年05月26日 12:05
  • 1265

完成一个分析H264码流的工具

最近又开始搞视频相关的东西了。之前一直对H264有畏惧,觉得太难,现在开始慢慢去接触它,了解它。无意中,看到网上有人对H264码流进行分析。地址:http://blog.csdn.net/leixia...
  • subfate
  • subfate
  • 2014年02月28日 18:00
  • 3759

MFC 树形控件与列表控件

初始化区域代码: // TODO: 在此添加额外的初始化代码 srand(time(NULL)); // 添加位图资源,必须要全局变量才行 m_treeImageListRoot.Cr...
  • fulianzhou
  • fulianzhou
  • 2015年10月07日 21:44
  • 2137

MFC界面控件自动缩放

/*重写Onsize */ void CVehiclesim::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, ...
  • qing666888
  • qing666888
  • 2014年09月20日 20:07
  • 917

MFC树形控件(CTreeCtrl)用法(下)

前面一节讲了树形控件Tree Control的简介、通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建、CTreeCtrl类的主要成员函数和应用实例。        树形控件的...
  • wang15061955806
  • wang15061955806
  • 2016年07月04日 13:51
  • 2327

EasyICE TS流分析软件 -使用说明

EasyICE TS流分析软件使用说明
  • charleslei
  • charleslei
  • 2016年12月18日 18:54
  • 2970
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的HEVC码流分析工具MFC小笔记:树形控件使用及窗口缩放
举报原因:
原因补充:

(最多只允许输入30个字)