당신이 고전 DrawCli 예를 확인 했습니까? 기본 응용 프로그램이 개체 및 도구를 관리하는 방법을 보여줍니다.
즉, MouseMove
이벤트 내에서 목록을 다시 열거 나 마우스의 포인터가 해당 rect 안에 있으면 해당 항목의 rect를 가져오고 IsFocused
속성을 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();
}