具有自定义背景的按钮,内部文本-C ++ Builder

时间:2018-07-04 16:16:52

标签: delphi button c++builder tms

我想创建一个带有自定义背景和内部文本的按钮。 (执行时)

但是文字紧贴图片,而不是紧贴图片。

Button and text next to it

您知道吗?

有关信息,我可以使用所有TMS组件包

1 个答案:

答案 0 :(得分:4)

TSpeedButton具有Glyph属性,但 IIRC 他们没有将CaptionGlyph结合在一起。幸运的是,您可以使用Graphics::TBitmap使用背景图片在运行时以编程方式创建字形,并在其上渲染文本...我不是Delphi编码器,但在builder中,它看起来像这样:

Graphics::TBitmap *bmp=new Graphics::TBitmap;
bmp->LoadFromFile("button_background.bmp");
bmp->Canvas->Font->Color=clWhite;
bmp->Canvas->Brush->Style=bsClear;
AnsiString s="caption1"
int x=(bmp->Width-bmp->Canvas->TextWidth(s))/2;
int y=(bmp->Height-bmp->Canvas->TextHeight(s))/2;
bmp->TextOutA(x,y,s);
bmp->SaveToFile("button1.bmp");
delete bmp;

因此,您可以创建一个实用程序,该实用程序创建所需的所有字形,然后将其用于项目的 IDE 中。我从未尝试在运行时加载字形,但是可能有一种方法(可以直接在目标App初始化中执行此操作)。

[Edit1] Finaly有一些时间进行测试

字形属性是位图,因此您可以直接从文件中加载...无需新建/删除。如果您想拥有更强大的功能,请看一下。我创建了一个空的新表单应用,上面没有几个TSpeedButtons,并设置了自己的头寸大小,Caption喜欢这个:

IDE designer

我使用了无缝纹理作为背景(因此我可以设置任何按钮大小而不会出现缩放问题...):

texture

然后像这样在运行时上初始化我的按钮:

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
void bt_init(TSpeedButton *bt,Graphics::TBitmap *bmp)
    {
    int x,y,xs,ys;
    AnsiString s;
    // clear caption
    s=bt->Caption; bt->Caption="";
    // prepare glyph
    bt->Glyph->PixelFormat=bmp->PixelFormat;
    bt->Glyph->SetSize(bt->Width,bt->Height);
    // render seamless background (repeat texture)
    xs=bmp->Width;
    ys=bmp->Height;
    for (y=0;y<bt->Width;y+=ys)
     for (x=0;x<bt->Width;x+=xs)
      bt->Glyph->Canvas->Draw(x,y,bmp);
    // set transparent color
    bt->Glyph->Canvas->Pixels[0][bt->Glyph->Height-1]=clBlack;
    // render caption
    bt->Glyph->Canvas->Font->Color=clWhite;
    bt->Glyph->Canvas->Font->Style=TFontStyles()<<fsBold;
    bt->Glyph->Canvas->Brush->Style=bsClear;
    x=(bt->Glyph->Width-bt->Glyph->Canvas->TextWidth(s))/2;
    y=(bt->Glyph->Height-bt->Glyph->Canvas->TextHeight(s))/2;
    bt->Glyph->Canvas->TextOutA(x,y,s);
    }
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner)
    {
    Graphics::TBitmap *bmp=new Graphics::TBitmap;
    bmp->LoadFromFile("button.bmp");
    bmp->PixelFormat=pf32bit;
    bt_init(SpeedButton1,bmp);
    bt_init(SpeedButton2,bmp);
    bt_init(SpeedButton3,bmp);
    bt_init(SpeedButton4,bmp);
    delete bmp;
    }
//---------------------------------------------------------------------------

您也可以添加边框渲染(另一种纹理...)。您也可以更改标题渲染(更大的字体或彩色边框以增强对比度)。在这里预览:

preview

请注意,最终字形的左下角具有透明颜色。因此,如果您不使用它,请使用纹理中未使用的颜色进行设置,以免出现伪影。

也看看这个:

一些文本视觉改进的想法。