Привязка CPen к списку - PullRequest
       2

Привязка CPen к списку

0 голосов
/ 09 августа 2011

Кто-нибудь знает, как связать объект CPen со списком в VS2005 C ++?

Могу ли я сделать это как ToString с каким-то преобразованием?

Я создаю пользовательский список различных ручек для выбора пользователем.

Спасибо.

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

    CDialog::OnInitDialog();
    ShowWindow(SW_SHOW);
    UpdateData();
    lbLineWeight.InsertString(penRed);

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

2 варианта.

  • (просто) Используйте обычный CListBox со строками в качестве элементов и сохраняйте связь между строкой и фактическим CPen в качестве свободных функций (или членов некоторых других классов), и вам придется выполнить одно- связь «один к одному» между текущим выбранным элементом (обычно порядковым номером) и имеющейся у вас информацией CPen.

  • (немного сложнее) Извлеките свой собственный класс из CListBox и сохраните данные CPen внутри, вам все равно придется хранить список действительных CPen в этом новом классе и выполнять однозначную связь между выбранным элементом и фактическим CPen; в качестве бонуса вы можете сделать свой производный отрисованный владельцем CListBox и вместо использования строки вы можете нарисовать какое-то представление каждого пера в элементах списка.

Еще один пример: вы можете добавить CPen в качестве пользовательских данных к каждому элементу CListBox (CListBox :: SetItemData), чтобы сделать связь между элементом и фактическим элементом более легкой.

Удачи.

Макс.

1 голос
/ 10 августа 2011

Если я вас правильно понимаю, вы хотите иметь 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 вы добавляете строку отображаемого имени. Когда они выбирают один, вы можете найти его по имени и использовать функцию создания, чтобы фактически сделать соответствующий CPen

Всего один из миллиона способов обнажить кошку.

Редактировать: Быстрая заметка. Чтобы обработать ON_LBN_SELCHANGE в вашей карте сообщений, когда они делают выбор в вашем CListBox, убедитесь, что вы указали стиль LBS_NOTIFY в вызове Create, иначе он не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...