这个控件画出来应该像windows中点开一个文件夹,当为“图标”时,里面的样子。然后,再每项下方加一个checkbox。应该怎么构造它,并为它添加子项。能不能给一段代码?

解决方案 »

  1.   

    http://blog.csdn.net/handsomerun/archive/2006/04/13/662462.aspx
      

  2.   

    以下是我的代码
    为什么Icon型的ListControl里,先不不住图片,只有一个白色的方框,里面有文本和checkbox,而且通过这句话:((CStatic*)GetDlgItem(IDC_TEST))->SetIcon(m_image.ExtractIcon(0));使得picture控件IDC_TEST里已经显示了这个icon,说明这个ImageList没问题。

             CListCtrl* listctrl = (CListCtrl *)GetDlgItem(IDC_LISTCONTROL_DATA);
    ASSERT(listctrl);
    DWORD dwStyle = ::GetWindowLong(listctrl->m_hWnd, GWL_STYLE);
    dwStyle &= ~(LVS_TYPEMASK); 
    dwStyle &= ~(LVS_EDITLABELS); 
    SetLastError(0);
    int err=SetWindowLong(listctrl->m_hWnd, GWL_STYLE, dwStyle|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);
    if(err==0&&GetLastError()!=0)
    {
    TRACE("\nERROR:SetWindowLong() in createListControl(),in Page2.cpp\n");
    return FALSE;
    }
    DWORD styles = LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES|LVS_EX_SUBITEMIMAGES;//|LVS_REPORT;//|LVS_EX_GRIDLINES 
    ListView_SetExtendedListViewStyleEx(listctrl->m_hWnd, styles, styles ); DWORD dwStyle = ::GetWindowLong(listctrl->m_hWnd, GWL_STYLE);
    dwStyle &= ~(LVS_REPORT); 
    SetLastError(0);
    int err=SetWindowLong(listctrl->m_hWnd, GWL_STYLE, dwStyle|LVS_ICON);
    if(err==0&&GetLastError()!=0)
    {
    TRACE("\nERROR:SetWindowLong() in createListControl(),in Page2.cpp\n");
    return FALSE;
    }

    TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};
     
      LV_COLUMN lvcolumn;
      CRect rect;
      listctrl->GetWindowRect(&rect);
    for(int i=0;i<2;i++)
    {
    lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
    lvcolumn.fmt = LVCFMT_LEFT;
    lvcolumn.pszText = rgtsz[i];
    lvcolumn.iSubItem = i;
    lvcolumn.iOrder = i;
    if(i==0)
    {
       lvcolumn.cx = rect.Width()*3/5; 
    }
    else
    lvcolumn.cx = rect.Width()*2/5;
    listctrl->InsertColumn(i, &lvcolumn);
    }
    CImageList m_image;
    m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);
    listctrl->SetImageList(&m_image,LVSIL_NORMAL);

    HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));

    m_image.Add(hIcon);
    m_image.Add(hIcon);
    m_image.Add(hIcon);
    ASSERT(m_image.ExtractIcon(0));
    ((CStatic*)GetDlgItem(IDC_TEST))->SetIcon(m_image.ExtractIcon(0));
    LV_ITEM   lvitemAdd = {0};
       lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE;
       lvitemAdd.iItem = 0 ;
       lvitemAdd.iSubItem = 0;
    lvitemAdd.iImage = 0;
    lvitemAdd.pszText =_T("毛毛1");;
      listctrl->InsertItem(&lvitemAdd);
    这个东西已经困扰我两天了,不能再拖了。帮帮忙呀
      

  3.   

    m_image.Add(hIcon);用replace,不要用add,还有要设定数量
    m_pImgList = new CImageList();
    m_pImgList->Create(BIG_ICON_WIDTH, BIG_ICON_WIDTH, ILC_COLOR8, 0, 1);//可以先设定为一个,然后更改数量
    m_pImgList->SetImageCount(**) CBitmap* pBmp = NULL; 
    for(int i = 0;i < **;i++)
    {
    //create pBmp or ICON
             m_pImgList->Replace(i,pBmp,NULL); //delete pBmp; }
      

  4.   

    谢谢一楼,你总结的太好了。
    谢谢三楼,按照你说的,我的Icon显示出来了。
    我改造了一下构建ImageList的方法,代码如下:
    m_image = new CImageList();
    m_image->Create(32, 32, ILC_COLOR24, 0, 1);
    m_image->SetImageCount(3);

    HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
    m_image->Replace(0,hIcon);
    m_image->Replace(1,hIcon);
    m_image->Replace(2,hIcon);
    m_image=listctrl->SetImageList(m_image,LVSIL_SMALL);
    我的ListControl是SmallIcon型的。
    Item的显示:checkbox在Icon左侧,文本在Icon右侧,可客户要求的是icon和文本都在Icon下面,这样的东西怎么实现
      

  5.   

    你的ListCtrl的风格?
    LVSIL_SMALL ,用 NORMAL看看