![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление фона формы [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