2

我有一个带有 TBitBtn 的 VCL 表单和一个包含 2 个位图的 TImageList。在运行时,我运行以下代码行将其中一个位图放在我的 TBitBtn 上:

ImageList1->GetBitmap(1, BitBtn1->Glyph);

这成功地将位图放在 TBitBtn 上。然后稍后我运行以下代码行来更改位图,但没有任何反应:

ImageList1->GetBitmap(0, BitBtn1->Glyph);

两个位图都存在于图像列表中(0 和 1)。我可以交换代码行并证明图像列表没有问题。 这是一篇旧帖子,其中一个人似乎在 Delphi 中解决了这个问题。我想我必须先以某种方式清除字形,但我不知道如何在 C++ 中。

4

1 回答 1

1

这是使用它的一种方法的示例,使用临时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 块提供了正确的代码,以使这个答案更合适。

于 2018-08-15T23:22:59.830 回答