2013-09-01 43 views
7

Vui lòng giúp tôi lấy tọa độ màn hình của hình chữ nhật biểu tượng trạng thái của TTreeNode trong một TreeView (Tôi có nghĩa là các biểu tượng được chỉ định trong thuộc tính TTreeView.StateImages).Delphi, TTreeXem: làm thế nào để có được tọa độ màn hình của nút cho trước và biểu tượng của nó?

Có chức năng TTreeView.GetHitTestInfoAt(X, Y: integer): : THitTests, nhưng đó không phải là điều tôi đang tìm kiếm; nó cho biết liệu các tọa độ đã cho có tương ứng với nhãn hoặc biểu tượng hay biểu tượng trạng thái của mục hay không, nhưng tôi cần biết phần nào của biểu tượng đã được nhấp.

(Lý do là tôi muốn triển khai các nút TreeView có hai hộp kiểm cho mỗi mục và tôi sử dụng StateImages để mô phỏng các hộp kiểm (một trạng thái là mục được chọn, trạng thái kia là mục không được chọn). hiểu, để biết một trong các hộp kiểm được nhấp vào, tôi cần phải so sánh các tọa độ con trỏ với tọa độ biểu tượng trạng thái. Làm thế nào tôi có thể nhận được chúng?)

Trả lời

6

Bạn có thể gửi điều khiển thông báo tvm_GetItemRect. của hộp giới hạn của mục. Sử dụng điều đó và những gì bạn biết về vị trí tương đối của văn bản nhãn và các biểu tượng để xác định nơi con chuột được nhấp vào biểu tượng.

Thay vì GetHitTestInfoAt, bạn có thể muốn gửi thông báo tvm_HitTest thay vì thông báo sẽ cung cấp cho bạn thông tin thử nghiệm lần truy cập và một mục xử lý cùng một lúc; một xử lý là những gì yêu cầu tvm_GetItemRect.

Bạn không cần màn hình vì tất cả các tọa độ liên quan cho đến nay là tọa độ của khách hàng, nhưng bạn có thể gọi ClientToScreen nếu bạn thực sự muốn tọa độ màn hình.

+2

Macro gọi dễ hơn nhiều so với việc gửi tin nhắn. Nhưng ngay cả khi đó, bạn không cần gửi thông điệp 'TVM_GETITEMRECT' rõ ràng vì Delphi có [' TTreeNode.DisplayRect'] (http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.ComCtrls.TTreeNode .DisplayRect) phương pháp mà nội bộ gọi macro tương ứng 'TVM_GETITEMRECT' tin nhắn và trả về hình chữ nhật bounding cho một nút cây. – TLama

+0

Cảm ơn rất nhiều! Nó đã làm việc! Đây là mã tôi đã tạo: 'sử dụng CommCtrl; ... var R: TRect; pItemRect: con trỏ; bắt đầu pItemRect: = @R; HTREEITEM (pItemRect ^): = TreeView.Selected.ItemId; SendMessage (TreeView1.Handle, TVM_GETITEMRECT, WParam (true), LParam (pItemRect)); ... ' - đặt vào' R' tọa độ của văn bản mục đã chọn. Do đó, tọa độ X đúng của biểu tượng là 'R.Left - 4' (có 3 pixel trống giữa biểu tượng và văn bản). –

+0

Bây giờ bạn có thể đơn giản hóa mã của bạn để sử dụng 'TreeView.Selected.DisplayRect' vì phương thức' DisplayRect' chỉ đơn thuần là một trình bao bọc cho thông báo 'TVM_GETITEMRECT'. Và hãy cẩn thận với mã như vậy vì không phải lúc nào cũng phải được chọn một số nút, do đó 'TTreeView.Selected' có thể là' nil'. Dù sao, nếu điều đó giải quyết được câu hỏi của bạn, đừng quên ['chấp nhận câu trả lời'] (http://meta.stackexchange.com/a/5235/179541). – TLama