谁能帮我看看这个程序---消除图象闪烁(100分)

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

westbird

Unregistered / Unconfirmed
GUEST, unregistred user!
谁能帮我看看这个程序---消除图象闪烁
这是一个例子程序
我用的是Delphi6,panel.align:=alclient;
image.transparent:=false;
怎样消除图象闪烁

原程序如下:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
FramePanel: TPanel;
BackImage: TImage;
ForeImage: TImage;
procedure FormCreate(Sender: TObject);
procedure ForeImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }

public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
const
sSide=30;
dSide=45;

var
msHide: Boolean;
OldX, OldY, NewX, NewY: Integer;
DestRect, SourceRect : TRect;
//其中,常量sSide和dSide用以控制"放大镜"的大小和放大倍数;变量msHide控制光标(鼠标)的隐藏和打开;其它变量用以确定放大部位。

procedure ImageCopy(BoxCenterX, BoxCenterY, BoxSide: Integer);
begin
with SourceRect do
begin
Left:=BoxCenterX-BoxSide;
Top:=BoxCenterY-BoxSide;
Right:=BoxCenterX+BoxSide;
Bottom:=BoxCenterY+BoxSide;
end;

with DestRect do
begin
Left:=BoxCenterX-dSide;
Top:=BoxCenterY-dSide;
Right:=BoxCenterX+dSide;
Bottom:=BoxCenterY+dSide;
end;

form1.ForeImage.Canvas.CopyRect(DestRect, form1.BackImage.Canvas, SourceRect);
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
form1.DoubleBuffered:=true;
msHide:=True;
Canvas.CopyMode:=cmSrcCopy;

end;

procedure TForm1.ForeImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
NewX:=X;
NewY:=Y;
if msHide then
begin
OldX:=NewX;
OldY:=NewY;
msHide:=False;
ShowCursor(False);
end
else begin
ImageCopy(OldX, OldY, dSide);
end;

ImageCopy(NewX, NewY, sSide);
OldX:=NewX;
OldY:=NewY;


end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not msHide then
begin
msHide:=True;
ShowCursor(True);
ImageCopy(OldX, OldY, dSide);
end;


end;

end.
 
声明一个TBitMap变量做缓冲,对ForeImage的操作都换成对TBitMap的操作,画好后Draw到ForeImage上。
就不闪烁了。如不明白我可以E-Mail一份代码给你。
 
JobsLee:把你实现后的代码E-Mail一份给我吧。谢谢
wxj@nwsuaf.edu.cn
 
请问你的 Image 是放在哪里的?

如果是 Panel 的话,Form1.DoubleBuffered := true; 应改为
Panel1.DoubleBuffered := true;
 
曾经看过这样的代码,我找了一下,
和你的源代码就是一模一样的! 命名规则都是一样的!

我的图片放大很平滑的,根本就不闪烁啊!
你重新做一个project 编译一下吧 祝你好运 :D

 
我试试看,谢谢你们!
 
fang1977@163.net
give me!谢谢!
 
如果还是不行的话,把Timage换成 TPaintBox
 
问题解决了,szchengyu的答案正确,谢谢各位,分数奉上.
 

Similar threads

后退
顶部