2013-08-22 35 views
5

Windows XE2, TVirtualStringTree ve bir TComboBox yerinde bir editör olarak kullanıyorum.Fare tekerleği yanlış kontrole mesaj gönderiliyor

TComboBox'u doğrudan forma yerleştirdiğimde, çalışma zamanında listeyi açabilirim ve fare tekerleği listedeki öğeleri yukarı ve aşağı kaydırır (istendiği gibi). Bununla birlikte,, çalışma yerinde düzenleyici olarak TVirtualStringTree tarafından çalışma zamanında oluşturulduğunda, yeni oluşturulan birleşik giriş kutusunun odaklanmasına rağmen, fare tekerleğinin WM_MOUSEWHEEL iletisi, birleşik kutuya değil, ağaç denetimine gönderilir.

Bu, açılan kutudaki öğeler kaydırma yapmıyor olduğundan aşikar. Bunun yerine, açılan kutunun arkasındaki ağaç denetimi kaydırır. Birleşik kutunun sabit kısmı ağaçla birlikte hareket eder, ancak açılan liste açılan kutunun sabit kısmından ayrılır ve hareket etmiyor (tasvir edildiği gibi).

Example of how the tree control scrolled behind the drop-down list

Her iki durumda da TComboBox.StylecsDropDownList ayarlanır. Fare gezinip nerede

FCBox := TComboBox.Create(TreeControl); 
FCBox.Visible := False; 
FCBox.Parent := TreeControl; 
// ... add items to combo box ... 
FCBox.Visible := True; 
FCBox.SetFocus; 
FCBox.DroppedDown := True; 

farketmez: açılan kutu ağacın yerinde editör olarak oluşturulduğunda, bu şekilde yapılır. Açılan kutu açılır listesindeki öğelerin doğrudan üzerinde olabilir ve arka planda ağaç denetimi hala kaydırma yapan bir tanesidir. Birleşik kutudaki öğeleri kaydırmanın tek yolu kaydırma çubuğunu kullanmaktır.

Odaklanmış denetimin üst tarafının, denetimin kendisi yerine fare tekerleği iletilerini almasına neden olan şey (bu durumda, TComboBox)?

+0

Bu makaleyi (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx) iletinin denetime gönderileceğini açıkladım. ve eğer işleyemezse, zincir işlenene kadar üst tarafa gönderilir. Şimdi 'TVirtualStringTree' 'TComboBox' mesajını işleme şeklini değiştirecek bir şey yapıp yapmadığını görmek için arıyorum. –

cevap

1

VirtualTrees.pasTBaseVirtualTree sınıfında aşağıdaki bildiriyi içerir: o ilk dikey ve sonra yatay kaydırma böylece

private 
    procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL; 

bileşeni yazar fare tekerleği mesajlar yakalanan. Özel kod, fare tekerleği iletilerinin, TComboBox yerine TVirtualStringTree'a gönderilmesinin nedeni. Onun kodunu ve beklendiği gibi TComboBox açılan listeyi yorumladı.

TBaseVirtualTree kodunu gerçekten kaldırmak istemediğimden, kendi yerinde TMyComboBox kodunu, yerinde düzenleyici olarak kullanmak için aşağıdaki kodla oluşturdum. Şimdi kaydırma, hem aşağı açılan listede hem de ağaç kontrolünde doğru şekilde çalışıyor. işlemek için TControl.DoMouseWheel() yönteme ağaç kontrolü ve eller o geçmeden önce

interface 

type 
    TMyCombBox = class(TComboBox) 
    private 
    procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL; 
    end; 

implementation 

procedure TMyComboBox.CMMouseWheel(var Message: TCMMouseWheel); 
begin 
    if DoMouseWheel([], Message.WheelDelta, SmallPointToPoint(Message.Pos)) then 
    Message.Result := 1; 
end; 

Bu CM_MOUSEWHEEL mesajı yakalar.

+0

Inplace editörünüzün mesajlarını işlemek için oldukça yaygın bir uygulamadır. Eğer bunu yapıyor olsaydınız, “WM_MOUSEWHEEL” 'i (sizin inplace editörünüz tarafından) ele aldığınızı söylerdiniz, böylece anlattığınız hiçbir şey olmazdı. – TLama

+0

Teşekkürler @TLama - Sorun, mesajın yerinde düzenleyiciye asla gönderilmemesi.Bunun yerine, hemen "TComboBox" u devre dışı bırakarak ağaç kontrolüne gönderilmiştir. İşe yaraması için mesajı özel bir 'TComboBox'da tekrar yakalamam gerekiyordu. Çözümü benim cevaba ekleyeceğim. –

+0

İleti açılan kutuya gönderildi, ancak bu küçük canavar sadece göz ardı etti (işlemedi) :-) Açılan kutudaki öğe değişiyor, sistem tarafından kontrol ediliyor ve hiçbir şey için açılan kutu fare tekerini kullanıyor. Bu mesajı VCL'de görmezden geldiğimi merak etmiyorum. – TLama

İlgili konular