MFC MDI CMFCPropertyGridProperty 添加数组用于下拉列表合并 MP4 标签数据

Posted

技术标签:

【中文标题】MFC MDI CMFCPropertyGridProperty 添加数组用于下拉列表合并 MP4 标签数据【英文标题】:MFC MDI CMFCPropertyGridProperty adding Array for dropdown list merging MP4 tag data 【发布时间】:2021-03-22 14:15:22 【问题描述】:

在解析 MP4 标签数据的读取信息后,我需要一些关于如何从数据数组中添加下拉列表的指导。我使用的机制是 100% 可操作的,这是一个生物特征添加。我正在使用的 MP4 标签是使用 ID3V1 标准的流派。有 191 种选择。我的应用程序被继承的方式,有 2 列,属性/值和多行。所有这些都有效。流派标签是随意设置的,所以你基本上可以输入任何内容,它会存储它。我想删除它并使用下拉列表选择数组中的 191 个元素。加载过程的一部分是它将拉入 MP4 文件中的任何内容。所以,我希望用户能够原样离开(很可能被支持 ID3V2 的东西标记),或者从下拉列表中填充的 191 个元素中进行选择。

对象看起来像这样的信息。h:

protected:
    CMFCPropertyGridCtrl m_wndProperties;

information.cpp 如下所示:

void CInformationView::OnInitialUpdate()

    // create property grid
    VERIFY(m_wndProperties.Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP| WS_BORDER, CRect(0,0,0,0), this, 0));

    // get document
    CMovieDoc *lpkDoc = GetDocument();
    ASSERT_VALID_PTR(lpkDoc);

    // add properties //Information ORDER Loading <<<<< List shortened Stack overflow question
    m_wndProperties.AddProperty(lpkDoc->m_pkArtist);
    m_wndProperties.AddProperty(lpkDoc->m_pkTempo);
    m_wndProperties.AddProperty(lpkDoc->m_pkGenre);

    CView::OnInitialUpdate();

它从 mp4.cpp 中提取数据的方式:

// Genre
m_pkGenre = new CMFCPropertyGridProperty(_T("Genre"),
    COleVariant(AfxStringFromUtf8(lptTags->genre), VT_BSTR));

mp4.h 中的指针:

CMFCPropertyGridProperty *m_pkArtist;
CMFCPropertyGridProperty *m_pkTempo;
CMFCPropertyGridProperty *m_pkGenre;

现在我知道可以在第二列(值)中进行下拉,因为其他标签具有可以选择的简单 TRUE/FALSE,所以这告诉我应该可以创建我正在寻找的下拉列表去做。 TRUE/FALSE 的示例如下所示:

// Compilation
m_pkCompilation = new CMFCPropertyGridProperty(_T("Compilation"),
    COleVariant((!VALID_PTR(lptTags->compilation)) ? (short)0 : (short)*lptTags->compilation, VT_BOOL));

我已经用 C 语言为微控制器之类的东西做过数组,但不完全确定它在 C++ 中是否相同。我想它应该是这样的:

// Initialize Genre Array
const char *genre[4] =  "Rock", "Rap", "Soul", "House" ;

问题是:

    如何创建一个数组(或者我上面的示例看起来是否正确?)来容纳固定字符串,如“Rock”、“Rap”、“Soul”等? 如何修改 VALUE 行以显示包含已解析的流派标签的下拉菜单,然后在打开时显示 191 个流派标签,其中一个可供选择(并最终保存已经工作的标签)。 实际代码,不是对 docs.microsoft.com 的引用,当我尝试更改我假设的 AddProperties 时,由于使用了 lpkDoc 指针,我尝试过的几件事会崩溃。

【问题讨论】:

【参考方案1】:

    如果您没有充分的理由,则不应使用普通的旧 C 样式数组。请改用std::vector。您甚至不需要指明[size]char * 也是如此。请改用CStringstd::string

    const std::vector<CString> =  L"Rock", L"Rap", L"Soul", L"House" ;
    

不要让你的生活变得过于艰难。

2.

for (size_t i= 0; i < genre.size(); i++)

     auto gnr= genre[i];
     lpkDoc->m_pkGenre->AddOption(gnr);

甚至更好

for (auto it : genre)

     lpkDoc->m_pkGenre->AddOption(it);

重要提示:您的 doc 对象中不应包含有关属性的代码。您正在将业务逻辑与用户交互逻辑混合。将来您的代码维护起来将是一场噩梦。

    我没有看到你的 lpkDoc-&gt;m_pk 变量在任何地方初始化,我敢打赌那些指针指向无人区。

【讨论】:

感谢 Vector 的提示,我会尝试使用 AddOption 来填充循环标签。我也没有看到它们的初始化位置,所以我这样做了:CMFCPropertyGridProperty *m_pkAlbum = 0;使所有指针从 0 开始,验证对操作没有影响。在业务方面……这是有原因的放弃源代码……我保留了原因并大量修改了 GUI 以获得更好的用户交互。我正在尝试在不影响操作的情况下进行修复。谢谢你的帮助,会反馈的。克里斯 这是一种享受...必须将数组更改为: const std::vector Genre = L"Rock", L"Rap", L"Soul", L"房子” ; (即缺少流派标识符!)。使用选项#2....加载并走出大门....太棒了!泰!肯定是一次很好的学习体验。 仅供参考,选项 3 抛出此错误:错误 C2664 'BOOL CMFCPropertyGridProperty::AddOption(LPCTSTR,BOOL)': cannot convert argument 1 from 'const WCHAR' to 'LPCTSTR' ----- ---- for (*it); 对于 2. 删除 *。我认为这是一个指针。 对于 1. CMFCPropertyGridProperty *m_pkAlbum = 0; 这只是白痴,每次访问那里时,都会因尝试从空指针获取数据而导致崩溃。您需要在某处已经定义或使用new 创建一个。

以上是关于MFC MDI CMFCPropertyGridProperty 添加数组用于下拉列表合并 MP4 标签数据的主要内容,如果未能解决你的问题,请参考以下文章

MFC - 当最大化子窗口的标题很长时,MDI 主框架标题被截断

保存工作区 MFC C++ MDI

使用 MFC 功能区升级 MDI 应用程序

mfc中MDI模式下实现单文档多视图多窗口

MFC MDI 无打开文档 = 禁用新文件

MFC项目组合:如何将没有文档类的SDI应用程序添加到MDI应用程序中?应该使用子窗口吗?[MFC]