모든 업데이트를 수행 할 때까지 양식을 다시 그리기를 중단 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/615781

문제

C# 및 .NET 2.0을 사용하여 불규칙한 형태 (TransparencyKey, FormborderStyle = None 등)를 사용하고 있으며 "정상"테두리 모드를 허용하려고합니다.

나는 뒷면 색상을 라임에서 기본값으로 변경합니다. FormborderStyle을 고정 단일로 변경합니다. 투명한 키를 Colour로 변경합니다.

불행히도 이것은 이미지가 몇 픽셀을 아래로 점프하고 측면 및 라임 녹색 형태로 점프하면서 화면에 완전한 혼란을 보입니다.

나는 각 코드 라인 후에 양식이 다시 그려져서 발생한다고 생각합니다. 변경할 때까지 양식 그리기를 중단 한 다음 양식을 한 번 다시 그리기 할 수 있습니까?

G

도움이 되었습니까?

해결책

새로운 답변 : 새 창 속성을 적용하는 동안 WNDPROC를 무시하고 WM_PAINT 메시지를 차단하십시오.

오래된 답변 : WNDPROC를 무시하고 WM_ERASEBKGND 메시지.

아래 코드가하는 일에 대한 설명 :

창의 영역이 무효화되면 Windows는 일련의 메시지를 컨트롤로 보냅니다. 이 시리즈의 초기 메시지는입니다 WM_ERASEBKGND. 일반적 으로이 메시지에 응답하여 제어는 그 자체로 단색으로 페인트됩니다. 나중에,에 대한 응답으로 WM_PAINT 메시지 (일반적으로 onpaint 이벤트에서 우리가 소비 함) 실제 도면이 완료됩니다. 이 도면이 사소한 경우 위젯이 업데이트되기 전에 지연이 발생하고 성가신 깜박임이 발생합니다.

코드를 다시 살펴보면 분명히 다른 문제를 해결했습니다. 이 새로운 예를 시도하십시오. 형태/제어의 그림을 차단합니다. bAllowPaint 깃발은 세련되지 않습니다.

그만큼 새로운 예시:

    private const int WM_PAINT = 0x000F;

    protected override void WndProc(ref Message m)
    {
        if ((m.Msg != WM_PAINT) ||
            (bAllowPaint && m.Msg == WM_PAINT))
        {
            base.WndProc(ref m);
        }
    }

그만큼 낡은 예시:

    private const int WM_ERASEBKGND = 0x0014;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg != WM_ERASEBKGND) // ignore WM_ERASEBKGND
        {
            base.WndProc(ref m);
        }
    }

다른 팁

양식을 시도하십시오. 'true'로 설정하십시오.

또한 양식에 아동 통제가있는 경우, 또한 (및 어린이의 자녀 등) 도로도 DoubleBuffered를 True로 설정합니다.

마지막으로, 변경하기 전에 SportendLayout을 호출하고 나중에 이력서를 제공하십시오. 이것은 아동 통제의 배치에만 영향을 미칩니다. 사용자 정의 도면을 수행하는 경우 DoubleBuffered Property는 벅을 더 많이 줄 것입니다.

양식에 다소 큰 영향을 미치는 속성을 수정하고 있습니다. Transparencykey와 Formbordertyle은 창 스타일 비트를 변경해야합니다. Windows는 이러한 스타일 비트를 변경할 수 없습니다. Windows 형태는 창을 완전히 파괴하고 처음부터 다시 만들어서 그들을 구현합니다. 깔끔한 트릭이지만 시간이 걸리고 스타일을 바꿀 때마다 형태가 다시 칠해집니다. 당신이 보는 불쾌한 시각 효과를 유발합니다.

시도 : 1. 형태가 보이지 않도록 불투명도를 0으로 설정합니다.

예를 들어:

  this.Opacity = 0;
  this.BackColor = Color.FromKnownColor(KnownColor.Control);
  this.FormBorderStyle = FormBorderStyle.Sizable;
  this.TransparencyKey = Color.Empty;
  this.Opacity = 1;

모든 것이 실패하면 모든 페인트 메시지를 양식에 차단하여 낮은 수준의 해킹을 시도 할 수 있습니다.

경고 :이 방법의 사용을 홍보하지는 않지만 실제로 원한다면 시도해 볼 수 있습니다. 그것은 과거에 나를 도왔습니다.

Win32.LockWindowUpdate(this.Handle);
try
{
   //make your changes here
}
finally
{
  //release the lock
  Win32.LockWindowUpdate((IntPtr)0);
}

이 코드는 다음 지원 코드에 의존합니다.

public class Win32
{
  private Win32() { }

    /// <summary>
    /// Lock ore relase the wndow for updating.
    /// </summary>
    [DllImport("user32")]
    public static extern int LockWindowUpdate(HWND hwnd);
 }

한 단계에서 양식의 모든 "이미지"를 화면에 보내는 방법은 DoubleBuffer를 활성화하는 것입니다.

생성자에서 컨트롤 스타일을 설정할 수 있습니다

vb.net :

SetStyle(ControlStyles.DoubleBuffer, True)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top