いくつかのオブジェクトをグラフィカル モードで表示するために、C#.net で Windows アプリケーション コントロールを作成しました。そのために、リストにあるアイテムの数に応じて長方形を作成し、Control OnPaint イベントを使用してコントロール上にプロットします。
マウスがその上にある場合、その四角形を強調表示したいと思います。
より明確にするために添付の画像を確認し、それを達成する方法を提案してください。
従来の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();
}