我在MDI窗口中加了一个jpg的背景图,但在程序运行阶段时我换了一幅,但窗口改变后,背景图不会自动刷新,而且浮于背景图上方的窗口在拉动的时侯,会出现尾巴现象,请问是不是我哪里没做对,以下是我的制作方法:我就是在MDI窗口中加了一个图像控件,然后,用打开图片的控件在程序运行阶段使用户可以改变背景,其它的就没能了,从现象来看,因为只要MDI窗口的大小一改变,背景图的大小是不会变的,好象是背景图没有刷新似的,但要是我在MDI窗口的paint事件中加上刷新图片,那么,程序很费系统资源。请问那位高手能帮我一下。
解决方案 »
- 李林星U盘启动盘WINPE,一键GHOST,MAXDOS,VEKET四启动的启动盘
- 求助 循环引用出错问题!
- 关于MDIForm问题
- 新手请教关于delphi中ADO组件实现数据的分页显示。
- 老问题,怎么匹配查询条件!分不够可再加!全部分数奉上!
- 求用winsock.pas发送email实例!
- 为什么我做的邮件发送程序发163.com总是不成功(有通过身份验证的),但发Sohu.com和21cn.net,和21cn.com就行请问这是什么问题,赋上源程序请
- 商场POS系统的问题
- 天哪,win2000+delphi6.0告诉我0.1不是有效的浮点数,98、xp就没事,难到让我改用98、xp?
- delphi4、与delphi5或delphi6之间能共存吗?
- 请问大家有谁用过Delphi7自带的工具ModelMaker?
- 推荐一个可以免费下载电影的网站
第二步:将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中的图像所铺满。
TMdiBkndForm = class(TForm)
ImgMain: TImage;
private
{ Private declarations }
FOldClientProc,FNewClientProc:TFarProc;
FDrawDC:hDc;
Procedure ClientWndProc(var Message:TMessage);
Procedure DrawStretched;
Protected
Procedure CreateWnd;Override;
public
{ Public declarations }
end;var
MdiBkndForm: TMdiBkndForm;implementation{$R *.dfm}{ TMdiBkndForm }procedure TMdiBkndForm.ClientWndProc(var Message: TMessage);
begin
Case Message.Msg of
WM_ERASEBKGND:
begin
CallWindowProc(FoldClientProc,ClientHandle,Message.Msg,
Message.WParam,Message.LParam);
FDrawDc:=TWMEraseBkGnd(Message).Dc;
DrawStretched;
Message.Result:=1;
end;
WM_VSCROLL,WM_HSCROLL:
begin
Message.Result:=CallWindowProc(FoldClientProc,ClientHandle,
Message.Msg,Message.WParam,Message.LParam);
Invalidaterect(ClientHandle,nil,True);
end;
else
Message.Result:=CallWindowProc(FoldClientProc,ClientHandle,
Message.Msg,Message.WParam,Message.LParam);
end;
end;procedure TMdiBkndForm.CreateWnd;
begin
inherited;
FNewClientProc:=MakeObjectInstance(ClientWndProc);
FoldClientProc:=Pointer(GetWindowLong(ClientHandle,GWL_WNDPROC));
SetWindowLong(ClientHandle,GWL_WNDPROC,Integer(FNewClientProc));
end;procedure TMdiBkndForm.DrawStretched;
var
Cr:TRect;
begin
GetWindowRect(ClientHandle,Cr);
StretchBlt(FDrawDc,0,0,Cr.Right,Cr.Bottom,
imgMain.Picture.Bitmap.Canvas.Handle,0,0,
imgMain.Picture.Width,imgMain.Picture.Height,SRCCOPY);end;
给分吧!