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

MFC MDI CMFCPropertyGridProperty adding Array for dropdown list merging MP4 tag data

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

对象看起来像这样information.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;

现在我知道可以在第 2 列(值)中进行下拉,因为其他标签具有简单的 TRUE/FALSE 可以 selected,所以这告诉我应该可以创建我想要做的下拉列表。 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" };

问题是:

  1. 如何创建一个数组(或者我上面的例子看起来正确吗?)来容纳固定字符串,如“Rock”、“Rap”、“Soul”等?
  2. 如何修改 VALUE 行以显示包含已解析流派标签的下拉菜单,然后在打开时显示 191 个流派标签,供 select 编辑以供选择(并最终保存这已经在工作了)。
  3. 实际代码,而不是对 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 对象中不应包含有关属性的代码。您正在将业务逻辑与用户交互逻辑混合在一起。您以后的代码维护起来将是一场噩梦。

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