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" };
问题是:
- 如何创建一个数组(或者我上面的例子看起来正确吗?)来容纳固定字符串,如“Rock”、“Rap”、“Soul”等?
- 如何修改 VALUE 行以显示包含已解析流派标签的下拉菜单,然后在打开时显示 191 个流派标签,供 select 编辑以供选择(并最终保存这已经在工作了)。
- 实际代码,而不是对 docs.microsoft.com 的引用,当我尝试更改我假设的 AddProperties 时,我尝试的一些事情崩溃了,因为使用了 lpkDoc 指针。
如果没有充分的理由,您不应该使用普通的旧 C 风格数组。请改用 std::vector
。您甚至不需要指明 [size]
。
char *
也是如此。请改用 CString
或 std::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->m_pk
变量在任何地方初始化,我敢打赌这些指针指向无人区。
我需要一些指导,了解如何在解析 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" };
问题是:
- 如何创建一个数组(或者我上面的例子看起来正确吗?)来容纳固定字符串,如“Rock”、“Rap”、“Soul”等?
- 如何修改 VALUE 行以显示包含已解析流派标签的下拉菜单,然后在打开时显示 191 个流派标签,供 select 编辑以供选择(并最终保存这已经在工作了)。
- 实际代码,而不是对 docs.microsoft.com 的引用,当我尝试更改我假设的 AddProperties 时,我尝试的一些事情崩溃了,因为使用了 lpkDoc 指针。
如果没有充分的理由,您不应该使用普通的旧 C 风格数组。请改用
std::vector
。您甚至不需要指明[size]
。char *
也是如此。请改用CString
或std::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->m_pk
变量在任何地方初始化,我敢打赌这些指针指向无人区。