给MDIFORM加上背景图(50分)

  • 主题发起人 主题发起人 onlyonekgx
  • 开始时间 开始时间
O

onlyonekgx

Unregistered / Unconfirmed
GUEST, unregistred user!
如何给MDIFORM加上背景图?
 
窗体上放一个Timage控件和图片!再参考以下代码!
procedure TForm.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;//在MDI主窗体中显示图象
end;
procedure TForm.FormCreate(Sender: TObject);
begin
Fclientinstance:=makeobjectinstance(clientwndproc);
Fprevclientproc:=pointer(getwindowlong(clienthandle,gwl_wndproc));
Setwindowlong(clienthandle,gwl_wndproc,longint(fclientinstance));
end;
 
其实你可以查一下以前的答案。

procedure TForm1.FormCreate(Sender: TObject);
var
TempBmp : TImage;
ss : String;
begin
try
Tempbmp := TImage.Create(nil);
TempBmp.Picture.LoadFromFile(ExtractFileDir(Application.ExeName)+'/bg.bmp');
Self.Brush.bitmap:= TempBmp.Picture.Bitmap;
finally
TempBmp := nil;
TempBmp.Free;
end;
end;


以上代码是在MDI主窗口绘出当前程序所在目录的bg.bmp文件,你可以根据自己的需要进行修改。
 
MDI Wallpaper v2.0.0
墙纸构件,可将Form背景填充为指定图案,多种填充方式,使用简单。
完整功能. 源代码: 有
http://www.delphibyte.com/download/softdown.php?softid=30&url=http://61.132.118.165/soft/delphi/Delphi/uestc/Delphi/mdiwallp.zip
 
有没有办法将mdi窗口的标题栏去掉,搞个没有caption的子窗口?
 
在delphi 6中窗体直接用加上Timage就可以了。
 
窗体上放一个Timage控件image1,选择图片!
private
{ Private declarations }
FClientInstance, FPrevClientProc : TFarProc;
PROCEDURE ClientWndProc(VAR Message: TMessage);
procedure CreateMDIChild(const Name: string);
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

{$R *.DFM}

uses ChildWin, About;
PROCEDURE TMainForm.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;
 
这段代码在哪里放,主窗口或子窗口?
 
请帮个忙[:D]
 
:在Form1的创建事件中加入:
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
 
有没有更好的方法?
 
FOR Co := 0 TO ClientWIDTH DIV Image1.Picture.Width DO

发生除零错误
 
可以实现将mdi窗口的标题栏去掉,搞个没有caption的子窗口?
 
给MDI主窗口加背景
在MDI程序中,由于MDI的主窗口一般的功能是提供子窗口显示的位置和提供菜单、工具条、状态条等,
而窗口的客户区则一般不会有其它的用途,如果在这里画上一些软件的标志、公司的标志或者其它的背景
图案的话,不仅可以使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中的图像所铺满。

 
多人接受答案了。
 
后退
顶部