将CPen绑定到列表框 是否有人知道如何将一个CPN对象绑定到VS2005 C++中的一个列表框?

将CPen绑定到列表框 是否有人知道如何将一个CPN对象绑定到VS2005 C++中的一个列表框?,c++,mfc,C++,Mfc,我可以做一个带有某种转换的ToString吗 我正在创建不同笔的自定义列表,供用户选择 谢谢 COLORREF rgbRED = (255,0,0); CPen penRed(PS_SOLID,3,rgbRED); CDialog::OnInitDialog(); ShowWindow(SW_SHOW); UpdateData(); lbLineWeight.InsertString(penRed); 2个选项 (简单)使用带有字符串的普通

我可以做一个带有某种转换的ToString吗

我正在创建不同笔的自定义列表,供用户选择

谢谢

    COLORREF  rgbRED = (255,0,0);
    CPen penRed(PS_SOLID,3,rgbRED);

    CDialog::OnInitDialog();
    ShowWindow(SW_SHOW);
    UpdateData();
    lbLineWeight.InsertString(penRed);
2个选项

  • (简单)使用带有字符串的普通CListBox作为项目,并保持字符串与实际CPen之间的链接作为自由函数(或某些其他类的成员),并且您必须在当前选定项目(通常是索引号)和您拥有的CPen信息之间进行一对一关联

  • (稍微复杂一点)从CListBox派生您自己的类并在内部保留CPen数据,您仍然需要在新类中保留有效CPen的列表,并在所选项目和实际CPen之间进行一对一关联;作为奖励,您可以绘制派生的CListBox所有者,而不是使用字符串,您可以绘制列表项中每支笔的某种表示形式

另外,您可以将CPen作为用户数据添加到每个CListBox项(CListBox::SetItemData),以使该项与实际项之间的链接更加容易

祝你好运

最多两个选项

  • (简单)使用带有字符串的普通CListBox作为项目,并保持字符串与实际CPen之间的链接作为自由函数(或某些其他类的成员),并且您必须在当前选定项目(通常是索引号)和您拥有的CPen信息之间进行一对一关联

  • (稍微复杂一点)从CListBox派生您自己的类并在内部保留CPen数据,您仍然需要在新类中保留有效CPen的列表,并在所选项目和实际CPen之间进行一对一关联;作为奖励,您可以绘制派生的CListBox所有者,而不是使用字符串,您可以绘制列表项中每支笔的某种表示形式

另外,您可以将CPen作为用户数据添加到每个CListBox项(CListBox::SetItemData),以使该项与实际项之间的链接更加容易

祝你好运


最大值

假设我正确理解您,您希望有一个
CListBox
,允许用户选择一个
CPen
,以便在其他地方使用

我可能会制作一个小助手类:

struct PenHelper
{
   CString m_displayName;
   LOGPEN m_penProps;

   bool CreatePen(CPen* pPen)
   {
       return pPen->CreatePenIndirect(&m_penProps) == 1;
   }
};
这个想法是,您可以有一个像
std::map
这样的容器,其中包含多个
PenHelper
,每个容器都有一个像“Solid Red”这样的名称,以及一个相应的
LOGPEN
结构,其属性与名称匹配。在
CListBox
中添加显示名称字符串。当他们选择一个时,您可以按名称查找,并使用create函数实际生成相应的
CPen

这只是剥猫皮的一百万种方法之一


编辑:快速注释。为了在消息映射中处理
,当他们在
CListBox
中进行选择时,请确保在
Create
调用中为其设置了
LBS\u NOTIFY
样式,否则它不会触发。

假设我理解正确,您希望有一个
CListBox
允许用户使用选择一个
CPen
供其他地方使用

我可能会制作一个小助手类:

struct PenHelper
{
   CString m_displayName;
   LOGPEN m_penProps;

   bool CreatePen(CPen* pPen)
   {
       return pPen->CreatePenIndirect(&m_penProps) == 1;
   }
};
这个想法是,您可以有一个像
std::map
这样的容器,其中包含多个
PenHelper
,每个容器都有一个像“Solid Red”这样的名称,以及一个相应的
LOGPEN
结构,其属性与名称匹配。在
CListBox
中添加显示名称字符串。当他们选择一个时,您可以按名称查找,并使用create函数实际生成相应的
CPen

这只是剥猫皮的一百万种方法之一


编辑:快速注释。为了在您的消息映射中处理
,当他们在您的
CListBox中进行选择时,请确保在
Create
调用中为其设置了
LBS\u NOTIFY
样式,否则它不会触发。

我假设您正在谈论的是MFC,所以我在你的问题中加了标签。考虑阅读<代码>在21天内教你自己C++ <代码>。它有CpINI的教程,避免阅读任何标题为“在XX小时/天里教你自己插入复杂的东西”,因为这将是一个不现实的总结,最多是亮点。哦,“C-PEN”。我想它就像“CP EN”,我不得不谷歌它。我假设你正在谈论MFC,所以我把标签添加到你的问题。考虑阅读<代码>在21天内自学C++。因为这充其量只是一个不切实际的亮点总结。哦,“C笔”。我认为这就像“CP en”,我必须用谷歌搜索它。将我的想法与bullet point 2结合起来,这里看起来很漂亮,你可以在helper结构中添加一个图标或位图成员,并在
CImageList
中使用它在列表框中的名称旁边放置一个小图标。当涉及到GUI时,这种可能性是无穷无尽的。有没有一种更简单的方法像这样:COLORREF rgbreed=(255,0,0);CPen-penRed(PS_-SOLID,3,rg);CDialog::OnInitDialog();ShowWindow(SW_SHOW);更新数据();lbLineWeight.InsertString(笔画);你能给我举一个例子,演示如何使用simple方法将它添加到列表框中吗?谢谢。将我的想法与要点结合起来#2这里看起来很漂亮。你可以在helper结构中添加一个图标或位图成员,并在
CImageList
中使用它在列表框中的名称旁边放置一个小图标。当涉及到GUI时,这种可能性是无穷无尽的。有没有一种更简单的方法像这样:COLORREF rgbreed=(255,0,0);CPen-penRed(PS_-SOLID,3,rg);CDialog::OnInitDialog();ShowWindow(SW_SHOW);更新数据();lbL