我已经设法用这样的图标或多列文本创建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类来获得所需的结果?
非常感谢提前。
答案 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);
}
`