桌面画布程序没有用image画图的好象很简单的一个问题,呵呵。望好心大大看看(50分)

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

wadfw

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了个画布程序,直接画图而没有用image画图.发现一个问题,初来乍到望好心大大看看.
因为中途可能做其他事情,防止画布内容丢失,所以我用
DC0:=GetDC(0);
FullscreenCanvas:=TCanvas.Create;
FullscreenCanvas.Handle:=DC0;
先把当前画布保存了下来.

当需要返回画布时我用
Canvas.CopyRect(Rect(0,0,screen.Width ,screen.Height),fullscreenCanvas,Rect(0,0,screen.Width ,screen.Height));
FullscreenCanvas.Free;
ReleaseDC(0,DC0);
想恢复画布,可是为什么没恢复出以前画布的图呢?
Help…………
 
为什么用getDC(0) 呢?
应该拥 bitmap 作临时缓冲
FullscreenCanvas.Handle:=DC0; 错!
 
谢谢xuxiaohan的作答,不过可我验证了一下FullscreenCanvas的画布内容是可以保存为一幅图片文件的啊.问题好象不在那儿吧.
 
不过可我验证了一下FullscreenCanvas的画布内容是可以保存为一幅图片文件的啊
这个当然是的呀。
问题是桌面是会repaint 的, repaint 之后,你的画在 桌面上的内容内容就 消失啦,如果在没有 repaint 之前,保存桌面的 内容 到文件里面,你之前画的内容还是存在的。

给个demo 给你参考。
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
cvs: Tcanvas;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
cvs:=Tcontrolcanvas.Create;
cvs.Handle:=getDC(0); //这里是关键 cvs 就代表了桌面
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
cvs.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
canvas.CopyRect(Rect(0, 0, 80, 60),cvs, rect(0, 0, screen.Width, screen.Height));
end;

end.
 
看起来差不多啊,我好象很愚钝啊^_^
我的FullscreenCanvas全局变量跟您的cvs定义的一样的类型。就用您的变量名吧。我的本意是这样的。假设有两个窗体form1和form2,在form1隐藏之前将当前画布存储到cvs里面,然后显示form2做某些事情,当form2关闭后再显示form1时要在form1上恢复画布。

form1示意代码:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
cvs: Tcanvas;
flag:integer=0;//这个全局变量为1时说明form2关闭恢复到form1了
implementation
uses unit2;
{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Hide;
form2.ShowModal ;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
cvs.Free;
end;

procedure TForm1.FormHide(Sender: TObject);
begin
cvs:=Tcontrolcanvas.Create;
cvs.Handle:=getDC(0);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
if flag=1 then
canvas.CopyRect(Rect(0, 0, 80, 60),cvs, rect(0, 0, screen.Width, screen.Height));
end;
end.

form2示意代码:
unit Unit2;

interface

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

type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation
uses unit1;
{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
flag:=1;
form2.Close;
form1.Show;
end;
end.

当恢复显示form1时画布是空的,难道form1的show事件里恢复的先前存的cvs画布内容没了?
 
怎么没人来啦555
 
你 的代码 没有问题, 但是不能达到你想要的效果,你已经将 桌面 copy 到 Form1 的canvas 上,

但是!!!, 你的 Form show 出来后, 会有一个repaint, repaint之后,哪里还能看到你的刚才画在canvas的 桌面呢?

将代码放到这里,就可以啦。在onpaint 里面。

procedure TForm1.FormPaint(Sender: TObject);
begin
canvas.CopyRect(Rect(0, 0, 80, 60),cvs, rect(0, 0, screen.Width, screen.Height));
end;
 
接受答案了.
 
后退
顶部