MDI的画图问题,在网上翻了一天,没有找到答案 (50分)

  • 主题发起人 主题发起人 Dlwxn
  • 开始时间 开始时间
D

Dlwxn

Unregistered / Unconfirmed
GUEST, unregistred user!
子窗体上有ScrollBox,将PaintBox放在ScrollBox上,在PaintBox的MouseDown、MouseUp、MouseMove事件中绘图,但当有多个子窗体时,如果在一个子窗体上绘图时其它的子窗体上也同时绘出同样的图形,我要在不同的子窗体上绘不同的图形。

我的程序比较复杂,为了说明这个问题,我做了一个简单的,又发现了一个新的问题,当有两个子窗体,在第一个子窗体上绘图,如果将另一个子窗体从第一个子窗体上移过,刚画的图形被檫除,以下是我的代码,这是怎么回事,最好能回答我的上面的问题。先谢谢!
unit Unit1;

interface

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

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
New1: TMenuItem;
procedure New1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses unit2;
{$R *.dfm}



procedure TForm1.New1Click(Sender: TObject);
begin
TForm2.Create(Application) ;
end;

end.



unit Unit2;

interface

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

type
TForm2 = class(TForm)
ScrollBox1: TScrollBox;
PaintBox1: TPaintBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
Drawing:boolean;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

procedure TForm2.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing:=true;
PaintBox1.Canvas.Pen.Mode:=pmNotXor;
PaintBox1.Canvas.MoveTo(x,y);
end;

procedure TForm2.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing:=false;
end;

procedure TForm2.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Drawing then
PaintBox1.Canvas.LineTo(x,y);
end;

end.

 
1、第一个窗体上的绘图会在第二个上出现?不会吧
2、需要在OnPaint事件中调用你的绘图代码重绘
 
1.确实是这样的,并不是同时出现的,当在一个窗口绘图完毕,点第二个窗口时,就会出现和第一个窗口一样的图形,就像在一个窗口上绘图一样。上面的程序不是这样的,我的另一个是的,真是奇怪。
2。上面的程序,如果已经新建一个子窗体,并绘图,再建一个子窗体,第一个的图就没有了。
 
原因在于:你在PaintBox上画的东西,并不是由OnPaint绘出。
你在OnMouse...在些事件中画的东西是可以看见,但只是临时的(看看涂鸦示例),
一旦操作系统要求PaintBox进行重绘,先前的东西抹去(有时不是全抹,是因为有ClipRect),如果你没有响应OnPaint重新画,则只能是空的了。
不知道你想干什么,按你的程序有办法两个办法:
1.在程序中建一个TBitmap作缓冲区,尺寸不小于PaintBox的大小;在OnMouse...事件中向它上面画,而响应OnPaint时,将缓冲区上的东东Copy上去;
2.如果你要是想做成矢量图,麻烦大了,需要将每次鼠标标定的位置记录下来,用点集存放一线段或折线信息,响应OnPaint时把这些线一个个画上去。
 
to :apw
我要做的是电路图,因为有很多不相关图,用户可能同时在一个主窗体打开多个图,所以考虑用MDI。我的每个图形元件是矢量图,因为要求能够旋转,所以基本图形都是在直线上画的,记录线的起点和终点就能绘出图形,现在我正在做图形的保存和打开功能,需要记录图形的这些参数到数据库中。如果我把这部分做出来后,在OnPaint事件是不是就可以解决这个问题?
 
基本上是这样。
一个好的矢量编辑器决不是在PaintBox就能做出来的。 
 
另,我的程序并没有上面的例子的那种一个子窗体覆盖另一个子窗体后图形没有的现象,只有两个子窗体上同时绘图和新建时先前所有图形都没有。
 
to apw:
一个好的矢量编辑器决不是在PaintBox就能做出来的,我也有同感,但我现在的水平只能做成这样了,能不能给点好的建议,现在还没有开始正式做,只是有这种想法。 
 
现在终于找到,多个窗体同时出现绘一个图形的原因。就因为我把各种图形都记录下来,然后在PaintBox 的 OnPaint 重画图形,因为所有子窗体的PaintBox 的 OnPaint 代码都是一样的,才在不同的子窗体中画出同样的图形。
上面的例子因为没有这个过程,才没有在不同窗体绘不同的图形。
 
用专门的矢量控件,如OPlan。
自己写一些显示图元即可达到你的要求。 
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
733
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
588
import
I
后退
顶部