2014-11-13 6 views
0

목록 상자 주위에 지정된 너비와 색으로 테두리를 그리려면 어떻게해야합니까? OnPaint 메서드를 재정의하지 않고이 작업을 수행 할 수 있습니까?ListBox 주위에 테두리 그리기

+2

..... –

+0

을 재정의하고 그리기는하지만, 난 더 이상 목록 상자 항목을 볼 수 없습니다, 작동합니다. – Trontor

답변

1

, 여기 당신이 경우

은 단순히 원하는 Color와 크기에 전달하고 .. 추가하고이 중첩 된 경우에도 모든 컨트롤 주위에 Panel 기반의 테두리를 제거 할 수있는 편리한 기능입니다 BorderStyle을 원합니다. 그것을 다시 제거하려면 Color.Transparent을 전달하십시오! 의 OnPaint 이벤트입니다 무엇

void setBorder(Control ctl, Color col, int width, BorderStyle style) 
{ 
    if (col == Color.Transparent) 
    { 
     Panel pan = ctl.Parent as Panel; 
     if (pan == null) { throw new Exception("control not in border panel!");} 
     ctl.Location = new Point(pan.Left + width, pan.Top + width); 
     ctl.Parent = pan.Parent; 
     pan.Dispose(); 

    } 
    else 
    { 
     Panel pan = new Panel(); 
     pan.BorderStyle = style; 
     pan.Size = new Size(ctl.Width + width * 2, ctl.Height + width * 2); 
     pan.Location = new Point(ctl.Left - width, ctl.Top - width); 
     pan.BackColor = col; 
     pan.Parent = ctl.Parent; 
     ctl.Parent = pan; 
     ctl.Location = new Point(width, width); 
    } 
} 
1

패널 내에 목록 상자를 배치하고 패널을 테두리로 사용할 수 있습니다. 패널의 배경색을 사용하여 색상 테두리를 만들 수 있습니다. 이것은 많은 코드를 필요로하지 않습니다. 양식 구성 요소 주위에 색상이있는 경계선이 있으면 상태를 전달하는 효과적인 방법이 될 수 있습니다. Neutone의 제안에 따라

+0

실제로'Panel '을 생성하고, 크기를 지정하고 배치하는'SetBorder (Control ctl, Color color)'함수를 작성할 수 있으며, 단지 몇 줄의 코드 안에'ListBox'를 넣을 수 있습니다. pass null을 지정하거나 Color.Transparent를 사용하면 동작을 되돌릴 수 있습니다. – TaW