2012-09-27 3 views
2

일부 개체 (사물)를 그래픽 모드로 표시하기 위해 C# .net에서 Windows 응용 프로그램 컨트롤을 만들었습니다. 그래서 목록에있는 항목의 수에 따라 직사각형을 만들고 Control OnPaint 이벤트를 사용하여 사각형 위에 컨트롤을 그립니다.마우스를 가져 가면 직사각형을 감지하고 강조 표시하는 방법

마우스를 마우스로 가리키면 그 사각형을 강조하고 싶습니다.

더 명확하게하기 위해 첨부 된 이미지를 확인하십시오. & 내가 어떻게 달성 할 수 있는지 제안 해주십시오.

enter image description here

답변

1

당신이 고전 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(); 
} 
관련 문제