- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类似的问题here但是这个新问题的上下文不同。
我有这个变量:PublisherMap m_mapPublishers;
PublisherMap
的定义是:
using PublisherMap = std::map<CString, S_DEMO_ENTRY_EX>;
我有这个读取 map 并填充 CListBox
的方法:
bool CChristianLifeMinistryPersonalCopiesDlg::InitPublishersGrid()
{
try
{
m_lbPublishers.ResetContent();
for (auto & mapPublisher : m_mapPublishers)
{
bool bInclude = false;
if (m_iDisplayMode == DISPLAY_EVERYONE)
bInclude = true;
else if (m_iDisplayMode == DISPLAY_BROTHER && mapPublisher.second.eGender == GENDER_MALE)
bInclude = true;
else if (m_iDisplayMode == DISPLAY_SISTER && mapPublisher.second.eGender == GENDER_FEMALE)
bInclude = true;
if (bInclude && m_bLimitDisplay)
{
CString strTemp;
if (!m_mapSSAssignedPublishers.Lookup(mapPublisher.first, strTemp))
bInclude = FALSE;
}
if (bInclude)
{
int i = m_lbPublishers.AddString(mapPublisher.first);
m_lbPublishers.SetItemData(i, MAKEWPARAM(mapPublisher.second.eGender, mapPublisher.second.eAppointed));
}
}
}
catch (_com_error e)
{
LPCTSTR szError = e.ErrorMessage();
AfxMessageBox(szError);
return false;
}
catch (CException* e)
{
e->Delete();
AfxMessageBox(_T("CException"));
return false;
}
m_iSelectMode = SELECT_NONE;
UpdateData(FALSE);
return true;
}
请注意,我使用了项目数据:
m_lbPublishers.SetItemData(i,
MAKEWPARAM(mapPublisher.second.eGender, mapPublisher.second.eAppointed));
它工作得很好。如果我使用的是 CPtrArray
,我会为列表框中的每个条目分配实际的结构对象指针。
我不太了解 std::map
的机制。有什么安全的方法可以直接将 map (mapPublisher
) 中的每个条目与每个列表框条目相关联,以便我以后可以访问它?
我意识到我可以获取列表框条目的文本,然后在 map 中找到它并以这种方式获取它。但是否有更直接的方法将两者联系在一起呢?
最佳答案
std::map
被指定为从不移动现有元素的关联容器,参见 [associative.reqmts]/9 :
The
insert
andemplace
members shall not affect the validity of iterators and references to the container, and theerase
members shall invalidate only iterators and references to the erased elements.
在实践中,它通常被实现为红黑树。
所以保留指向现有元素的指针是安全的,只要它们的生命周期超过指针的生命周期。
请注意,如果您切换到 std::unordered_map
( HashMap ),您将失去该保证。
设置:
m_lbPublishers.SetItemDataPtr(i, &mapPublisher.second);
检索:
auto psEntry = (S_DEMO_ENTRY_EX*)m_lbPublishers.GetItemDataPtr(i);
CListBox::GetItemDataPtr()
返回 void*
因此需要强制转换。
关于c++ - 将 std::map 项设置为 CListBox 的项数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49529172/
我得到了一个多选CListBox,它启用了水平滚动条并正确显示。问题是,当我使用函数时 lst.ResetContent() 并将其填回,我找不到将行中的文本滚动回相同位置的方法。我试着用 lst.S
我有一个简单的 CListBox 控件。我在其中动态添加文本。是否可以获取鼠标当前悬停在列表框上的项目的索引?基本上,我想根据鼠标位置为列表框中的每个项目显示工具提示。 非常感谢代码示例。 最佳答案
我目前正在使用 MFC 的 CListBox 控件。是否可以保留列表项中的数据但对其进行编辑,而不是删除然后重新添加? 谢谢! 最佳答案 您可以通过扩展 CListBox 来做到这一点。看看这个 co
我有一个 CComboBox 派生类和一个子类 CListBox。我想将 CListBox 中的前两项设为粗体。我怎样才能做到这一点? 最佳答案 您需要一个所有者绘制的列表框,并覆盖 DrawItem
这对我来说一直是个大问题,对于非常大量的日志(比如 100,000 行日志),哪一个在性能上更好,滚动……还必须考虑使用颜色格式化文本。 最佳答案 在这种情况下,我可能会使用列表框。 您可以创建一个虚
我有一个可变高度的所有者绘制 ListBox 控件。当我调用 AddString 时,会发送一条 MeasureItem 消息,要求我告诉 Windows 项目的大小。问题是,代码还没有机会调用 Se
伪代码: CListBox listBox; CString[10] str; //consider it is initialised with valid string for(int i=0;
我有一个带有 CListBox 的对话框。我必须在此列表框中添加 3 列。 有没有办法在 CListBox 中有几个不同的列? 或者 CListCtrl 可以在这方面提供帮助吗? 最佳答案 列表框在
我正在创建一个 MFC 应用程序并尝试在对话框类中添加列表框。当我使用调试配置时,出现错误并且应用程序崩溃。当我使用发布配置时,对话框出现了,但是是空的。 我刚开始用这个,所以我的代码是基本的: //
首先让我说,我这几天一直在寻找解决方案... 我正在尝试为 ListBox 获取选定的项目。这是我的代码: CListBox * pList1 = (CListBox *)GetDlgItem(IDC
我使用 MFC AppWizard 并创建了 SDI 应用程序我需要按顺序为 outputwnd 调试选项卡设置颜色例如如果在某些控件中输入了任何错误的值 我需要以红色显示文本,说明输入的值无效 如果
在我基于 qt 的 C++ 应用程序中,我使用了一个 lib 文件。 lib 文件有一个名为 Customer 类的类,它继承自 CListBox。现在的问题是,当我调用从 Clistbox 继承的客
我有一个类似的问题here但是这个新问题的上下文不同。 背景 我有这个变量:PublisherMap m_mapPublishers; PublisherMap的定义是: using Publishe
我想知道为 CListBox 控件提供的消息 Controller 集有多有限。我已经在包含此控件的 CDialog 的消息映射中使用了 ON_LBN_SELCHANGE。 我也想使用 ON_WM_R
我正在修改一个现有的项目,并且一个对话框有一些控件,我在某些情况下将其子类化为不同的主题(在其他情况下,我将完全不理会它)。在 DoDataExchange() 期间调用 DDX_Control()
我正在开发 Microsoft Foundation Class (c++) 聊天应用程序,其中我想在列表框的右侧显示客户端消息,有一个可用的属性“右对齐文本”,但我想通过方法来完成。因为我也需要默认
我是一名优秀的程序员,十分优秀!