我用一个Panel,里面放置了一个PaintBox绘制网格
上面放置了一个可以拖动,拉大,拉小的Image
可是当我拖动和拉动Image时,Image闪烁的很严重,有什么好的方法不闪烁?
Panel.doulbedbuffer设置TURE我试过不关用,还有WMEraseBkGnd该怎么用TFORM1.WMEraseBkGnd这样不管用?
上面放置了一个可以拖动,拉大,拉小的Image
可是当我拖动和拉动Image时,Image闪烁的很严重,有什么好的方法不闪烁?
Panel.doulbedbuffer设置TURE我试过不关用,还有WMEraseBkGnd该怎么用TFORM1.WMEraseBkGnd这样不管用?
解决方案 »
- Cells.Find运行出错
- Delphi怎么远程连接MySQL啊,需要什么配置吗?
- 我点TREEVIEW中的一个ITEM怎么获取它的坐标?
- Tchart有关:如何在chart中画出的曲线某个点上标记出该点的值?
- delphi 中对word 进行控制时,word 中Paragraphs对象的使用,请高手进
- 查找记录(急,在线等待)
- 请教!怎么检验edit中数据是float类型用什么函数?
- qruickreport 中的统计可以预览,但是运行时preview就不显示.会是什么原因?
- 得到TDBGRID的内容
- 为什么总是说找不到class TDateEdit
- SPCOMM 只读首次数据,要STOPCOMM 再STARTCOMM 才继续读,再停止,再需要STOP 再START ...不断重复才可以..
- 杭州创业软件公司的卑鄙
二,改写控件,因为继承自TGraphicControl的控件都是有这种闪烁问题,下面的控件就可以完美解决这个问题:
unit FFPBox;
{=======================================================}
interface
{=======================================================}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;type
TFFPaintEvent = procedure (Sender: TObject; Canvas: TCanvas) of Object; TFlickerFreePaintBox = class(TCustomControl)
private
{ Private declarations }
FOnFFPaint:TFFPaintEvent;
protected
{ Protected declarations }
procedure Paint; override;
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
property OnPaint:TFFPaintEvent read FOnFFPaint write FOnFFPaint;
property Canvas;
property Align;
property Color;
property DragCursor;
property DragMode;
property Enabled;
property Font;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property Visible;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
end;procedure Register;
{=======================================================}
implementation
{=======================================================}
constructor TFlickerFreePaintBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
csOpaque, csDoubleClicks, csReplicatable];
TabStop := False;
end;
{-------------------------------------------------------}
procedure TFlickerFreePaintBox.Paint;
var bmp: TBitmap;
begin
if csDesigning in ComponentState then
with Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsSolid;
Canvas.Brush.Color := Color;
Rectangle(0, 0, Width, Height);
exit;
end; bmp := TBitmap.Create;
try
bmp.Canvas.Brush.Color := Color;
bmp.Width := Width;
bmp.Height := Height;
bmp.Canvas.Font := Font;
if Assigned(FOnFFPaint) then begin
FOnFFPaint(Self, bmp.Canvas);
Canvas.Draw(0,0, bmp);
end;
finally
bmp.Free;
end;
end;
{-------------------------------------------------------}
{------------------------关键之处-----------------------}
procedure TFlickerFreePaintBox.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result := 1;
end;
{=======================================================}
procedure Register;
begin
RegisterComponents('System', [TFlickerFreePaintBox]);
end;end.
我想问清楚点,我这个是应该应该重写Image控件还是PaintBox控件?
如要重写是PaintBox,是否可以拿你上面的直接来用?