В разделе Заполнение изображением 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 repaintif Msg.Msg = wm_EraseBkgnd thenbegin
BmpWidth := MainForm.Image1.Width;
BmpHeight := MainForm.Image1.Height;
if (BmpWidth <> 0) and (BmpHeight <> 0) thenbegin
OutCanvas.Handle := Msg.wParam;
for I := 0 to MainForm.ClientWidth div BmpWidth dofor 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 и нарисовать изображение на канвасе.
Вот разбивка кода:
В процедуре FormCreate программа создает новый экземпляр функции NewWinProcedure и присваивает его переменной OldWinProc, используя MakeObjectInstance. Она также настраивает переменную OutCanvas, создавая новый экземпляр класса TCanvas.
В процедуре NewWinProcedure программа обрабатывает сообщение WM_ERASEBKGND, проверяя, является ли это сообщение связанным с обновлением фона. Если это так, программа извлекает ширину и высоту изображения из контрола MainForm.Image1 и рассчитывает, сколько раз изображение может поместиться в клиентской области.
Для каждого положения, где изображение может поместиться, программа использует объект OutCanvas, чтобы нарисовать изображение на канвасе в этом положении.
В процедуре FormDestroy программа освобождает объект OutCanvas, используя метод Free.
Преимущества этого подхода:
Он более эффективен, чем предыдущие методы, потому что он перерисовывает только те части изображения, которые требуют обновления.
Он проще реализовать, потому что он использует стандартные контролы Delphi и процедуры.
Однако есть несколько потенциальных проблем с этим кодом:
Программа предполагает, что контрол MainForm.Image1 всегда является валидным. Если контрол будет удален или станет недоступен, программа может рухнуть или выдать неожиданные результаты.
Программа не обрабатывает случаи, когда изображение не может поместиться целиком в клиентскую область. В таких случаях изображение может быть нарисовано частично за пределами клиентской области.
Программа использует фиксированный размер канваса для рисования изображения. Если пользователь изменит размер формы, изображение может не быть перерисовано правильно.
В целом, это код - хороший старт для заполнения формой с повторяющимся изображением, но он может потребовать дополнительных модификаций и обработки ошибок, чтобы сделать его надежным и надежным в всех сценариях.
В статье описывается способ заполнения MDI-формы повторяющимся изображением с помощью изменения процедуры обработки оконных сообщений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.