Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Заполнение фона формы рисунком 2

Delphi , Программа и Интерфейс , Формы

Заполнение фона формы рисунком 2

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

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 then
   begin
     if not Assigned(FWallpaper) then
       FWallpaper := TBitmap.Create;
     FWallpaper.LoadFromFile(OpenDialog1.FileName);
     Invalidate;
   end;
 end;

 procedure TForm1.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
 var
   row, col: Integer;
 begin
   if not Assigned(FWallpaper) then
     inherited
   else
   begin
     // Draw the bitmap 
    // Das Bild zeichnen 
    for Row := 0 to ClientHeight div FWallpaper.Height do
       for 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.

Вот некоторые предложения по улучшению:

  1. Рассмотрите добавление обработки ошибок в случае, если файл, выбранный OpenDialog1, не может быть загружен или не является валидным bitmap.
  2. Текущий код предполагает, что изображение всегда будет fit within the client area of the form. Если это не так, вы можете добавить логику для обработки случаев, когда изображение превышает размеры client area.
  3. Вы также могли бы рассмотреть добавление визуального обратного звонка при выборе пользователем изображения (например, отображение миниатюры выбранного изображения в отдельном панели).
  4. Могло быть более эффективно кэшировать bitmap и перерисовывать его только при изменении размера формы или изображения, а не на каждом событии перерисовки.
  5. Вы также могли бы рассмотреть использование другого контрола вместо переопределения WMEraseBkGnd, например, TImage компонента, который может отображать bitmap.

Вот пример реализации некоторых из этих предложений:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    begin
      if not Assigned(FWallpaper) then
        FWallpaper := TBitmap.Create;
      try
        FWallpaper.LoadFromFile(OpenDialog1.FileName);
        Invalidate;
      except
        ShowMessage('Error loading image');
      end;
    end;
end;

procedure TForm1.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
var
  Row, Col: Integer;
begin
  if not Assigned(FWallpaper) then
    inherited
  else
  begin
     // Draw the bitmap
    for Row := 0 to ClientHeight div FWallpaper.Height do
      for 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;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Invalidate;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FWallpaper.Free;
end;

В этом примере я добавил обработку ошибок в процедуре Button1Click, чтобы отображать сообщение при ошибке загрузки изображения. Я также добавил обработчик события FormResize, который вызывает Invalidate, когда форма изменяется размера, чтобы перерисовать фон.

В статье описывается создание приложения на языке Delphi, которое позволяет заполнять фон формы рисунком с помощью функции BitBlt и обработки сообщения WM_ERASEBKGND.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Формы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:43:53/0.0040898323059082/0