在运行时更改 TBitBtn 字形
Changing TBitBtn Glyph at runtime
我有一个 VCL 窗体,上面有一个 TBitBtn 和一个包含 2 个位图的 TImageList。在 运行 时间我 运行 下面的代码行将位图之一放在我的 TBitBtn 上:
ImageList1->GetBitmap(1, BitBtn1->Glyph);
这成功地将位图放到了 TBitBtn 上。然后我 运行 下面的代码行来改变位图,但没有任何反应:
ImageList1->GetBitmap(0, BitBtn1->Glyph);
两个位图都存在于图像列表中(0 和 1)。我可以交换代码行并证明图像列表没有问题。 Here is 一个老 post 的人似乎在 Delphi 中解决了这个问题。我在想我必须先以某种方式清除字形,但我不知道在 C++ 中如何。
这是一个使用方法的示例,使用临时 TBitmap
从 TImageList
检索图像并在运行时将其放入字形中。在此示例中,它在 TBitBtn->OnClick
事件处理程序上这样做。
void __fastcall TForm1::btn1Click(TObject *Sender)
{
// FOdd is a bool variable defined in the form's private section.
// It's just being used here as a toggle to flip between the images
this->FOdd = !this->FOdd;
TBitmap *bmp = new Graphics::TBitmap();
try {
bmp->SetSize(this->ImageList1->Width, this->ImageList1->Height);
this->ImageList1->GetBitmap(int(FOdd), bmp);
this->BitBtn1->Glyph->Assign(bmp);
}
__finally
{
delete bmp;
}
}
@relayman357 为 try..__finally 块提供了正确的代码,使这个答案更合适。
我有一个 VCL 窗体,上面有一个 TBitBtn 和一个包含 2 个位图的 TImageList。在 运行 时间我 运行 下面的代码行将位图之一放在我的 TBitBtn 上:
ImageList1->GetBitmap(1, BitBtn1->Glyph);
这成功地将位图放到了 TBitBtn 上。然后我 运行 下面的代码行来改变位图,但没有任何反应:
ImageList1->GetBitmap(0, BitBtn1->Glyph);
两个位图都存在于图像列表中(0 和 1)。我可以交换代码行并证明图像列表没有问题。 Here is 一个老 post 的人似乎在 Delphi 中解决了这个问题。我在想我必须先以某种方式清除字形,但我不知道在 C++ 中如何。
这是一个使用方法的示例,使用临时 TBitmap
从 TImageList
检索图像并在运行时将其放入字形中。在此示例中,它在 TBitBtn->OnClick
事件处理程序上这样做。
void __fastcall TForm1::btn1Click(TObject *Sender)
{
// FOdd is a bool variable defined in the form's private section.
// It's just being used here as a toggle to flip between the images
this->FOdd = !this->FOdd;
TBitmap *bmp = new Graphics::TBitmap();
try {
bmp->SetSize(this->ImageList1->Width, this->ImageList1->Height);
this->ImageList1->GetBitmap(int(FOdd), bmp);
this->BitBtn1->Glyph->Assign(bmp);
}
__finally
{
delete bmp;
}
}
@relayman357 为 try..__finally 块提供了正确的代码,使这个答案更合适。