如何将动态创建的TShape对象置于背景并保持圆形在顶层?
如何让动态创建的TShape正方形置于背景层,圆形保持顶层?
我动态创建了一些TShape对象(图中的正方形),现在希望将这些对象置于背景层,同时让圆形保持在顶层,请问该如何实现?相关代码片段如下:
void TForm1::spawn_candy() { for (int i = 1;i<=runda;i++) { candy1[0] = new TShape(candy); p_wys = (rand()%90); p_szer = (rand()%114); candy1[0]->Top = (p_wys*5)+60; candy1[0]->Left = p_szer*5; Label2->Caption = candy1[0]->Left; candy1[0]->Parent = Form1; candy1[0]->Width = 30; candy1[0]->Height = 30; } ... }
嘿,这个问题在C++Builder的VCL框架里其实很好解决,核心就是利用控件的层级控制方法,直接看具体操作:
方法一:把动态创建的正方形送到背景层
在你创建完正方形TShape并设置好Parent之后,直接调用SendToBack()方法,它会把这个控件放到所有其他控件的底层:
// 在设置完Parent、宽高之后添加这行 candy1[0]->SendToBack();
方法二:确保圆形控件始终在顶层
如果你的圆形是设计时就放在窗体上的TShape(比如命名为CircleShape),可以在创建完所有正方形之后,调用它的BringToFront()方法,强制让它处于最上层:
// 循环结束后添加这行 CircleShape->BringToFront();
原理说明
VCL控件的显示层级是由它们在父控件(这里是Form1)的Controls集合中的顺序决定的:
SendToBack()会把控件移到Controls集合的最前面,所以显示时会被其他控件覆盖(背景层)BringToFront()会把控件移到Controls集合的最后面,所以会显示在所有控件的最上方(顶层)
额外提示(重要!)
你代码里的循环每次都把新创建的TShape赋值给candy1[0],这会导致之前创建的对象丢失引用,最后造成内存泄漏!应该用数组的不同索引来存储,比如:
// 假设candy1是一个足够大的数组 candy1[i] = new TShape(candy);
记得在窗体关闭或者不需要这些控件的时候,遍历数组释放所有TShape对象哦!
内容的提问来源于stack exchange,提问作者dedronek
相关产品推荐
相关产品推荐

