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

  • ethr95awd

    ethr95awd

    8 Kasım 2006
  • justintimberlakeVEVO

    justintimber

    2 EYLÜL 2009
  • Moodle

    Moodle

    11 Mayıs 2010