2009-06-24 5 views
1

코드 덤프 합니다만, 이러한 기능.NET UserControl을은 : Size 속성은

private void PNGQuantPreviewControl_Resize(object sender, EventArgs e) 
{ 
    createOffScreenBm(); 
    draw();   
} 
private void createOffScreenBm() 
{ 
    offScreenBm = new Bitmap(this.Size.Width, this.Size.Height); 
    offScreenGfx = Graphics.FromImage(offScreenBm); 
} 
private void draw() 
{ 
    // draw background 
    offScreenGfx.FillRectangle(transTexture, 0, 0, offScreenBm.Width, offScreenBm.Height); 
    // draw image preview 
    offScreenGfx.DrawImage(pngQuantPreview, getTopLeftPosition()); 
    // apply to picture box 
    this.CreateGraphics().DrawImage(offScreenBm, 0, 0); 
} 

그래서, 제어 변경 크기, 그것은 새로운를 반영 할 수있는 오프 스크린 비트 맵을 재현 할 때의 UserControl 내에있는 크기 조정 이벤트에 잘못된 값을 제공합니다 크기를 조정하고 이미지를 다시 그립니다.

그러나 컨트롤의 크기를 빠르게 조정하면 비트 맵에서 채울 수 없으므로 오른쪽 및/또는 아래쪽에 간격이 있습니다.

저는 C#에 상당히 익숙합니다. 그래서 내가 잘못하고있는 것이 명백합니다. 잘못된 시간에 크기 값을 읽었습니다. 어떤 아이디어?

답변

2

우선 OnPaint 메서드를 덮어 쓰거나 Paint 이벤트를 구독하고 모든 것을 그릴 필요가 있습니다.

두 번째로 더블 버퍼링을 위해 오프 스크린 비트 맵을 만들 필요가 없습니다. 그 이유는 .net이 이미 그러한 목적으로 클래스에 존재하기 때문입니다. BufferedGraphics.

셋째, UserControl을의 descedant를 생성하고이 같은 내부 NET에서 더블 버퍼링, 뭔가 수 있도록 훨씬 더 : 당신이 이중 버퍼링을 얻을 것이다이 방법을 사용

public UserControl2 
{ 
    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); 
} 

을, 그리고 당신이 필요로하다 OnPaint 메서드에서 그래픽을 그립니다. 이 control styles에 대한 자세한 내용은 Msdn에서 읽을 수 있습니다.

+0

많은 감사. SetStyle 대신 DoubleBuffer 속성을 사용했습니다. 또한, OnPaint 메서드의 일부로 제공된 그래픽 객체를 처음에는 사용하지 못했습니다. –

0

컨트롤에 스플리터가 있거나 MinSize 또는 MaxSize가 선언되어 있습니까?

1

OnPaint 메서드를 재정의하고 해당 메서드 내에 코드를 두는 것이 좋습니다. 이렇게하면 이유에 관계없이 컨트롤을 다시 그려야 할 때마다 드로잉 코드가 실행됩니다.

크기 조정 이벤트는 반드시 부모 컨테이너의 크기 조정을 마칠 때까지 기다릴 필요가 없습니다. resize 이벤트가 발생하면 새로운 크기 조정 이벤트를 캡처하기 전에 코드가 종료 될 때까지 기다려야하므로 창/컨트롤의 크기가 빠르게 조정될 때 모든 것을 잘 유지할 수없고 마지막으로 얻은 것이 있습니다. 반드시 컨트롤의 최종 상태가 아닌 이벤트를 포착 할 수있었습니다.