可不可以在MDI的主窗口右下角放个图片? (50分)

娃娃

Unregistered / Unconfirmed
GUEST, unregistred user!
我想知道如何能在MDI窗口的右下角显示一个图片。
而且不论窗口大小如何改变,总是能显示在右下角的位置。

非常感谢!
 
使用一个Image组件,用代码控制位置就行了。
 
Dephi7上可以直接用TImage,否则

给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中的图像所铺满。

 
to 飘摇客: 你的方法不行,总是刷新的不利落。你可以试一下。

to yue_shan: 我用的是Delphi6,你的方法能平铺式的放图片,不过不能只在右下角显
示。

大家再看看吧
 
放个TPANEL靠底,上面放TIMAGE靠右就行了。
 
这个可是,这个,恩,我并不想灌水
 
to: 平凡人
你的方法是肯定可以把这个图放到右下角的,可是主窗口的客户区却小了。
这不行。
 
假设原来窗体的height为480,width为696,image的top为328,left为504,在下述事件中写代码:
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
image1.Top := Height - (480-328);
image1.Left := width - (696-504);
end;
有什么不利索的吗?
 
to HunterTeam
你可以试试你的方法,然后再改变一下窗口的大小,看看效果再说。
 
我的是D7,一点问题也没有,就是试过了才给你的。
 
我的是D6,不行啊,主要是刷新的时候不及时,容易出现一块一块的刷不干净一样.
 
我找到了那个MDI WallPaper控件看了一下,不过他的源码好象也不是很行。可能是小弟和功力不够吧,大家伙看看。
wpBottomRight:
begin
FillRect(Rect(R.Left, R.Top, R.Right, R.Bottom-Graphic.Height));
FillRect(Rect(R.Left, R.Bottom-Graphic.Height, R.Right-Graphic.Width,
R.Bottom));
Draw(R.Right-Graphic.Width, R.Bottom-Graphic.Height, Graphic);
end;
这段是在with Client.Canvas do中
Client应该是这样定义的: property Client: TForm read GetClient;
具体还有很多关连,不过好象主要就是这段了,大家看看吧。
 
GetClient是这样的。
function TMDIWallpaper.GetClient: TForm;
begin
Result := TForm(Owner);
end;
 
这个应该是他的主过程
procedure TMDIWallpaper.ClientWndProc(var Message: TMessage);
var
ClientIsMDIForm: Boolean; //检测窗体是不是MDI窗体
begin
ClientIsMDIForm := Client.FormStyle = fsMDIForm;
with Message do
begin
if Msg = WM_ERASEBKGND then
if FEnabled and EraseBkgnd then
begin
Result := 1;
Exit;
end;
if not ClientIsMDIForm then
Result := CallWindowProc(FDefClientProc, ClientHandle, Msg, wParam, lParam);
case Msg of
WM_SIZE:
begin
if not ClientIsMDIForm then
begin
CalcHorzOffset;
CalcVertOffset;
end;
if not (FMode in [wpTile, wpTopLeft]) then
InvalidateBackground;
end;
{$IFNDEF VER90}
WM_SYSCOLORCHANGE: SysColorChange;
{$ENDIF}
WM_HSCROLL:
begin
CalcHorzOffset;
if FMode <> wpTile then InvalidateBackground;
end;
WM_VSCROLL:
begin
CalcVertOffset;
if FMode <> wpTile then InvalidateBackground;
end;
end;
if ClientIsMDIForm then
Result := CallWindowProc(FDefClientProc, ClientHandle, Msg, wParam, lParam);
end;
 
不是这个问题也没有人知道答案吧?
 
是不是改变窗体大小后image花了?

ShowWindow(main.ClientHandle, sw_hide);
ShowWindow(main.ClientHandle, sw_show);

试试
 
to lcl_003
你的方法可以,不过太过闪烁了。可不可以改良一下。

如果没有朋友再发贴的话,我就结贴了。
 
to lcl_003
不好意思,昨天晚上又试了一下你的办法,没有想到有一个很大的弊端,就是在某些机子上面MDI子窗口只要不是最大化状态,就会出现一些Form区域画不出来(比如窗体上面的蓝条),这更麻烦!
 
>>我想知道如何能在MDI窗口的右下角显示一个图片。
>>而且不论窗口大小如何改变,总是能显示在右下角的位置。

你就要这功能吗?我试了,没问题啊

procedure TForm1.FormResize(Sender: TObject);
begin
ShowWindow(form1.ClientHandle, sw_hide);
image1.Left := form1.Width - 200;
image1.Top := form1.Height - 150;
ShowWindow(form1.ClientHandle, sw_show);
end;

win2000p+d6通过
 
如果只是把图片放到MDI窗口的右下角来说,你的方法的确可以,虽然有点闪烁。

但是如果你有一个MDI子窗口的话,你试试把这个窗口在不是最大化的状态下是什么样子。

 
顶部