Czy ktoś wie, jak powiązać obiekt CPen z polem listy w VS2005 C++?

Czy mogę to zrobić jako ToString z jakąś konwersją?

Tworzę niestandardową listę różnych pisaków do wyboru przez użytkownika.

Dzięki.

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

    CDialog::OnInitDialog();
    ShowWindow(SW_SHOW);
    UpdateData();
    lbLineWeight.InsertString(penRed);
0
jpavlov 9 sierpień 2011, 23:56
Zakładam, że mówisz o MFC, więc dodałem tag do twojego pytania.
 – 
Oliver Charlesworth
9 sierpień 2011, 23:57
Rozważ przeczytanie Teach Yourself C++ in 21 Days zawiera samouczki dla CPen
 – 
A. K.
10 sierpień 2011, 00:10
1
Unikałbym czytania czegokolwiek zatytułowanego „Naucz się wstaw coś skomplikowanego za xx godzin/dni”, ponieważ będzie to w najlepszym razie nierealistyczne podsumowanie najważniejszych wydarzeń.
 – 
AJG85
10 sierpień 2011, 00:21
Och, "C-pen". Myślałem, że to jak „CP-en”, musiałem to wygooglować.
 – 
Cheers and hth. - Alf
10 sierpień 2011, 00:35

2 odpowiedzi

Najlepsza odpowiedź

2 opcje.

  • (proste) Użyj normalnego CListBox z ciągami jako elementami i zachowaj link między ciągiem a rzeczywistym CPen jako wolnymi funkcjami (lub członkiem innych klas), a będziesz musiał wykonać skojarzenie jeden do jednego między aktualnie wybrana pozycja (zwykle numer indeksu) oraz informacje o CPen, które posiadasz.

  • (nieco bardziej skomplikowane) Wyprowadź własną klasę z CListBox i zachowaj dane CPen wewnętrznie, nadal będziesz musiał przechowywać listę poprawnych CPen w tej nowej klasie i wykonać powiązanie jeden-do-jednego między wybranym elementem a rzeczywisty CPen; jako bonus możesz wyprowadzić CListBox narysowany przez właściciela i zamiast używać łańcucha, możesz narysować jakąś reprezentację każdego pióra w elementach listy.

Inna sprawa, możesz dodać CPen jako dane użytkownika do każdego elementu CListBox (CListBox::SetItemData), aby nieco ułatwić połączenie między elementem a rzeczywistym elementem.

Powodzenia.

Max.

2
Max 10 sierpień 2011, 00:32
Połącz mój pomysł z wypunktowaniem nr 2 tutaj, może wyglądać fajnie, możesz dodać ikonę lub element mapy bitowej do struktury pomocniczej i użyć tego w CImageList, aby umieścić małą ikonę obok nazwy w polu listy. Możliwości są dość nieograniczone, jeśli chodzi o GUI.
 – 
AJG85
10 sierpień 2011, 00:48
Czy istnieje prostszy sposób, taki jak coś takiego: COLORREF rgbRED = (255,0,0); CPen penRed(PS_SOLID,3,rgbRED); CDialog::OnInitDialog(); PokażOkno(SW_SHOW); Aktualizować dane(); lbLineWeight.InsertString(penRed);
 – 
jpavlov
10 sierpień 2011, 16:42
Czy możesz wskazać mi przykład, który pokazuje, jak dodać go do pola listy za pomocą prostej metody? Dziękuję.
 – 
jpavlov
10 sierpień 2011, 18:32

Zakładając, że dobrze rozumiem, chcesz mieć CListBox, który pozwala użytkownikowi wybrać CPen do wykorzystania w innym miejscu.

Prawdopodobnie zrobiłbym małą klasę pomocniczą:

struct PenHelper
{
   CString m_displayName;
   LOGPEN m_penProps;

   bool CreatePen(CPen* pPen)
   {
       return pPen->CreatePenIndirect(&m_penProps) == 1;
   }
};

Pomysł polega na tym, że możesz mieć kontener taki jak std::map złożony z wielu PenHelper, każdy z nazwami takimi jak „Solid Red” i odpowiadającą mu strukturą LOGPEN z właściwościami, które pasują do nazwy. W CListBox dodajesz ciąg nazwy wyświetlanej. Kiedy wybiorą jeden, możesz wyszukać go według nazwy i użyć funkcji tworzenia, aby faktycznie utworzyć odpowiedni CPen

To tylko jeden z miliona sposobów na oskórowanie kota.

Edytuj: szybka notatka. Aby obsłużyć ON_LBN_SELCHANGE w Twojej mapie wiadomości, gdy dokonają wyboru w Twoim CListBox, upewnij się, że nadałeś mu styl LBS_NOTIFY w wywołaniu Create, w przeciwnym razie będzie” ogień.

1
AJG85 10 sierpień 2011, 00:54