如何实现背景图平铺?(100分)

  • 主题发起人 主题发起人 kozzi
  • 开始时间 开始时间
K

kozzi

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]如何用delphi实现背景图平铺?
 
FClientInstance,
FPrevClientProc : TFarProc;
PROCEDURE ClientWndProc(VAR Message: TMessage);
在Private中定义以上内容,

PROCEDURE TForm1.ClientWndProc(VAR Message: TMessage);
VAR
MyDC : hDC;
Ro, Co : Word;
begin

with Message do
case Msg of
WM_ERASEBKGND:
begin
MyDC := TWMEraseBkGnd(Message).DC;
FOR Ro := 0 TO ClientHeight DIV Image1.Picture.Height DO
FOR Co := 0 TO ClientWIDTH DIV Image1.Picture.Width DO
BitBlt(MyDC, Co*Image1.Picture.Width, Ro*Image1.Picture.Height,
Image1.Picture.Width, Image1.Picture.Height,
Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
Result := 1;
end;
else

Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam);
end;
end;

在窗体创建中加入:
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
 
以上代码对MDIform有效
 
背景用一个image控件,只要delphi设一下就可了我的是delph7 (相信其它版本也有自带的)
image控件在addtional页下
image 属性如下:
属性 值
align alclient
picture 这里设一下你图片,你可以点右边设好就可以了。
stretch true

这样就可以了

也可以先设好picture属性 再在form 的 create事件里加如下这样一个代码
with image1 do
begin
align:=alclient;
stretch:=true;
end;
 
话题476793的标题是: 怎么实现让小图片平铺在窗体上?就像网页中的背景图片一样,谢谢 (50分)
分类:非技术问题 bevy (2001-03-22 17:06:00)
谢谢

doud (2001-03-22 17:55:00)
Form1.Brush.Bitmap:=Image1.Picture.Bitmap;
图的颜色别太多

lha (2001-03-22 18:00:00)
不知用Form.Canvas 画上去行不行?

rss (2001-03-22 18:06:00)
Canvas可以.Delphi的帮助文件中有实例。具体在哪忘了。

wjiachun (2001-03-22 18:45:00)
image1.Picture.LoadFromFile('aaa.bmp');
Self.brush.bitmap:=image1.picture.bitmap;
//可以让小图片平铺在窗体上

doxpix (2001-03-22 18:55:00)
这可曾经是著名的“一行搞定”呀!
怀念wzs!

程云 (2001-03-22 19:22:00)
哪小子的一行解决也是这样的。

关于FORM背景新解(包含MDI) ( 一行解决问题!!!!) (推荐)
在Form中添加Image控件
设BMP图象
name为 IMG_BK
在Form的Create事件中写入
Self.brush.bitmap:=img_bk.picture.bitmap;

to lha:
可以画上,但太麻繁了。


lha (2001-03-22 19:56:00)
谢谢 程云!

程云 (2001-03-22 20:06:00)
哈哈!不客气,
只是你自己画上去时,还得打两个循环去平铺它,
我刚学编程时就这么干的,挺麻烦的。

bevy (2001-03-30 2:28:00)
有个问题:
如果图片是jpg,而不是bmp的,是不是就不行了?那该怎么办呢?

bevy (2001-06-06 19:57:00)
多人接受答案了。


doud-25,程云-25,的回答最终被接受。
 
如果非MDIform就更简单了,利用逐行扫描或逐列扫描
清单:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,Forms;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
public
{ Public declarations }
//在这里声明隐形控件Tbitmap名为bg
bg:TBitmap;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//动态创建一个bitmap对象,名为bg
bg:=Tbitmap.Create;
//加载程序目录下的bg.bmp文件
bg.LoadFromFile(ExtractFilepath(paramstr(0))+'bg.bmp');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//释放是有必要的
bg.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
//定义宽为w和高为h
var w,h:integer;
begin
//初始化高度
h:=0;
//逐行扫描开始
while h<=clientheight do
begin
//初始化宽度
w:=0; //初始化宽度
while w<=clientwidth do
begin
//用canvas方法在指定位置画图
canvas.Draw(w,h,bg);
//指定下一个画图的位置所在的宽
w:=w+bg.Width;
end;
//指定下一个画图的位置所在的高
h:=h+ bg.Height;
end;
end;

end.
 
//绘制平铺图
procedure TBitmap32.DrawTiled(Canvas: TCanvas; Rect: TRect; G: TGraphic);
var
R, Rows, C, Cols: Integer;
begin
if (G <> nil) and (not G.Empty) then
begin
Rows := ((Rect.Bottom - Rect.Top) div G.Height) + 1;
Cols := ((Rect.Right - Rect.Left) div G.Width) + 1;
for R := 1 to Rows do
for C := 1 to Cols do
Canvas.Draw(Rect.Left + (C - 1) * G.Width, Rect.Top + (R - 1) * G.Height, G);
end;
end;
 
后退
顶部