type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FWallpaper: TBitmap;
procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd); message WM_ERASEBKGND;
end;
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForm1.FormDestroy(Sender: TObject);
begin
FWallpaper.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin// Load the bitmap // Bild laden if OpenDialog1.Execute thenbeginifnot Assigned(FWallpaper) then
FWallpaper := TBitmap.Create;
FWallpaper.LoadFromFile(OpenDialog1.FileName);
Invalidate;
end;
end;
procedure TForm1.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
var
row, col: Integer;
beginifnot Assigned(FWallpaper) theninheritedelsebegin// Draw the bitmap // Das Bild zeichnen for Row := 0 to ClientHeight div FWallpaper.Height dofor Col := 0 to ClientWidth div FWallpaper.Width do
BitBlt(Msg.Dc,
Col * FWallpaper.Width,
Row * FWallpaper.Height,
FWallpaper.Width,
FWallpaper.Height,
FWallpaper.Canvas.Handle,
0,
0,
SRCCOPY);
Msg.Result := 1;
end; { else }end;
end.
Перевод текста на русский язык:
Это программное обеспечение Delphi, которое устанавливает фон формы с изображением, загруженным из файла с помощью OpenDialog1. Изображение отображается путем переопределения процедуры WMEraseBkGnd, которая вызывается, когда форма necesita перерисовать свой фон.
Вот разбивка кода:
Declared TForm1 class, which represents the main form of the application.
It has three properties: Button1 (a TButton), OpenDialog1 (a TOpenDialog for selecting files) and FWallpaper (a TBitmap).
The FormDestroy procedure is used to free the memory allocated for FWallpaper when the form is closed.
In the Button1Click procedure, when the button is clicked, it opens a file dialog to select an image. If an image is selected, it loads that image into FWallpaper and then calls Invalidate to redraw the form.
The WMEraseBkGnd procedure is overridden to draw the background of the form with the loaded image. It does this by iterating over the client area of the form (ClientHeight and ClientWidth), dividing these dimensions by the height and width of the image, respectively, and then drawing the corresponding section of the image at each position using BitBlt.
If an image is not yet loaded, it simply calls the inherited procedure to draw a default background.
Вот некоторые предложения по улучшению:
Рассмотрите добавление обработки ошибок в случае, если файл, выбранный OpenDialog1, не может быть загружен или не является валидным bitmap.
Текущий код предполагает, что изображение всегда будет fit within the client area of the form. Если это не так, вы можете добавить логику для обработки случаев, когда изображение превышает размеры client area.
Вы также могли бы рассмотреть добавление визуального обратного звонка при выборе пользователем изображения (например, отображение миниатюры выбранного изображения в отдельном панели).
Могло быть более эффективно кэшировать bitmap и перерисовывать его только при изменении размера формы или изображения, а не на каждом событии перерисовки.
Вы также могли бы рассмотреть использование другого контрола вместо переопределения WMEraseBkGnd, например, TImage компонента, который может отображать bitmap.
Вот пример реализации некоторых из этих предложений:
procedureTForm1.Button1Click(Sender:TObject);beginifOpenDialog1.ExecutethenbeginifnotAssigned(FWallpaper)thenFWallpaper:=TBitmap.Create;tryFWallpaper.LoadFromFile(OpenDialog1.FileName);Invalidate;exceptShowMessage('Error loading image');end;end;end;procedureTForm1.WMEraseBkGnd(varMsg:TWMEraseBkGnd);varRow,Col:Integer;beginifnotAssigned(FWallpaper)theninheritedelsebegin// Draw the bitmapforRow:=0toClientHeightdivFWallpaper.HeightdoforCol:=0toClientWidthdivFWallpaper.WidthdoBitBlt(Msg.Dc,Col*FWallpaper.Width,Row*FWallpaper.Height,FWallpaper.Width,FWallpaper.Height,FWallpaper.Canvas.Handle,0,0,SRCCOPY);Msg.Result:=1;end;end;procedureTForm1.FormResize(Sender:TObject);beginInvalidate;end;procedureTForm1.FormDestroy(Sender:TObject);beginFWallpaper.Free;end;
В этом примере я добавил обработку ошибок в процедуре Button1Click, чтобы отображать сообщение при ошибке загрузки изображения. Я также добавил обработчик события FormResize, который вызывает Invalidate, когда форма изменяется размера, чтобы перерисовать фон.
В статье описывается создание приложения на языке Delphi, которое позволяет заполнять фон формы рисунком с помощью функции BitBlt и обработки сообщения WM_ERASEBKGND.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.