문제

보호 설정은 어떻게 하나요? DoubleBuffered 깜박임으로 고통받는 폼의 컨트롤 속성은 무엇입니까?

도움이 되었습니까?

해결책

다음은 보다 일반적인 버전입니다. 더미의 솔루션.

우리는 리플렉션을 사용하여 보호된 위치에 도달할 수 있습니다. 이중 버퍼링됨 속성으로 설정한 다음 진실.

메모:당신은해야 개발자 세금을 지불 그리고는 아니다 사용자가 터미널 서비스 세션에서 실행 중인 경우 이중 버퍼링을 사용합니다. (예:원격 데스크톱) 이 도우미 방법은 사용자가 원격 데스크톱에서 실행 중인 경우 이중 버퍼링을 설정하지 않습니다.

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
   //Taxes: Remote Desktop Connection and painting
   //http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
   if (System.Windows.Forms.SystemInformation.TerminalServerSession)
      return;

   System.Reflection.PropertyInfo aProp = 
         typeof(System.Windows.Forms.Control).GetProperty(
               "DoubleBuffered", 
               System.Reflection.BindingFlags.NonPublic | 
               System.Reflection.BindingFlags.Instance);

   aProp.SetValue(c, true, null); 
}

다른 팁

확인하다 이 스레드

해당 답변의 핵심을 반복하면 창에서 WS_EX_COMPOSITED 스타일 플래그를 켜서 양식과 모든 컨트롤을 이중 버퍼링할 수 있습니다.스타일 플래그는 XP부터 사용할 수 있습니다.페인팅이 더 빨라지는 것은 아니지만 전체 창은 오프스크린 버퍼에 그려지고 한 번에 화면에 블릿됩니다.눈에 보이는 페인팅 아티팩트 없이 사용자의 눈에 즉각적으로 보이도록 만듭니다.완전히 문제가 없는 것은 아니며 일부 시각적 스타일 렌더러, 특히 TabControl에 탭이 너무 많은 경우 결함이 발생할 수 있습니다.YMMV.

이 코드를 양식 클래스에 붙여넣습니다.

protected override CreateParams CreateParams {
    get {
        var cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;    // Turn on WS_EX_COMPOSITED
        return cp;
    } 
}

이 기술과 Winform의 이중 버퍼링 지원 간의 가장 큰 차이점은 Winform 버전은 한 번에 하나의 컨트롤에서만 작동한다는 것입니다.각 개별 컨트롤 페인트 자체는 계속 표시됩니다.깜박임 효과처럼 보일 수도 있습니다. 특히 칠되지 않은 제어 직사각형이 창 배경과 심하게 대조되는 경우 더욱 그렇습니다.

System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control)
    .GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.Instance);
aProp.SetValue(ListView1, true, null);

이안 터미널 서버에서 이를 사용하는 방법에 대한 추가 정보가 있습니다.

public void EnableDoubleBuffering()
{
   this.SetStyle(ControlStyles.DoubleBuffer | 
      ControlStyles.UserPaint | 
      ControlStyles.AllPaintingInWmPaint,
      true);
   this.UpdateStyles();
}

한 가지 방법은 이중 버퍼링하려는 특정 컨트롤을 확장하고 컨트롤의 ctor 내에 DoubleBuffered 속성을 설정하는 것입니다.

예를 들어:

class Foo : Panel
{
    public Foo() { DoubleBuffered = true; }
}

노부즈 그의 링크에 있는 방법에 대한 공로를 인정받아 다시 게시하고 있습니다.양식에 다음 재정의를 추가합니다.

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
    }
}

이것은 나에게 가장 효과적이었습니다. Windows 7에서는 컨트롤이 많은 양식의 크기를 조정할 때 커다란 검은색 블록이 나타났습니다.이제 컨트롤이 대신 바운스됩니다!하지만 더 좋습니다.

확장 방법 컨트롤에 대한 이중 버퍼링을 켜거나 끄려면

public static class ControlExtentions
{
    /// <summary>
    /// Turn on or off control double buffering (Dirty hack!)
    /// </summary>
    /// <param name="control">Control to operate</param>
    /// <param name="setting">true to turn on double buffering</param>
    public static void MakeDoubleBuffered(this Control control, bool setting)
    {
        Type controlType = control.GetType();
        PropertyInfo pi = controlType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
        pi.SetValue(control, setting, null);
    }
}

사용법(예: DataGridView DoubleBuffered를 만드는 방법):

DataGridView _grid = new DataGridView();
//  ...
_grid.MakeDoubleBuffered(true);

이중 버퍼링을 시도하기 전에 SuspendLayout()/ResumeLayout()이 문제를 해결하는지 확인하세요.

이로 인해 나에게 많은 내가 그것을 추적할 때까지 제3자 통제로 이틀 동안 슬픔에 잠겼습니다.

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
    }
}

최근에 여러 다른 컨트롤이 포함된 컨트롤의 크기를 조정하거나 다시 그릴 때 많은 구멍(떨어짐)이 발생했습니다.

WS_EX_COMPOSITED 및 WM_SETREDRAW를 시도했지만 이것을 사용할 때까지는 아무것도 작동하지 않았습니다.

private void myPanel_SizeChanged(object sender, EventArgs e)
{
     Application.DoEvents();
}

그냥 전달하고 싶었어요.

이 훌륭한 솔루션의 vb.net 버전...:

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or &H2000000
        Return cp
    End Get
End Property

컨트롤을 자신의 클래스로 상속하고 거기에 속성을 설정할 수도 있습니다.이 방법은 모든 컨트롤에서 동일한 설정을 많이 수행하려는 경우에도 유용합니다.

양식에서 DoubleBuffered 설정을 설정하기만 하면 여기에 나열된 모든 속성이 자동으로 설정된다는 것을 알았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top