Avatar billede a_dyhrberg Nybegynder
12. september 2001 - 22:58 Der er 5 kommentarer og
1 løsning

Indsætning af ICONER i en CListBox i MFC

Jeg skal bruge den nemmeste mulige måde, at sætte iconer ind i en CListBox af typen REPORT unde MFC.
Alle iconerne har størrelsen 16 x 16.
Det skal være muligt at indsætte i alle colums og rows, IKKE bare den første column (Som jeg har bokset med hele dagen).
Jeg skal bare bruge en lille stump code der viser hvordan dette gøres nemmest muligt. Det burde ikke være nødvendig med altmuligt OnCustumdrawList()... diller daller. Hvis der samtidig fremgår en måde at fjerne dem på igen, vil det være Xtra plus plus godt.

Tak !!!
Avatar billede jpk Nybegynder
13. september 2001 - 09:17 #1
Alt dette for 15 point?
Avatar billede a_dyhrberg Nybegynder
13. september 2001 - 13:51 #2
Jeg nægter at tro det er mere end 10 linier relativ simpel kode. incl alt

men hvis det er meget forkert, skal jeg da nok sætte flere point på det.
Avatar billede a_dyhrberg Nybegynder
13. september 2001 - 15:28 #3
Det tætteste jeg er kommet indtil videre.
giver mig konstant iconer i alle felter i første column
men ikke en kan jeg få frem i de andre columns.

Koden er som følger.

m_ImgList.Create ( 16, 16, ILC_COLOR4 | ILC_MASK, 4, 1 );

    hCheckON = reinterpret_cast<HICON>(
                ::LoadImage ( AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_CHECK_ON),
                              IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR ));
   
    hCheckOFF = reinterpret_cast<HICON>(
                ::LoadImage ( AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_CHECK_OFF),
                              IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR ));
   
    m_ImgList.Add ( hCheckON );
    m_ImgList.Add ( hCheckOFF );

m_ListBox1Ctrl.SetImageList ( &m_ImgList, LVSIL_SMALL );
   
    m_ListBox1Ctrl.InsertColumn ( 4, _T(\"MyTEST\"), LVCFMT_LEFT, 55,  4);

    m_ListBox1Ctrl.InsertItem ( 4, _T(\"Test2\"), 1 );
    m_ListBox1Ctrl.SetItem ( 4, 4, LVIF_TEXT | LVIF_IMAGE, _T(\"Test2\"), 2, NULL, NULL, NULL);

Det går galt allerede når jeg laver min SetImageList den sætter iconer ind i alle felt i den første kolonne (altså nedad).

Anyone ?
Avatar billede dr.truti Nybegynder
14. september 2001 - 16:34 #4
Hvad med dette:

class CIconPickerList : public CListBox
{
// Construction
public:
    CIconPickerList();

// Attributes
public:

// Operations
public:
    int AddIconItem(HICON hIcon); // My Function
// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CIconPickerList)
    public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CIconPickerList();

    // Generated message map functions
protected:
    //{{AFX_MSG(CIconPickerList)
        // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};

// Implement below
void CIconPickerList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    HICON hIcon = (HICON)lpDrawItemStruct->itemData; // HICON in Item data

    if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE)
    {
        // Paint the color item in the color requested
        pDC->DrawIcon(lpDrawItemStruct->rcItem.left+5,lpDrawItemStruct->rcItem.top+5,hIcon);
    }

    if ((lpDrawItemStruct->itemState & ODS_SELECTED) &&
        (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
    {
        // item has been selected - hilite frame
        CBrush br(GetSysColor(COLOR_HIGHLIGHT));
        CRect rect;
        rect.CopyRect(&lpDrawItemStruct->rcItem);
        rect.DeflateRect(2,2,2,2);
        pDC->FrameRect(&rect, &br);

        rect.DeflateRect(1,1,1,1);
        pDC->FrameRect(&rect, &br);

    }

    if (!(lpDrawItemStruct->itemState & ODS_SELECTED) &&
        (lpDrawItemStruct->itemAction & ODA_SELECT))
    {
        // Item has been de-selected -- remove frame
        CBrush br(GetSysColor(COLOR_WINDOW));
        CRect rect;
        rect.CopyRect(&lpDrawItemStruct->rcItem);
        rect.DeflateRect(2,2,2,2);
        pDC->FrameRect(&rect, &br);

        rect.DeflateRect(1,1,1,1);
        pDC->FrameRect(&rect, &br);
    }
   
}

void CIconPickerList::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
    lpMeasureItemStruct->itemHeight = 42;
    lpMeasureItemStruct->itemWidth = 42;
}

int CIconPickerList::AddIconItem(HICON hIcon)
{
    return AddString((LPCTSTR) hIcon);
}

Truti [DK]
Avatar billede dr.truti Nybegynder
14. september 2001 - 16:34 #5
Det laver ikke lige ikonerne i 16 x 16 men indsætter dem i en Clist-Box som normal størelse men det kan du jo lige rette lidt til...
Avatar billede a_dyhrberg Nybegynder
14. november 2001 - 14:42 #6
Tjaa dette er ved at være et gammelt spørgsmål, og jeg er kommet videre unden at bruge noget af ovenstående hjælp. Min løsning var at jeg begyndte at bruge et grid komponent fra OGrid fra firmaet stingray. Denne løste dette ICON og MANGE MANGE andre problemr. Men ellers tak for hjælpen til jer alle
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester