昨天问了下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

解决方案 »

  1.   

    Form1.doublebuffered := true ;
    你把窗体设置为双缓冲的试一下
      

  2.   

    为什么一定要做HINT呢?用个TLable或者TStaticText不是更简单?
      

  3.   

    试了一下楼主的例子,主要的问题是Hint小窗口会一直不停的闪,Sleep(100)也不过是让闪的频率小了一些而已
    分析原因应该是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框中,这样一目了然)。如果你的程序允许,可以对修改一下位置变化判断条件,忽略微小的位置变化,这样效果可能会好些。
      

  4.   

    想想还是接受shadowstar的建议,屈服了,:-)
    谢谢tjianliang,这样确实能解决闪烁的问题哦。
      

  5.   

    2次上来都碰到你的帖子,昨天跟你讲了你又不信,今天又来问,你都把aHint释放了还能看到什么提示,
    昨天讲的那一句是放到Image1MouseMove函数里,在image.hint赋值后!我想你大概试也不试就pass了吧.你非要创建一个THintWindow, 不要闪烁的话,放到窗体创建函数里去创建,在Image1MouseMove函数里只调用aHint.ActivateHint
    做程序啊,要自己去试!