在 c++ 生成器中将控件添加到 StringGrid

Add control to StringGrid in c++ builder

本文关键字:控件 添加 StringGrid c++      更新时间:2023-10-16

我想在 c++ 构建器中将复选框添加到 stringGrid 的每一行。 据我所知,特定列的每个单元格都不可能有自己的子控件。那我该怎么办

for (int i = 1; i < this->StringGrid1->RowCount; i++) {
    this->StringGrid1->Cells[0][i]=IntToStr(i);
    TCheckBox *l=new TCheckBox(this->StringGrid1);
    l->Name="label"+IntToStr(i);
    l->Caption="OK";
    l->Visible=true;
}

在技术上可以将子控件放在TStringGrid中(示例代码只是缺少l->Parent = StringGrid1赋值(,但管理此类控件并不容易,尤其是在网格可滚动的情况下。

更好的解决方案是通过切换到 TDrawGrid 并使用其 OnDrawCell 事件来所有者绘制网格,以便可以调用 Win32 API DrawFrameControl()DrawThemeBackground()函数将复选框的图像绘制到网格上。 然后,您可以使用单独的数组/列表来跟踪复选框"状态",并根据需要使用网格的OnMouse...事件来切换这些"状态",每当复选框更改"状态"时调用网格的Invalidate()方法,以便您可以触发重绘以显示它。 但是,如果您走这条路,最好切换到虚拟列表视图或虚拟树视图,而不是使用网格。

另一种解决方案是切换到其ViewStyle属性设置为vsReport模式且其CheckBoxes属性设置为 true 的TListView