procedure TfmFlattool.CMMouseLeave(var Message: TMessage);
var
p:TPoint;
begin
inherited;
if onThread then exit;
GetCursorPos(p);
p:=self.ScreenToClient(p);
if p.y<self.Height then
exit;
if FMouseInControl then begin
FMouseInControl := False;
HideThread.Resume;
end;
end;
procedure TfmFlattool.CMMouseEnter(var Message: TMessage);
var
p:Tpoint;
PControl:TControl;
begin
inherited;
{ Don't draw a border if DragMode <> dmAutomatic since this button is meant to
be used as a dock client. }
if onThread then exit;
GetCursorPos(p);
PConTrol:=FindDragTarget(P, True);
// if (PConTrol.Parent<>nil) and (PControl<>Image1)and(PConTrol.Parent=self) then exit;
if not FMouseInControl and (GetCapture = 0) then
begin
FMouseInControl := True;
ShowThread.Resume;
end;
end;
procedure THideThread.Execute;
var
i:integer;
begin
while 1=1 do begin
fmFlatTool.onThread:=True;
for i:=0 downto -23 do
// fmFlatTool.Top:=i*2;
// MoveWindow(fmFlattool.Handle,0,i*2,fmFlatTool.Width,fmFlatTool.Height,);
setWindowPos(fmFlattool.Handle,HWND_TOPMOST,0,i*2,
fmFlatTool.Width,fmFlatTool.Height,SWP_SHOWWINDOW);
fmFlatTool.Showing:=False;
fmFlatTool.onThread:=False;
fmFlatTool.HideThread.Suspend;
end;
end;
procedure TShowThread.Execute;
var
i:integer;
begin
while 1=1 do begin
fmFlatTool.onThread:=True;
fmFlatTool.Showing:=True;
for i:=-23 to 0 do
// fmFlatTool.Top:=i*2;
// MoveWindow(fmFlattool.Handle,0,i*2,fmFlatTool.Width,fmFlatTool.Height,True);
setWindowPos(fmFlattool.Handle,HWND_TOPMOST,0,i*2,
fmFlatTool.Width,fmFlatTool.Height,SWP_SHOWWINDOW);
// fmFlattool.CheckCursorThread.resume;
fmFlatTool.onThread:=False;
fmFlatTool.ShowThread.Suspend;
end;
end;
procedure TfmFlatTool.FormShow(Sender: TObject);
begin
Left:=0;
Width:=800;
Height:=55;
Top:=-46;
onThread:=False;
end;
procedure TfmFlatTool.FormCreate(Sender: TObject);
begin
ShowThread:=TShowThread.Create(True);
HideThread:=THideThread.Create(True);
FSFields:=TList.Create;
end;
procedure TFrmClock.TimerTimer(Sender: TObject);
begin
if not Hour24 then
PanelTime.Caption :=formatDateTime('ampm hh:mm:ss',now)
else
PanelTime.Caption :=formatDateTime('hh:mm:ss',now);
end;
procedure TFrmClock.PopMenuPopup(Sender: TObject);
begin
if not MyThread.Suspended then
MyThread.Suspend;
end;
procedure TFrmClock.ThreadResume(Sender: TObject);
begin
if MyThread.Suspended then
MyThread.Resume;
end;
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure ThreadMouse.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ ThreadMouse }
procedure ThreadMouse.Execute;
var
P:TPoint;
begin
while not Terminated do
begin
P:=mouse.CursorPos;
Px:=P.x;
Py:=P.y;
if (P.x > frmClock.Left) and (P.x < frmClock.Left + frmClock.Width) and (P.y <frmClock.Top + frmClock.Height) then
Synchronize(WinPushOut)
else
Synchronize(WinPushIn);
end;
end;
procedure ThreadMouse.WinPushIn;
var
i:integer;
j:integer;
begin
j:=frmClock.Top;
for i:=j downto 2-frmClock.Height do
frmClock.Top := i;
end;
procedure ThreadMouse.WinPushOut;
var
i:integer;
j:integer;
begin
j:=frmClock.Top;
for i:=j to 0 do
frmClock.Top := i;
end;