在MDI主Form上显示不出图像(22分)

  • 主题发起人 主题发起人 wugr
  • 开始时间 开始时间
W

wugr

Unregistered / Unconfirmed
GUEST, unregistred user!
在MDI主Form上显示不出图像,如果加一个Panel后可以显示,但ChildForm上看不到.请指教。原来图形图像论坛中回答的有一种做法,但不成功,报divid zero error.
 
MDI 上是不能显示图像的,如果要显示,就截获 windows 的消息来显示,我原来
有一个能在 mdi 中平铺显示图像的程序,现在找不到了... :(,找到给你吧。
 
想起来了,是在一本《Delphi编程技巧》的书上,明天给你。
 
两位大侠,快点发来。
我昨天翻了一些书,能不能在Form Create的时候,得到HDC利用Convas自己画一个,但还要控制刷新,太麻烦了。
 
我以前用过个第三方构件,可以显示,for delphi 3的。你可以在深度历险里找到的。
 
论坛中肯定有这个答案,就是怎么在MDI 的主Form上画图。
我的一个程序就是根据论坛上的回答实现的。好好找找,
呵呵。
 
傻鸟,看看这个帖子不就解决了嘛!!

http://www.delphibbs.com/delphibbs/DispQ.asp?LID=130802

乖孩子,以后提问题前先查查“已答问题”区。。记住了么?
 
找到了。这两天电话未交费停机 :(
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FClientInstance,FPrevClientProc: TFarProc;
procedure ClientWndProc(Var Message: TMessage);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ClientWndProc(var Message: TMessage);
var MyDC: hDC;
Ro,Co: Word;
begin
with Message do begin
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;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(ClientHandle,GWL_WNDPROC));
SetWindowLong(ClientHandle,GWL_WNDPROC,LongInt(FClientInstance));
end;

end.
 
www.csdn.net/delphi上有一个很好的例子。
 
同志们,本版贴子上曾经有一个解决方案,但是如果上天再给我一个机会的话,我认为这个贴子不对,按照Crab大侠的程序我得不到Image.height&Image.width,因此会报Divid zero error.如果用bitblt的话,但是处理wm_size消息的时候,不能刷新。我感到非常的失败,看来这个问题不是我想象中解决的那么容易,我决定提高应答的奖励分数,虽然我已经没有几分了。感谢大家的积极讨论,希望我们能一鼓作气尽快解决。
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
FClientInstance,
FPrevClientProc : TFarProc;
PROCEDURE ClientWndProc(VAR Message: TMessage);

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));

end;
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;


end.
 
没有解决,谢谢大家
 
看看这个吧:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=263988
 
其实只需要给你的Form加上一个 WM_EraseBKGnd消息处理,里面绘制背景图像即可
 
接受答案了.
 

Similar threads

D
回复
0
查看
744
DelphiTeacher的专栏
D
D
回复
0
查看
718
DelphiTeacher的专栏
D
D
回复
0
查看
672
DelphiTeacher的专栏
D
后退
顶部