SORU
28 Ocak 2009, ÇARŞAMBA


Nasıl bir denetim ve çocuklar için boyama iptal edebilirim?

Büyük değişiklikler yapmak için var olan bir kontrol var. Tamamen yaptığım süre gelen yeniden o - SuspendLayout ve ResumeLayout yeterli değil önlemek istiyorum. Nasıl bir denetim ve çocuklar için boyama iptal edebilirim?

CEVAP
28 Ocak 2009, ÇARŞAMBA


Önceki işimde zengin UI uygulaması anında ve sorunsuz boya ile mücadele ettik. Standart kullanıyorduk .Net denetimleri, özel denetimler ve devexpress kontrolleri.

Googling ve reflektör kullanımı bir çok sonra WM_SETREDRAW win 32 mesaj geldi. Bu gerçekten denetimleri güncelleme ve uygulanabilir iken çizim, üst/içeren paneline IIRC durur.

Bu çok basit bir sınıf bu mesajı nasıl kullanılacağını gösteren

class DrawingControl
{
    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);

    private const int WM_SETREDRAW = 11; 

    public static void SuspendDrawing( Control parent )
    {
        SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
    }

    public static void ResumeDrawing( Control parent )
    {
        SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
        parent.Refresh();
    }
}

Bu konuda fuller tartışmalar var - google için C# ve WM_SETREDRAW, örneğin

C# Jitter

Suspending Layouts

Ve ilgili kişinin dikkatine, bu VB benzer bir örnektir:

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Integer, _
                                                                ByVal wMsg As Integer, _
                                                                ByVal wParam As Integer,
                                                                ByVal lParam As Integer) As Integer

Private Const WM_SETREDRAW As Integer = 11

' Extension methods for Control
<Extension()>
Public Sub ResumeDrawing(ByVal Target As Control, ByVal Redraw As Boolean)
  SendMessage(Target.Handle, WM_SETREDRAW, 1, 0)
  If Redraw Then
    Target.Refresh()
  End If
End Sub

<Extension()>
Public Sub SuspendDrawing(ByVal Target As Control)
  SendMessage(Target.Handle, WM_SETREDRAW, 0, 0)
End Sub

<Extension()>
Public Sub ResumeDrawing(ByVal Target As Control)
  ResumeDrawing(Target, True)
End Sub

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • fast2hell

    fast2hell

    16 AĞUSTOS 2006
  • michellefeng's channel

    michellefeng

    26 Kasım 2006
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008