none
ツールチップがちらつく RRS feed

  • 質問

  • お世話になっております。

    PictureBoxにポインタが来た時(MouseMove)表示されている画像のピクセルのRGBを

    ツールチップで表示するようにしたのですがツールチップがちらつきます。

    また、よくわからないのですがマウスを画像の上で動かしていなくてもチラつきます。

     

    private
     void
     pictureBox1_MouseMove(object
     sender, MouseEventArgs e)
    { toolTip1.SetToolTip(pictureBox1, e.Location.ToString() + "\r\n" + bitmap1.GetPixel(e.X, e.Y).R + "," +
        + bitmap1.GetPixel(e.X, e.Y).G + "," +
        + bitmap1.GetPixel(e.X, e.Y).B); }

     

    また、下記3つのパラメータを色々と試しましたが変化がありませんでした。

    //ToolTipが表示されるまでの時間
    
    ToolTip1.InitialDelay = 5000;
    //ToolTipが表示されている時に、別のToolTipを表示するまでの時間
    ToolTip1.ReshowDelay = 0;
    //ToolTipを表示する時間  ToolTip1.AutoPopDelay = 100000;

    こういう時の対処の方法はあるのでしょうか?

    ご存知の方がいらっしゃいましたら、教えていただけますようお願い申しあげます。

    2011年2月2日 0:58

回答

すべての返信

  • ちらつくというのは、ツールチップが表示非表示を高速で繰り返すような感じなんですか?

    以下のようなコードで再現するか確認してみましたが、とくにちらつきませんでした。

     

    public partial class Form1 : Form
    {
    	private Bitmap bitmap1 = new Bitmap(@"c:\hoge.bmp", false);
    	public Form1()
    	{
    		InitializeComponent();
    		this.pictureBox1.Dock = DockStyle.Fill;
    		this.pictureBox1.Image = bitmap1;
    	}
    	private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    	{
    		try
    		{
    			this.toolTip1.SetToolTip(
    				this.pictureBox1,
    				e.Location.ToString() + "\r\n"
    				+ bitmap1.GetPixel(e.X, e.Y).R + ","
    				+ bitmap1.GetPixel(e.X, e.Y).G + ","
    				+ bitmap1.GetPixel(e.X, e.Y).B);
    		}
    		catch
    		{
    			this.toolTip1.Hide(this.pictureBox1);
    		}
    	}
    }
    
    

    2011年2月2日 1:46
  • private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
            toolTip1.SetToolTip(pictureBox1, e.Location.ToString());
    }

    で実行してみました。

    ツールチップが画像の上にあるときは常に更新されるので、ちらつきはあると思います。

    MouseMoveイベントではなく、MouseEnterイベントを使用されることをオススメします。

    2011年2月2日 4:12
  • honefaiさんへ

    ちらつくというのはご連絡の通り、表示非表示を高速で繰り返すような感じです。

    honefaiさんでは起こらないのですか?不思議ですね。環境の問題でしょうか・・・・

    試しにtry-catchを付けてみましたが変わりませんでした。

    コードを見る限りtooltipのパラメータはデフォルトですよね?

    動かした時にちらつくというなら話はわかるのですが、静止してても起こるので

    よくわかりません。

     

    朴さんへ

    MouseEnterイベントで試そうとおもったのですが、EventArgs eで座標を取得できないので試してません。

    ちなみにプロパティウィンドウにある説明書きだと

    「マウスポインターがコントロールの表示領域に入った時に発生します。」

    とあるのでpictureboxに入った時しかイベントは発生しないような気がするのですが

    間違っていたらすいません。

     

    2011年2月2日 4:42
  • >「マウスポインターがコントロールの表示領域に入った時に発生します。」

    >とあるのでpictureboxに入った時しかイベントは発生しないような気がするのですが

    そうですね。ですので、MouseMoveイベントを使用すると思います。

    また、ツールチップですと、MouseMoveの場合は常にツールチップの再描画がされるます。

    ちらつきははっせいします。

    そこで、ちらつきが気になるのでしたら横にテキストボックスを配置するなりして、RGBを表示するのが適当かと思われます。

     

    >動かした時にちらつくというなら話はわかるのですが、静止してても起こるので

    >よくわかりません。

    仕様です。

    テキストボックスで実行してみてください。ちらつきはありません。

    2011年2月2日 6:00
  • MouseMove イベントの処理で常に SetToolTip を呼び出してしまうからちらつくわけで、
    現在の座標を前回の座標と見比べて、違った時だけ処理をする、という風にしてあげればいいと思います。

     ToolTip と MouseMove の怪しい関係?
     http://social.msdn.microsoft.com/Forums/ja-JP/netfxgeneralja/thread/dea76122-3dac-47b8-9b71-4a596d6d9574/

     MouseMove event continuously invoked on Vista Ultimate x64 | Microsoft Connect
     http://connect.microsoft.com/VisualStudio/feedback/details/244426/mousemove-event-continuously-invoked-on-vista-ultimate-x64

    ざっくりとこんなイメージです。

      Point lastMouseLocation = new Point(int.MinValue, int.MinValue);
    
      private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
      {
       if (e.Location != lastMouseLocation)
       {
        toolTip1.SetToolTip(pictureBox1, e.Location.ToString() + "\r\n"
         + bitmap1.GetPixel(e.X, e.Y).R + ","
         + bitmap1.GetPixel(e.X, e.Y).G + ","
         + bitmap1.GetPixel(e.X, e.Y).B);
        lastMouseLocation = e.Location;
       }
      }
    
    
    2011年2月2日 6:31
  • totojoさんへ

    ご回答ありがとうございます。

    やってみたところ見事にちらつかなくなりました。

    ありがとうございます。

    確かに私の環境はWindows7です。

    だから、なる人とならない人がいたんですね。

    助かりました。

    2011年2月2日 6:39