Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > background на форме


Автор: Grig 18.5.2005, 02:52
А вот интересно есть ли в Дельфи подобие html-команды background??
То есть возможно ли легко и просто замостить форму каким-нибудь рисунком?
Или для этого тоже надо процедуру писать..


Автор: <Spawn> 18.5.2005, 04:57
Самый простой вариант для тебя будет таким: кидаешь на форму TImage, свойство Align ставишь в alClient, Stretch в True и используешь затем любую картинку(но лучше не очень тяжелую smile ) Если же тебе нужно размножить какой то рисунок по всей поверхности формы, то кидай на форму TPaintBox, ставь Align в alClient и затем пиши этот код:

Код

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    FBitmap: TBitmap;
  public
  end;

implemetation

procedure TForm1.FormCreate(Sender: TObject);
begin
  FBitmap := TBitmap.Create;
  FBitmap.LoadFromFile('image.bmp');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FBitmap);
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  xCount, yCount, x, y,
  ClipWidth, ClipHeight: integer;
begin
  with PaintBox1 do
  begin
    xCount := Width div FBitmap.Width;
    yCount := Height div FBitmap.Height;
  
    for x := 0 to xCount - 1 do
      for y := 0 to yCount - 1 do
        BitBlt(Canvas.Handle, x * FBitmap.Width, y * FBitmap.Height,
          FBitmap.Width, FBitmap.Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY);

    ClipWidth := Width - xCount * FBitmap.Width;
    ClipHeight := Height - yCount * FBitmap.Height;

    if ClipHeight > 0 then
      for x := 0 to xCount - 1 do
        BitBlt(Canvas.Handle, x * FBitmap.Width, yCount * FBitmap.Height,
          FBitmap.Width, ClipHeight, FBitmap.Canvas.Handle, 0, 0, SRCCOPY);

    if ClipWidth > 0 then
      for y := 0 to yCount - 1 do
        BitBlt(Canvas.Handle, xCount * FBitmap.Width, y * FBitmap.Height,
          ClipWidth, FBitmap.Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY);

    if (ClipHeight > 0) and (ClipWidth > 0) then
      BitBlt(Canvas.Handle, xCount * FBitmap.Width, yCount * FBitmap.Height,
        ClipWidth, ClipHeight, FBitmap.Canvas.Handle, 0, 0, SRCCOPY);
  end;
end;



При желании можно провести небольшую оптимизацию, например, вычислять xCount, yCount при изменении размеров формы и т.д. Если будет мерцать то в OnCreate формы поставть DoubleBuffered := True

Автор: Grig 18.5.2005, 05:12
Я так и думал.
Просто в проекте до кучи таких вот мелочей, и если на каждую писать по процедуре, там потом черт ногу сломит smile

Автор: s-mike 18.5.2005, 07:10
Grig, для помещение на форму фонового рисунка есть множество специальных компонентов, где все это делается или одной-двумя строками кода или в дизайн-тайм несколькими кликами.

Автор: Grig 18.5.2005, 11:16
s-mike Это стандартные компоненты?
Может присоветуешь чего-нибудь?

Автор: s-mike 18.5.2005, 11:29
Цитата(Grig @ 18.5.2005, 11:16)
Это стандартные компоненты?
Может присоветуешь чего-нибудь?

Нет, стандартных таких нет. Ну, например, мои: http://forum.vingrad.ru/index.php?showtopic=45912&view=findpost&p=376437

А также JvBackground из состава JEDI VCL.

Автор: Medved 18.5.2005, 12:09
в LDM-Tools хорошие (и самое главное быстрые!) компоненты такого рода. А JEDI тормозит сильно.

Автор: s-mike 18.5.2005, 12:11
Цитата(Pegas @ 18.5.2005, 12:09)
LDM-Tools

Кажется LMD-Tools.
Цитата(Pegas @ 18.5.2005, 12:09)
А JEDI тормозит сильно.

Не замечал. Во всяком случае в последней версии. Но зато с открытым и бесплатным исходным кодом.

Автор: Medved 18.5.2005, 12:16
Цитата(s @ 18.5.2005, 15:11)
Кажется LMD-Tools.

Да, сорри, перепутал.... (А ведь смотрел как пишутся, все равно ошибся! smile)
Добавлено @ 12:18
Цитата(s @ 18.5.2005, 15:11)
Не замечал. Во всяком случае в последней версии. Но зато с открытым и бесплатным исходным кодом.

Ну это уже видимо кому-как. Я просто предпочитаю в таких случаях использовать LMD.

Автор: ~FoX~ 18.5.2005, 13:24
А я в таких случаях по onPaint формы рисую что надо.........и без VCL и точно знаю. что, где и когда. smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)