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

  • JorteexHD

    JorteexHD

    20 NİSAN 2012
  • Lamarr Wilson

    Lamarr Wilso

    27 Aralık 2008
  • NLthomas21

    NLthomas21

    20 Mayıs 2008