c++ - 在 C++ 生成器中向 StringGrid 添加控件

标签 c++ c++builder

我想在 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/

相关文章:

c++ - 数据结构-抽象数据类型(ADT)VS具体数据类型(CDT)

c++ - 如何获取 __COUNTER__ 的最后一个值

c++ - extern "C"如何允许 C 文件中的 C++ 代码?

c++ - 我怎样才能 "unuse"命名空间?

C++ - 在没有模板参数的情况下使用模板类中的枚举

c++ - 在另一个类中删除具有 protected 析构函数的对象

android - C++Builder:如何在 Android 应用程序中显示重音?

java - C++代码覆盖工具

c++ - 在运行时究竟什么时候分配已发布的属性?

C++Builder:如何隐藏UI中的黄线?