Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновление фона формы [D7]


!Trinix ©   (2006-02-11 16:59:00) 

Ниже следует код, который делает картинку фоном формы. Но допустим в процессе прорраммы мне необходимо поменять картинку на другую, тогда я меняю 'fon.bmp' на 'fon2.bmp' (разумеется в самом коде вместо 'fom.bmp' у меня стоит текстовая переменная). Но вот перекрасить форму не получается ни Form.Repaint, ни Form.Refresh, ни Form.Update. Как сделать правильно?

procedure TForm.FormPaint(Sender: TObject);
var
 x, y: integer; // левый верхний угол картинки
 Back : TBitmap; // фоновая картинка
begin
 Back := TBitmap.Create;
 Back.LoadFromFile('fon.bmp');
 x := 0; y := 0;
 while y < FormMain.Height do
   begin
     while x < FormMain.Width do
       begin
         FormMain.Canvas.Draw(x, y, Back);
         x := x + Back.Width;
       end;
     x := 0;
     y := y + Back.Height;
   end;
 Back.Free;
end;


ссс   (2006-02-13 15:22:00) [1]

procedure TfMain.Button1Click(Sender: TObject);
begin
Invalidate;//Обновление (перерисовкa)  фона формы
end;


API   (2006-02-12 19:44:00) [2]

API   (12.02.06 19:42) [8]

MyBMP.LoadFromFile('Форма.bmp');

заменить на

MyBMP.LoadFromFile(FileName);


API   (2006-02-12 19:42:00) [3]

Gorger ©   (11.02.06 18:55) [4]

в глобальном поле var: MyBmp:TBitmap;
в FormMain.OnPaint  вставить
begin
MyBmp:=TBitmap.Create;
MyBmp.LoadFromFile('Форма.bmp');
BitBlt (FormMain.Canvas.handle,0,0,Width,Height,MyBmp.Canvas.Handle,0,0,SRCCOPY)
end;
в FormMain.OnDeactivate;
begin
MyBmp.Free;
end;


Никогда больше такого никому не советуйте, договорились?...

type
 TMainForm = class()
   procedure OnPaint();
   procedure OnCreate();
   procedure OnDestroy();
 private
   MyBMP: TBitmap;
 public
   procedure SetBackground(FileName: string);
 end;

procedure TMainForm.OnCreate();
begin
 MyBMP := TBitmap.Create;
 SetBackground('Форма.bmp');
end;

procedure TMainForm.OnPaint();
begin
 BitBlt(Canvas.Handle, 0, 0, Width, Height, MyBMP.Canvas.Handle, 0, 0, SRCCOPY); // или как там нужно по задумке
end;

procedure TMainForm.OnDestroy();
begin
 MyBMP.Free;
end;

procedure TMainForm.SetBackground(FileName: string);
begin
 MyBMP.LoadFromFile('Форма.bmp');
 Invalidate;
end;


!Trinix   (2006-02-12 08:54:00) [4]

Спасибо, попробую так.


StriderMan   (2006-02-11 21:05:00) [5]

а к чмеу такие сложности?
можно положить TImage на форму, поставить Align := alClient и менять в ней картинку.
Сам так делал


Eraser   (2006-02-11 19:00:00) [6]


> Gorger ©   (11.02.06 18:55) [4]


> а вот сжимает она очень паршиво

в win2k и выше можно использовать полутона, тогда отлично сжимает.


Gorger   (2006-02-11 18:55:00) [7]

в глобальном поле var: MyBmp:TBitmap;
в FormMain.OnPaint  вставить
begin
MyBmp:=TBitmap.Create;
MyBmp.LoadFromFile('Форма.bmp');
BitBlt (FormMain.Canvas.handle,0,0,Width,Height,MyBmp.Canvas.Handle,0,0,SRCCOPY)
end;
в FormMain.OnDeactivate;
begin
MyBmp.Free;
end;

Если мне не изменяет память, то так.
И еще: если картинка меньше  формы, тогда нужно использовать функцию StretchBlt, вместо почти аналогичной BitBlt. StretchBlt неплохо ресэмплирует изображения
при меньшей величине изображения относительно целевого канваса, а вот сжимает она очень паршиво.


Eraser   (2006-02-11 18:52:00) [8]


> !Trinix ©   (11.02.06 16:59)

InvalidateRect... если не поможет, то ошибка в твоём алгоритме OnPaint.


!Trinix   (2006-02-11 18:39:00) [9]

Ну FormMain, просто когда код сюда вставлял не весь код переименовал.


Dima1   (2006-02-11 17:13:00) [10]

Так тебе же надо не Form.Repaint а FormMain.Repaint


Наверх

Титульная страница Поиск, карта сайта Написать письмо