如何在wxListCtrl中显示图像(多列报表样式)

时间:2013-05-02 16:21:38

标签: image icons wxwidgets

我已经设法用这样的图标或多列文本创建wxListCtrls

Picture of two wxListCtrls

现在我想在左侧的文本列表的每一行添加一个图标。我认为这应该是可能的,因为代码:: blocks和wxSmith等典型的wxWidgets应用程序经常在列表/树视图(资源浏览器窗口)中显示图标,甚至在笔记本的选项卡(编译器日志窗口)中。 那我怎么能创造这样的东西呢? (每个人都知道Windows资源管理器)

Picture of Explorer Window with icons

我试过了......

SetImageList (ToolImages, wxIMAGE_LIST_NORMAL);
InsertColumn (0, "Icon");
SetColumnWidth (0, 40);
...
for (int i=0; i<5; i++)
{
    InsertItem (i, i);
    SetItemColumnImage (i, 0, i);
    SetItem (i, 1, IntToStr (i+1));
...

但正如您所看到的,只显示文本,图像列为空白。是否可以在报告模式下混合文本和图像?如果没有,我可以用什么其他wxControl类来获得所需的结果?

非常感谢提前。

3 个答案:

答案 0 :(得分:1)

是的,有可能,listctrl sample显示了如何操作,尤其是MyFrame::InitWithReportItems()功能。与代码的唯一区别似乎是您使用了不同的InsertItem()重载,因此您可能应该使用InsertItem(i, "")代替。

同时检查您的图像列表中是否包含5个图标。

更一般地说,尝试减少代码和(工作)样本之间的差异几乎总能快速找到问题。

答案 1 :(得分:0)

谢谢,VZ,但我发现它不是InsertItem()而是SetImageList()。我的图片列表是正确的,但“which”参数不是。用wxIMAGE_LIST_SMALL替换wxIMAGE_LIST_NORMAL可以解决问题!我认为“SMALL”仅适用于SMALL_ICON模式,“NORMAL”应该是默认值。但是,是的,这是有道理的,正常的图标很大,不适合文本显示。如果文档告诉我们在不久的试验和错误之前会很好......

答案 2 :(得分:0)

这是使用WXLISTCTRL 的小型ICONIC视图的一个简单示例。请将此代码放在类声明中。我是在使用 CODE BLOCKS 的基于框架的Windows应用程序中完成的。这对你有用。

wxImageList *il=new wxImageList(32,32,false,0);

wxImageList *i2=new wxImageList(32,32,false,0);

 wxDir dir(wxGetCwd());
wxDir dir1(wxGetCwd());



    if ( !dir.IsOpened() )

    {

        // deal with the error here - wxDir would already log an error message
        // explaining the exact reason of the failure
        return;
    }
 if ( !dir1.IsOpened() )
    {
        // deal with the error here - wxDir would already log an error message
        // explaining the exact reason of the failure
        return;
    }
    puts("Enumerating object files in current directory:");

  wxString path, filename, dirstring,filename1, dirstring1, img,imgPath,path1,img1,imgPath1;
    int i=0;
path=wxT("C:\\testing\\splitterwindow\\set\\devices");
    path1=wxT("C:\\testing\\splitterwindow\\set\\actions");
    img=wxT("C:\\testing\\splitterwindow\\set\\devices\\");
    img1=wxT("C:\\testing\\splitterwindow\\set\\actions\\");


   bool cont=dir.Open(path);
   bool cont1=dir1.Open(path1);
   cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_DEFAULT);
    dirstring.Append(filename.c_str());
    cont1 = dir1.GetFirst(&filename1, wxEmptyString, wxDIR_DEFAULT);
    dirstring1.Append(filename1.c_str());
    while ( cont )
    {

        imgPath.clear();

        cont = dir.GetNext(&filename);


       dirstring.Append(filename.c_str());

       // Consturct the imagepath
       imgPath.Append(img.c_str());
       imgPath.Append(filename.c_str());



       //Now, add the images to the imagelist
       il->Add(wxBitmap(wxImage(imgPath.c_str())));
       i++;

    }

    while ( cont1 )
    {

        imgPath1.clear();
       cont1 = dir1.GetNext(&filename1);
dirstring1.Append(filename1.c_str());
       // Consturct the imagepath
       imgPath1.Append(img1.c_str());
       imgPath1.Append(filename1.c_str());

       //Now, add the images to the imagelist
       i2->Add(wxBitmap(wxImage(imgPath1.c_str())));
       i++;

    }
    //assigning the imagelist to listctrl
       ListCtrl1->AssignImageList(il, wxIMAGE_LIST_SMALL);
ListCtrl3->AssignImageList(i2, wxIMAGE_LIST_SMALL);

    for(int j=0;j < il->GetImageCount()-1;j++)
    {
        wxListItem itemCol;
        itemCol.SetId(j);
        itemCol.SetImage(j);
        itemCol.SetAlign(wxLIST_FORMAT_LEFT);
        ListCtrl1->InsertItem(itemCol);

    }
     for(int k=0;k < i2->GetImageCount()-1;k++)
    {
        wxListItem itemCol1;
        itemCol1.SetId(k);
        itemCol1.SetImage(k);
        itemCol1.SetAlign(wxLIST_FORMAT_LEFT);
        ListCtrl3->InsertItem(itemCol1);

    }

`