昨天问了下TImage.MouseMove时hint显示X,以为解决问题了,事实上还没有。
所以特地再问下:以下代码让提示内容不见了,只能看到一个hint区域。请问这可以怎么解决?谢谢!procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
aHint: THintWindow;
aRect: TRect;
p: TPoint;
begin
GetCursorPos(p);
p := ClientToScreen(p);
aRect.left := p.x;
aRect.top := p.y + 20;
aRect.right := aRect.Left + 50;
aRect.bottom := aRect.Top + 20;
aHint := THintWindow.Create(Self);
try
aHint.Color := clWindow;
aHint.ActivateHint(aRect, 'test');
Sleep(100);
finally
aHint.ReleaseHandle;
FreeAndNil(aHint);
end;
end;昨日的帖子:
http://topic.csdn.net/u/20081110/12/2d37359c-91f6-4a16-884f-2293e36b5d33.html
所以特地再问下:以下代码让提示内容不见了,只能看到一个hint区域。请问这可以怎么解决?谢谢!procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
aHint: THintWindow;
aRect: TRect;
p: TPoint;
begin
GetCursorPos(p);
p := ClientToScreen(p);
aRect.left := p.x;
aRect.top := p.y + 20;
aRect.right := aRect.Left + 50;
aRect.bottom := aRect.Top + 20;
aHint := THintWindow.Create(Self);
try
aHint.Color := clWindow;
aHint.ActivateHint(aRect, 'test');
Sleep(100);
finally
aHint.ReleaseHandle;
FreeAndNil(aHint);
end;
end;昨日的帖子:
http://topic.csdn.net/u/20081110/12/2d37359c-91f6-4a16-884f-2293e36b5d33.html
解决方案 »
- 将delphi开发的系统拷贝到另一台电脑,运行EXE文件,显示应用程序错误
- 询问tcpserver和tcpclient之间传送文件问题!
- 关于QuickReport分块显示记录的问题。
- 请问如何在 IntraWeb 中显示一个网叶
- 请问一个关于李维的《Delphi5.x MIDAS应用》一书上的问题,高手请进!!!
- 在DBGridEh中如何使显示的数据始终保留两位小数
- 关于MSMQ的问题,WIN98下用MSMQ异步读取指定队列的消息,为什么不行?
- APPBAR的应用问题
- 在delphi中如何做闪屏?
- 出提示错误如下:
- 关于网络访问的问题????
- 在线等 求一个用delphi5.0写的增删改查功能的程序 附图
你把窗体设置为双缓冲的试一下
分析原因应该是OnMouseMove事件被不断的触发所致尝试在窗体类里增加一个变量(准确应该叫类成员或字段:))记住上次的位置,并在Hint时判断位置是否变化,只有变化时才Hint。
这样就不会一直闪了,如下:// ...
private
{ Private declarations }
FPrePos: TPoint;
// ...procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
aHint: THintWindow;
aRect: TRect;
p: TPoint;
begin
GetCursorPos(p);
// p := ClientToScreen(p); //p已经是屏幕坐标了,故这句去掉
if (FPrePos.X <> p.X) or (FPrePos.Y <> p.Y) then //增加了这句判断
begin
FPrePos := p; //这里保存位置 aRect.left := p.x;
aRect.top := p.y + 20;
aRect.right := aRect.Left + 50;
aRect.bottom := aRect.Top + 20;
aHint := THintWindow.Create(Self);
try
aHint.Color := clWindow;
aHint.ActivateHint(aRect, IntToStr(X)+ ':' + IntToStr(Y));
// Memo1.Lines.Add(IntToStr(X) + ':' + IntToStr(Y));
Sleep(100);
finally
aHint.ReleaseHandle;
FreeAndNil(aHint);
end;
end;
end;
不过还是会有一点闪烁,这应当是由于鼠标Move是一个连续的过程。一次Move间OnMouseMove事件可能会触发多次,其中有的相邻位置间只相差很小(上面代码中我把所有变化的位置都输出到了一个Memo框中,这样一目了然)。如果你的程序允许,可以对修改一下位置变化判断条件,忽略微小的位置变化,这样效果可能会好些。
谢谢tjianliang,这样确实能解决闪烁的问题哦。
昨天讲的那一句是放到Image1MouseMove函数里,在image.hint赋值后!我想你大概试也不试就pass了吧.你非要创建一个THintWindow, 不要闪烁的话,放到窗体创建函数里去创建,在Image1MouseMove函数里只调用aHint.ActivateHint
做程序啊,要自己去试!