我想在 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()
方法,以便您可以触发重绘以显示它。但如果你走这条路,你最好切换到虚拟 ListView 或虚拟 TreeView 而不是使用网格。
另一种解决方案是切换到 TListView
,将其 ViewStyle
属性设置为 vsReport
模式及其 CheckBoxes
属性设置为 true。
关于c++ - 在 C++ 生成器中向 StringGrid 添加控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14677637/