2011-01-25 4 views
7

Visual Studio 2010의 .NET 4.0 Winforms 응용 프로그램에서 단추 만 만들려고합니다. 나는 국경없는 창을 가지고 있으며,이 응용 프로그램에 대한 내 사용자 정의 스킨을 만드는 배경 이미지가 있습니다. 창의 오른쪽 상단에있는 닫기/최소화 단추의 경우 일반 Windows 닫기/최소화 단추처럼 보이는 이미지 인 2 개의 간단한 단추를 만들려고했습니다..NET Winforms 응용 프로그램에서 이미지 단추 만들기

나는이 디자인이 잘못 될 수 있으므로, 알려 주시면 알려주세요. 지금까지 이미지만을 렌더링하는 Button의 하위 클래스를 만들어야한다고 결정했습니다. 최종 구현에서는 각 버튼 상태 (정상, 마우스 오버, 클릭 등)마다 서로 다른 이미지를 렌더링해야합니다. 여기에 지금까지 무엇을 가지고 :

public class ImageButton : Button 
{ 
    Pen pen = new Pen(Color.Red, 1.0f); 

    public ImageButton() 
    { 
     SetClientSizeCore(BackgroundImage.Width, BackgroundImage.Height); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     e.Graphics.DrawImage(BackgroundImage, 0, 0); 
     //e.Graphics.DrawRectangle(pen, ClientRectangle); 
     //Rectangle bounds = new Rectangle(0, 0, Width, Height); 
     //ButtonRenderer.DrawButton(e.Graphics, bounds, PushButtonState.Normal); 
     //base.OnPaint(pevent); 
    } 

    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     // Do nothing 
    } 
} 

이 시점에서,이 디자인이 적절한 가정, 나는 적절하게() SetClientSizeCore를 호출하는 방법을 알 필요가있다. 생성자에서 호출하면 예외가 발생합니다. 컨트롤이 아직 초기화 할 기회가 없었기 때문에 이것이라고 가정합니다. 어떤 기능을 재정의해야할지 모르겠다. .NET에서 초기화 한 후에 이미지 크기에 맞춰 버튼의 크기를 변경할 수 있습니다. 이것에 대한 아이디어가 있습니까?

+1

방금이 시도를 시도했지만 더 간단한 해결 방법은 Click 이벤트가있어서 PictureBox 컨트롤을 사용하는 것이고 특히 필요한 것은 없었습니다. 단추 개체에서. – Ted

답변

7

생성자에서 BackgroundImagenull입니다.

BackgroundImage이 속성을 재정 의하여 변경되면 크기를 설정해야합니다.

또한 디자이너가 크기를 저장하지 않으려면 Size 속성을 섀도우하고 [DesignerSerializationVisibilty(DesignerSerializationVisibility.Hidden)]을 추가해야합니다.

+1

특히 DesignerSerializationVisibility 요소 ... 많은 사람들이 그 부분을 놓친다는 것을 확신합니다. – DRapp

+0

'그림자'라고 말하면 Size 속성을 다시 구현하고 앞으로 가져 오거나 앞으로 가져옵니다. Size? 가상이 아니므로 BackgroundImage와 동일한 방법으로 재정의 할 수 없습니다. –

+0

@Bob : 예,'new' 수정자를 사용합니다. – SLaks

1

BackgroundImage 속성이 할당 될 때까지 기다리면 필요한 크기를 알 수 있습니다.

public override Image BackgroundImage { 
    get { return base.BackgroundImage; } 
    set { 
     base.BackgroundImage = value; 
     if (value != null) this.Size = value.Size; 
    } 
} 
관련 문제