【发布时间】:2012-09-28 17:41:27
【问题描述】:
如何在桌面窗口上绘制以在用户点击时绘制圆形动画...
我已经在尝试下面的代码,正在启动一个线程来绘制动画......
下面的代码可以工作,但是有一些油漆问题:
unit UMouseEmphasizer;
interface
implementation
uses
Classes, Windows, Messages, Graphics, Forms;
type
TEmphasizePointDrawer = class(TThread)
private
fPoint: TPoint;
fCanvas: TCanvas;
protected
procedure Execute; override;
public
constructor Create(pt: TPoint); reintroduce;
destructor Destroy; override;
end;
constructor TEmphasizePointDrawer.Create(pt: TPoint);
begin
fPoint := pt;
fCanvas := TCanvas.Create;
fCanvas.Handle := GetDCEx(0, 0, DCX_PARENTCLIP);
inherited Create(True);
FreeOnTerminate := True;
Resume;
end;
destructor TEmphasizePointDrawer.Destroy;
begin
ReleaseDC(0, fCanvas.Handle);
fCanvas.Free;
inherited;
end;
procedure TEmphasizePointDrawer.Execute;
const
INFLATE_DELTA = 10;
var
i: integer;
r: TRect;
begin
r := rect(0,0,0,0);
with fCanvas do
begin
Brush.Style := bsClear;
Pen.Style := psSolid;
Pen.Color := clRed;
Pen.Width := 2;
for i := 0 to 2 do
begin
r := rect(
fPoint.X - (i * INFLATE_DELTA),
fPoint.Y - (i * INFLATE_DELTA),
fPoint.X + (i * INFLATE_DELTA),
fPoint.Y + (i * INFLATE_DELTA)
);
Ellipse(r);
sleep(100);
end;
end;
InflateRect(r, 2, 2);
RedrawWindow(0, @R, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN);
end;
function MouseHookHandler(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
var
pt: TPoint;
begin
Result := 0;
if nCode < 0 then
Exit;
pt := PMouseHookStruct(Data)^.pt;
case MsgID of
WM_LBUTTONUP:
TEmphasizePointDrawer.Create(pt);
end;
end;
var
gHook: HHOOK=0;
procedure HookMouse; stdcall;
begin
gHook := SetWindowsHookEx(WH_MOUSE, MouseHookHandler, HINSTANCE, 0);
end;
procedure UnhookMouse;
begin
UnhookWindowsHookEx(gHook);
gHook := 0;
end;
initialization
HookMouse;
finalization
UnhookMouse;
end.
【问题讨论】:
-
此功能已存在于 Windows 中。为什么只有桌面窗口?那将是非常有限的。
-
出了什么问题? “有一些油漆问题”并不能很好地描述问题。
-
试试上面的代码看看“问题”。
-
Beto Neto,很少有人运行他们在这里看到的代码——通常你可以通过阅读来判断问题所在。如果您说“屏幕上没有显示任何内容”或“颜色反转”或“它在错误的位置绘制”或其他任何内容,这是一个很好的起点,并且会带来更多答案。提问时需要详细说明。否则人们将没有足够的信息来回答它,可能不想自己运行代码的麻烦,你也不会得到任何答案。所以,努力描述你的问题,它会帮助你:)
标签: delphi