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:
devre dışı bırakılması VCL stilleri (
TSplitter.StyleElements := []
).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.
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.
Hala "TFlickerFreeForm" veya "TFlickerFreeControl" tanıtımı için bekliyorum. –
Uzak ve bazen yetersiz bir çözüm getirildi, ancak DoubleBuffered özelliğini etkinleştirmeyi denediniz mi? –
@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