4

いくつかのオブジェクトをグラフィカル モードで表示するために、C#.net で Windows アプリケーション コントロールを作成しました。そのために、リストにあるアイテムの数に応じて長方形を作成し、Control OnPaint イベントを使用してコントロール上にプロットします。

マウスがその上にある場合、その四角形を強調表示したいと思います。

より明確にするために添付の画像を確認し、それを達成する方法を提案してください。

ここに画像の説明を入力

4

1 に答える 1

2

従来のDrawCliの例を確認しましたか?これは、基本的なアプリケーションがオブジェクトとツールを管理する方法を示しています。

つまり、イベント内のリストを再列挙MouseMoveし、アイテムのrectを取得し、IsFocusedマウスポインターがそのrect内にある場合は、そのプロパティをtrueに設定する必要があります。次に、何かが変更された場合は再描画します。(現在のマウスの位置を確認して)内部でそれを行うこともできますOnPaintが、その場合は常に内部のすべてを再描画する必要がありますMouseMove(これは非常に悪い考えです)。

私が何を意味するかを説明するための一種の擬似コード:

protected override void OnPaint(PaintEventArgs e)
{
   foreach (GraphicalObject obj in Objects)
   {
      if (!obj.IsVisible)
            continue;

      Rectangle rect = obj.GetBounds(e.Graphics);
      if (!rect.Intersects(e.ClipRectangle))
         continue;

      obj.Draw(e.Graphics);
   }
}

GraphicalObject画面に配置できるすべてのオブジェクトの基本タイプです。Objectsそれらのコレクションを含むプロパティです(GraphicalObjectCollectionたとえば)。これで、コードは次のようになります(これは実際のコードとはかけ離れていることに注意してください。これは、一般的な手法の単なる例です)。

protected override OnMouseMove(MouseMoveEventArgs e)
{
   bool needToRedraw = false;

   using (Graphics g = CreateGraphics())
   {
      foreach (GraphicalObject obj in Objects)
      {
         if (!obj.IsVisible)
               continue;

         Rectangle rect = obj.GetBounds(e.Graphics);
         if (rect.Contains(e.Location))
         {
            if (!obj.IsFocused)
            {
               obj.IsFocused = true;
               needToRedraw = true;
            }
         }
         else
         {
            if (obj.IsFocused)
            {
               obj.IsFocused = false;
               needToRedraw = true;
            }
         }

         obj.Draw(e.Graphics);
      }
   }

   if (needToRedraw)
      Invalidate();
}
于 2012-09-27T15:05:16.080 に答える