2013-09-01 13 views
7

Lütfen TTreeNode'un durum simgesi dikdörtgeninin ekran koordinatlarını TreeView (TTreeView.StateImages özelliğinde belirtilen simgeleri demek) konusunda yardımcı olun.Delphi, TTreeView: verilen düğümün ve simgesinin ekran koordinatlarını nasıl alabilirim?

TTreeView.GetHitTestInfoAt(X, Y: integer): : THitTests işlevi var, ancak bu tam olarak aradığım şey değil; Verilen koordinatların etikete veya simgeye veya öğenin durum simgesine karşılık gelip gelmediğini söyler, ancak simgenin hangi kısmının tıklandığını bilmem gerekir.

(nedeni her öğe için iki onay kutularını TreeView düğümleri uygulamak istediğiniz ve ben onay kutularını simüle etmek StateImages kullanın (bir devlet, diğer devlet denetlenmeyen öğesi) bir kontrol öğedir. Olarak ben onay kutularının hangisinin tıklandığının bilinmesi, imleç koordinatlarının durum simgesi koordinatlarıyla karşılaştırılması gerekir. Bunları nasıl edinebilirim?)

cevap

6

Denetim bir istemci adresi koordinatlarını söyleyen bir tvm_GetItemRect iletiyi gönderebilirsiniz Ürünün sınırlayıcı kutusunun Etiket metninin göreceli konumları ve simgelerin farenin nerede tıklandığını belirlemek için simgelerin konumunu biliyorsunuz. GetHitTestInfoAt yerine, tvm_HitTest iletisini göndermek yerine, çarpma testi bilgilerini ve bir öğe tanıtıcısını bir kerede alacağından iletebilirsiniz; Bir tanıtıcı, tvm_GetItemRect'un gerektirdiği şeydir. Bugüne kadar ilgili tüm koordinatlar istemci koordinatları çünkü

Sen ekranını gerekmez koordinatları, ama sen gerçekten ekran koordinatlarını istiyorsanız ClientToScreen çağırabilir.

+2

Makroların çağrılması mesaj göndermekten çok daha kolaydır. Ancak o zaman bile, Delphi'nin ['TTreeNode.DisplayRect'] olduğundan (http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.ComCtrls.TTreeNode), 'TVM_GETITEMRECT' mesajını açık bir şekilde göndermeniz gerekmez. "TVM_GETITEMRECT" mesaj makrosunu dahili olarak çağıran ve bir ağaç düğümü için sınırlayıcı dikdörtgeni döndüren .DisplayRect) yöntemi. – TLama

+0

Çok teşekkürler! İşe yaradı! İşte yaptığım kod: 'CommCtrl kullanır; ... var R: TRect; pItemRect: işaretçi; başlangıç ​​ pItemRect: = @R; HTREEITEM (pItemRect ^): = TreeView.Selected.ItemId; SendMessage (TreeView1.Handle, TVM_GETITEMRECT, WParam (doğru), LParam (pItemRect)); ... - bu, seçilen öğe metninin koordinatlarını "R" içine koyar. Böylece, simgenin sağ X koordinatı 'R. Sol - 4' dir (simge ve metin arasında 3 boş piksel vardır). –

+0

Artık 'DisplayRect' yöntemi sadece 'TVM_GETITEMRECT' iletisinin bir sarıcısı olduğundan, 'TreeView.Selected.DisplayRect' işlevini kullanmak için kodunuzu basitleştirebilirsiniz. Ve böyle bir koda dikkat edin, çünkü her zaman bazı düğümler seçilmemelidir, bu yüzden 'TTreeView.Selected' 'nil' olabilir. Her neyse, eğer sorunuzu çözdüyse, ['cevabı kabul et] 'i unutmayın (http://meta.stackexchange.com/a/5235/179541). – TLama