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

Заполнение изображением MDI-формы 3

Delphi , Программа и Интерфейс , MDI приложения

Заполнение изображением MDI-формы 3

Автор: Alexander N.Voronin

В разделе Заполнение изображением MDI-формы повторяющимся изображением. Я нашел (Copyright не мой а из книжки) более простой способ.


...
private
  OutCanvas: TCanvas;
  OldWinProc, NewWinProc: Pointer;

procedure NewWinProcedure(var Msg: TMessage);
...

procedure TMainForm.FormCreate(Sender: TObject);
begin
  NewWinProc := MakeObjectInstance(NewWinProcedure);
  OldWinProc := Pointer(SetWindowLong(ClientHandle,
    gwl_WndProc, Cardinal(NewWinProc)));
  OutCanvas := TCanvas.Create;
end;

procedure TMainForm.NewWinProcedure(var Msg: TMessage);
var
  BmpWidth, BmpHeight: Integer;
  I, J: Integer;
begin
  // default processing first
  Msg.Result := CallWindowProc(OldWinProc,
    ClientHandle, Msg.Msg, Msg.wParam, Msg.lParam);

  // handle background repaint
  if Msg.Msg = wm_EraseBkgnd then
  begin
    BmpWidth := MainForm.Image1.Width;
    BmpHeight := MainForm.Image1.Height;
    if (BmpWidth <> 0) and (BmpHeight <> 0) then
    begin
      OutCanvas.Handle := Msg.wParam;
      for I := 0 to MainForm.ClientWidth div BmpWidth do
        for J := 0 to MainForm.ClientHeight div BmpHeight do
          OutCanvas.Draw(I * BmpWidth, J * BmpHeight,
            MainForm.Image1.Picture.Graphic);
    end;
  end;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  OutCanvas.Free;
end;

Программа на Delphi, которая заполняет формой с повторяющимся изображением, используя функции SetWindowLong и CallWindowProc, чтобы перехватить сообщение WM_ERASEBKGND и нарисовать изображение на канвасе.

Вот разбивка кода:

  1. В процедуре FormCreate программа создает новый экземпляр функции NewWinProcedure и присваивает его переменной OldWinProc, используя MakeObjectInstance. Она также настраивает переменную OutCanvas, создавая новый экземпляр класса TCanvas.
  2. В процедуре NewWinProcedure программа обрабатывает сообщение WM_ERASEBKGND, проверяя, является ли это сообщение связанным с обновлением фона. Если это так, программа извлекает ширину и высоту изображения из контрола MainForm.Image1 и рассчитывает, сколько раз изображение может поместиться в клиентской области.
  3. Для каждого положения, где изображение может поместиться, программа использует объект OutCanvas, чтобы нарисовать изображение на канвасе в этом положении.
  4. В процедуре FormDestroy программа освобождает объект OutCanvas, используя метод Free.

Преимущества этого подхода:

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

Однако есть несколько потенциальных проблем с этим кодом:

  • Программа предполагает, что контрол MainForm.Image1 всегда является валидным. Если контрол будет удален или станет недоступен, программа может рухнуть или выдать неожиданные результаты.
  • Программа не обрабатывает случаи, когда изображение не может поместиться целиком в клиентскую область. В таких случаях изображение может быть нарисовано частично за пределами клиентской области.
  • Программа использует фиксированный размер канваса для рисования изображения. Если пользователь изменит размер формы, изображение может не быть перерисовано правильно.

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

В статье описывается способ заполнения MDI-формы повторяющимся изображением с помощью изменения процедуры обработки оконных сообщений.


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

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




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


:: Главная :: MDI приложения ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-12 12:43:28/0.0057258605957031/0