我想在form上贴上背景,tell me,what can i do ?(50分)

  • 主题发起人 主题发起人 slfeng
  • 开始时间 开始时间
S

slfeng

Unregistered / Unconfirmed
GUEST, unregistred user!
一个简单的问题,我要在主窗口上贴上背景,(bmp,jpe,gif都成)
为了程序不会太大,我打算在FormCreate事件中用代码完成,背景大小远小于窗口,所以要使用无缝贴图,有没有好的解决方案?
thanks everybody.
 
在Form中添加Image控件
设BMP图象
name为 IMG_BK
在Foem的Create事件中写入
Self.brush.bitmap:=img_bk.picture.bitmap;
 
如果是mdi窗口,可以用以下的例子:
由于mdi主窗口的特性,使用普通onpaint和使用timage等方法都不会产生作用。下面将用编写一个简单的mdi程序来介绍如何实现。

第一步:打开delphi(delphi 1,2,3都可以),创建一个新的工程。
第二步:将form1的formstyle设置为fsmdiform,设置成mdi的主窗口。
第三步:在form1上增加一个image元件,并选择要设置的背景到image的picture中。
第四步:在form1的private中定义:
fclientinstance,
fprevclientproc : tfarproc;
procedure clientwndproc(var message: tmessage);
第五步:在实现(implementation)中加入上述过程的具体内容:
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;

第六步:在form1的创建事件中加入:
fclientinstance := makeobjectinstance(clientwndproc);
fprevclientproc := pointer(getwindowlong(clienthandle, gwl_wndproc));
setwindowlong(clienthandle, gwl_wndproc, longint(fclientinstance));

上面的步骤已经完成了mdi主窗口背景图案的设置,下面可以增加一个mdichild窗口,实现mdi程序。

第七步:新增加一个form,并将formstyle设置为fsmdichild。

现在你可以编译运行这个程序,你会发现,image元件并不会在form上显示出来,但是整个form的客户区域被image中的图像所铺满。


如何使 mdichildform正常关闭

为何我用 delphi 写的 mdi child window 无法 close ? 请各位先进指教一下,是否
我那个 property 设错了 ?

请在 mdi child 的 onclose() 事件中加入这列程式

action := cafree;
例如:
procedure tfrom2.formclose(sender: tobject;
var action: tcloseaction);
begin
action := cafree;
end;


 
我说过,要把单副图片无缝拼接成背景.
一个Image一定是不够的,动态生成几十副Image有一定不是好办法.
 
不好意思,我用的不是mdi子窗口
 
无缝贴图,难度较大。
lisent
 
1.用image控件调用需要设为布景的图片(image.autosize:=true);
2.通过image获得高度和宽度;
3.从窗体的(0,0)位置画图片,一排排的画,直到画完为止;
这样就可以达到无缝贴图效果.
 
一排排的画我也试过,可以成功,但是,一旦窗口变大会很难看,而且,我说过,
动态生成Image很麻烦,不是好办法
 
应该在窗体的onpaint事件里加代码,定义一个tbitmap的对象,在onpaint事件里进行:canvas。draw()画出来背景,这是最好的办法!
 
我没有说要动态生成image,而且写在onpaint事件中,窗口变大也不会有影响.
 
不对,应该改变canvas.pattern属性,然后让在整个窗口上画就行了!
 
Chenlili 的作法是对的,我在什么地方也见过,曾经测试过,很成功,就象
windows桌面的平铺贴图效果一样。
 
用onpaint,程序也不会太大呀。
1、在Var部分加入以下说明:
TileImage:TImage;
2、编写Form1.OnCreate事件代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
TileImage:=TImage.Create(Self);
TileImage.Picture.LoadFromFile('bg_green.bmp');
end;
3、编写Form1.OnPaint事件代码:
procedure TForm1.FormPaint(Sender: TObject);
var
PWidth,PHeight,X,Y: Integer;
begin
PWidth := TileImage.Picture.Bitmap.Width;
PHeight := TileImage.Picture.Bitmap.Height;
X := 0;
while X < Form1.Width do begin
Y := 0;
while Y < Form1.Height do begin
Form1.Canvas.Draw(X, Y, TileImage.Picture.Bitmap);
Y := Y + PHeight;
end;
X := X + PWidth;
end;
end;
 
请看看这段原码有什么问题



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender:TObject);
private

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
BackFile:String;
BackBitmap:TBitmap;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
BackFile:='./back/back.bmp';
BackBitmap:=TBitmap.Create;
BackBitmap.LoadFromFile(BackFile);


end;

procedure TForm1.FormPaint(Sender: TObject);
var X,Y,W,H:Longint;
begin
inherited;
with BackBitmap do
begin
W:=Width;
H:=Height;
end;
Y:=0;
while Y<Form1.Height do
begin
X:=0;
while X<Form1.Width do
begin
Form1.Canvas.Draw(X,Y,BackBitmap);
Inc(X,W);
end;
Inc(Y,H);
end;

end;

end.
 
//重贴一遍
//这段代码好像不管用,请朋友们看看何处有问题

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender:TObject);
private

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
BackFile:String;
BackBitmap:TBitmap;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
BackFile:='./back/back.bmp';
BackBitmap:=TBitmap.Create;
BackBitmap.LoadFromFile(BackFile);


end;

procedure TForm1.FormPaint(Sender: TObject);
var X,Y,W,H:Longint;
begin
inherited;
with BackBitmap do
begin
W:=Width;
H:=Height;
end;
Y:=0;
while Y<Form1.Height do
begin
X:=0;
while X<Form1.Width do
begin
Form1.Canvas.Draw(X,Y,BackBitmap);
Inc(X,W);
end;
Inc(Y,H);
end;

end;

end.
 
//不知为什么,最后的一段代码还的贴一遍
procedure TForm1.FormPaint(Sender: TObject);
var X,Y,W,H:Longint;
begin
inherited;
with BackBitmap do
begin
W:=Width;
H:=Height;
end;
Y:=0;
while Y<Form1.Height do
begin
X:=0;
while X<Form1.Width do
begin
Form1.Canvas.Draw(X,Y,BackBitmap);
Inc(X,W);
end;
Inc(Y,H);
end;

end;



end.
 
procedure TForm1.FormPaint(Sender: TObject);
var X,Y,W,H:Longint;
begin
inherited;
with BackBitmap do
begin
W:=Width;
H:=Height;
end;
Y:=0;
while Y < Form1.Height do
begin
X:=0;
while X < Form1.Width do
begin
Form1.Canvas.Draw(X,Y,BackBitmap);
Inc(X,W);
end;
Inc(Y,H);
end;

end;
 
很倒霉是不是,一段代码贴了4遍,不管怎样,终于贴上去了。
请大家帮帮。
 
何须那样麻烦,我有一计,首先动态创建一个BitMap,在窗口指定位置用canvas.StretchDraw()画到指定的矩形上,然后用bitBlt将象素依照固
定格式复制,直到画满预定的区域。
 
i success,thanks everybody.
 
后退
顶部