加入一个Timage,Align设成alClient,Stretch设成True.
解决方案 »
- 关于窗口最小化问题
- ImageList图片透明显示问题,XP下,16位色显示属性和32色显示属性显示不同。
- 哪有delphi的3D按钮控件下载啊
- 高手请进->>>子窗体的边界能否越过父窗体的边界?(就是子窗体并未框在父窗体里面)
- TADOtable append的问题
- 如何发布COM+ 的服务器端 和 客户端
- 1000分求一压缩文件rar的解压密码,如不够,可带报酬,绝不食言!!!
- 一个在win98中有win2000下没有的API如何在win2000的delphi中编译?
- 关于dispose释放内存的问题?
- 请问ODBC如何设置?
- tchart控件的问题高手帮忙
- 如何将Cardinal类型转换成string? 100分相送!
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;
Brush.Bitmap := Image1.Picture.Bitmap;
这样就不会加大可执行文件体积.
1、定义Bitmap;
2、初始化Form.create:
Bitmap:=Tbitmap.create;
Bitmap.loadFromFile('aa.bmp')
3、在form.destroy中
var x,y:integer;
begin
y:=0;
while y<height do
begin
x:=0;
while x<width do
begin
Canvas.dram(x,y,Bitmap);
x:=x+Bitmap.width;
end;
y:=y+Bitmap.height;
end;
end;
你说的这样回有问题的,当你有工具条的时候,你的背景图片上面会留一个空白。
你说的要写到这个消息里边吗?
procedure ClientWndProc(var Message: TMessage);
CoDelphi.com 摘 要:我怎样使我的MDI窗口有一个背景图象或使它平铺?
关键字:多文档界面 背景 图象 平铺
类 别:用户界面
--------------------------------------------------------------------------------
确定你已在在你的主窗体对象中加入了下面的变量:
FClientInstance : TFarProc;
FPrevClientProc : TFarProc;
{ MDI的背景代码 }
procedure TMainForm.ClientWndProc(var Message: TMessage);
var
Dc : hDC;
Row : Integer;
Col : Integer;
begin
with Message do
case Msg of
WM_ERASEBKGND:
begin
Dc := TWMEraseBkGnd(Message).Dc;
// 在DC上平铺图象
for Row := 0 to ClientHeight div Image1.Picture.Height do
for Col := 0 to ClientWidth div Image1.Picture.Width do
BitBlt(Dc,
Col * Image1.Picture.Width,
Row * 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; - 在你的主窗体的OnShow事件中加入以下代码: // MDI背景平铺代码,与WndProc链接
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(ClientHandle,GWL_WNDPROC));
SetWindowLong(ClientHandle,GWL_WNDPROC,LongInt(FClientInstance)); - 现在你有一个背景了!
在mdiForm的Create事件中写入
Self.brush.bitmap:=image1.picture.bitmap;
=============================================
以上方法存在的问题是:不能很好的解决刷新问题。
在MdiFormCreate事件中
Brush.Bitmap := Image1.Picture.Bitmap;
第二步:将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中的图像所铺满。
你提供的方法中我在DELPHI6中会有异常,
通过断点
执行BitBlt后
Image1.Picture.Height 和WIDTH会都变为0,
DIV后会有异常
不知是什么原因
我的图片是JPG格式