1

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

两个wxListCtrl的图片

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

带有图标的资源管理器窗口的图片

我试过这个...

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 类来获得所需的结果?

提前谢谢了。

4

3 回答 3

2

是的,这是可能的,并且listctrl 示例显示了如何执行此操作,特别是请参阅MyFrame::InitWithReportItems()函数。您的代码的唯一区别似乎是您使用了不同的InsertItem()重载,所以也许您应该InsertItem(i, "")改用。

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

更一般地说,尝试减少您的代码和(工作)示例之间的差异几乎总是会很快找到问题。

于 2013-05-02T22:51:40.303 回答
1

谢谢,VZ,但我发现它不是 InsertItem() 而是 SetImageList()。我的图像列表是正确的,但“which”参数不正确。用 wxIMAGE_LIST_SMALL 替换 wxIMAGE_LIST_NORMAL 可以解决问题!我认为“SMALL”仅适用于 SMALL_ICON 模式,而“NORMAL”应该是默认值。但是,是的,这是有道理的,普通图标很大并且不适合文本显示。如果文档告诉我们在经过长时间的反复试验之后会很好......

于 2013-05-03T07:03:52.780 回答
0

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

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);

    }

`

于 2013-05-06T12:48:09.293 回答