2013-04-04 20 views
5

VCL stilleri etkinken Delphi kullanıyorum ve formum için TSplitter'in rengini değiştirmek istiyorum. Varsayılan VCL stilleri cBtnFace renginden daha koyu bir renk boyamak için bir aracı sınıfta TSplitter.Paint geçersiz kıldım, ancak yeniden boyutlandırıldığında formda belirgin titreme var. Bu titremeyi kaldırmanın bir yolu var mı?Delphi TSplitter titreme sorunu

denemek ve titreşimi azaltmak bunları denedim ama hiçbiri çalıştık:

  1. devre dışı bırakılması VCL stilleri (TSplitter.StyleElements := []).

  2. VCL Stillerini Değiştirme Bitmap Style Designer'in "Splitter" için nesne öğesi, ancak bu nesne öğesinin değiştirilmesi, ayırıcının görünümünü değiştirmez.

  3. iletisini iletisini işlemek için çalışıyorum, ancak aracı sınıfımda çağrılması gereken yordamı alamadım. için

    procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND; 
    ... 
    procedure TSplitter.WMEraseBkgnd(var Msg: TWMEraseBkgnd); 
    begin 
        // this is never invoked by the TSplitter 
        Msg.Result := 1; 
    end; 
    

Başka fikirler bir TSplitter üzerine titremesi kurtulmak? TSplitter için DoubleBuffer özelliği veya ne anlatabildiğimden başka bir şey yok. Maalesef GÜNCELLEME

, ben kod temeli paylaşamaz, ancak TSplitter titriyor zaman bu uygulama UI kurgusunda yolu olduğunu söyleyebilirim:

TForm (DoubleBuffered = False) 
-> BackgroundPanel (DoubleBuffered = True, ParentBackground = False) 
-> -> A TGradient, image and label to fill the BackgroundPanel 
-> LeftPanel (ParentBackground = False`, no flickering) 
-> -> LeftPanelFrame and frame content (selective double buffering) 
-> TSplitter 
-> RightPanel (ParentBackground = False, no flickering) 
-> -> RightPanelFrame and frame content (selective double buffering) 

yoktur Ayrıca bir araç çubuğu ve formun üst kısmında bir ana menü, ancak UI bileşenlerinin geri kalanı alClient (veya alanı doldurmak için OnResized) olarak ayarlanır./Azaltmak acil herhangi bileşenlerden titreşimi ortadan kaldırılmasına yardımcı olacağına BackgroundPanel üzerine, DoubleBuffered = True ve ParentBackground = False - (> Arkaya Gönder yani Kontrol)

Ben BackgroundPanel LeftPanel, TSplitter ve RightPanel arkasında olduğundan farz Önündeki UI katmanı (yani, TSplitter). Ancak, bu durum böyle görünmüyor.

Belki LeftPanel, TSplitter ve RightPanel bir ebeveyn olarak TPanel yerleştirmeyi deneyin ve DoubleBuffered = True ve ParentBackground = False onun belirleriz. Bunu daha sonra denemek ve geri almak zorunda kalacağım. Yani, bu şekilde görünecektir:

TForm 
-> BackgroundPanel (DoubleBuffered = True, ParentBackground = False) 
-> -> A TGradient, image and label to fill the BackgroundPanel 
-> EncapsulatingPanel (DoubleBuffered = True, ParentBackground = False) 
-> -> LeftPanel (ParentBackground = False) 
-> -> -> LeftPanelFrame and frame content 
-> -> TSplitter 
-> -> RightPanel (ParentBackground = False) 
-> -> -> RightPanelFrame and frame content 

Son olarak, bu çifte (Pencerenin sağındaki siyah iz) yeniden boyutlandırma sırasında TForm ölçüde UI yavaşlatır ara belleğe dikkat etmelidir, diğer UI şeyler yapıyor değilken uygulama yeniden boyutlandırılmadığında. (Arka plan ebeveyn TPanel oluşturarak) Yukarıdaki yaklaşımım TSplitter üzerine titremesini sabit iken

GÜNCELLEME 2

yazık ki, o da @ David Heffernan içinde ima belki bazıları, diğer garip UI konular neden yorumlar. Şimdilik, titreme sorununu sadece bıraktım, çünkü splitter sadece 1 piksel genişliğinde ve sadece genişlik + yükseklik yeniden boyutlandırma üzerinde titriyor.

+0

Hala "TFlickerFreeForm" veya "TFlickerFreeControl" tanıtımı için bekliyorum. –

+0

Uzak ve bazen yetersiz bir çözüm getirildi, ancak DoubleBuffered özelliğini etkinleştirmeyi denediniz mi? –

+0

@JerryDodge 'TSplitter'de DoubleBuffered özelliği yok, demek istediğim buysa (sorumun alt kısmı). Double Uuffered nesnesini ana kullanıcı arabirimi nesnelerine boşuna kullanmaya çalıştım. – spurgeon

cevap

3

TSplitter denetimi, DoubleBuffered özelliğine sahip olmayabilir, ancak bu özellik, çoğu durumda formda titreme yaşadığınız yerlerin en üst denetiminde uygulanmalıdır. Tüm kontroller ParentDoubleBuffered hala varsayılan olarak etkin olduğu sürece, hepsi de bu değişikliği elde edeceklerdir.

DoubleBuffered her zaman titremeyi düzeltmez ve bazı durumlarda işleri daha da kötüleştirebilir. Yeniden boyutlandırma sırasında yalnızca DoubleBuffered'u kullanmayı düşünebilirsiniz ve yeniden boyutlandırma bittiğinde onu tekrar kapatabilirsiniz. Bu özellik, yalnızca gerçekten yeniden boyutlandırılan denetimlerde kullanılmalıdır. Örneğin, formu yeniden boyutlandırırken, formdaki DoubleBuffered'u etkinleştirin. Ancak bir panelin içeriğini yeniden boyutlandırırken, sadece bu panel için (ve tüm çocuk denetimleri) etkinleştirin.

Bu değişikliğe bağlı olarak uygulamanızın performans düşüşüne gelince, yeniden boyutlandırırken bir bayrağın uygulanmasını da düşünebilirsiniz. Bu, herhangi bir program yürütme işlemini duraklatabilir (etiketler, resimler, vb. vb.). Bu kendi kendini de probleminizin çözümü olabilir (aslında ikinci bir cevap olabilir).