2013-08-22 55 views
5

Tôi đang sử dụng Windows XE2, TVirtualStringTreeTComboBox làm trình chỉnh sửa được đặt tại chỗ.Thông báo gửi bánh xe chuột đến điều khiển sai

Khi tôi đặt TComboBox trực tiếp trên biểu mẫu, tại thời gian chạy, tôi có thể thả danh sách xuống và con lăn chuột cuộn các mục trong danh sách lên và xuống (như mong muốn). Tuy nhiên, khi TComboBox được tạo tại thời gian chạy bởi TVirtualStringTree làm trình chỉnh sửa tại chỗ, mặc dù hộp tổ hợp mới được tạo có tiêu điểm, thông báo WM_MOUSEWHEEL của bánh xe chuột được gửi tới điều khiển cây chứ không phải hộp tổ hợp.

Điều này hiển nhiên vì các mục trong danh sách thả xuống hộp tổ hợp không cuộn. Thay vào đó, điều khiển cây đằng sau hộp cuộn kết hợp. Phần cố định của hộp combo di chuyển với cây, nhưng danh sách thả xuống bị ngắt kết nối khỏi phần cố định của hộp tổ hợp và không di chuyển (như được mô tả).

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

Trong cả hai trường hợp, các TComboBox.Style được thiết lập để csDropDownList. Khi combo box được tạo ra như biên tập viên tại chỗ của cây, nó được thực hiện theo cách này:

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

Nó không quan trọng nơi chuột được lơ lửng. Nó có thể được trực tiếp trên các mục trong danh sách thả xuống hộp combo và điều khiển cây trong nền vẫn là một trong đó cuộn. Cách duy nhất để cuộn các mục trong hộp kết hợp là sử dụng thanh cuộn của nó.

Điều gì sẽ khiến phụ huynh của kiểm soát tập trung nhận được thông báo bánh xe chuột thay vì chính điều khiển (trong trường hợp này là TComboBox)?

+0

Tôi tìm thấy bài viết này (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx) giải thích rằng thư được gửi đến kiểm soát, và nếu nó không xử lý nó, sau đó nó được gửi lên chuỗi cho đến khi nó được xử lý. Bây giờ tôi đang tìm xem liệu 'TVirtualStringTree' có làm thay đổi cách 'TComboBox' xử lý thông điệp không. –

Trả lời

1

VirtualTrees.pas bao gồm các tuyên bố sau đây trong lớp TBaseVirtualTree:

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

Tác giả phần bắt các thông điệp bánh xe chuột để ông đầu tiên có thể cuộn theo chiều dọc và sau đó theo chiều ngang. Mã tùy chỉnh là lý do thông báo bánh xe chuột được gửi đến số TVirtualStringTree thay vì TComboBox. Tôi đã nhận xét mã của anh ấy và danh sách thả xuống TComboBox được cuộn như mong đợi.

Vì tôi thực sự không muốn xóa mã TBaseVirtualTree, tôi đã tự tạo TMyComboBox của riêng mình bằng mã sau để sử dụng làm trình chỉnh sửa tại chỗ. Bây giờ di chuyển hoạt động chính xác trong cả danh sách thả xuống và trong điều khiển cây.

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; 

này ghi lại thông điệp CM_MOUSEWHEEL trước khi nó được thông qua với sự kiểm soát cây và bàn tay nó vào TControl.DoMouseWheel() phương pháp để xử lý.

+0

Thực tế khá phổ biến là xử lý các thông điệp của trình soạn thảo tại chỗ của bạn. Nếu bạn đã làm như vậy, bạn sẽ nói với 'WM_MOUSEWHEEL' mà bạn đã xử lý nó (bởi trình soạn thảo tại chỗ của bạn), vì vậy không có gì bạn mô tả sẽ xảy ra. – TLama

+0

Cảm ơn @TLama - Vấn đề là thông báo chưa bao giờ được gửi đến trình chỉnh sửa tại chỗ.Thay vào đó, nó ngay lập tức được gửi đến kiểm soát cây, bỏ qua toàn bộ 'TComboBox'. Tôi đã phải lấy lại thông điệp trong một 'TComboBox' tùy chỉnh để làm cho nó hoạt động. Tôi sẽ thêm giải pháp vào câu trả lời của mình. –

+0

Tin nhắn đã được gửi đến hộp kết hợp, nhưng con thú nhỏ đó đã bỏ qua điều đó (không xử lý) :-) Mục thay đổi trong hộp kết hợp được điều khiển bởi hệ thống và không có gì khác hộp kết hợp sử dụng bánh xe chuột, vì vậy Tôi không tự hỏi rằng nó bỏ qua thông điệp này trong VCL. – TLama

Các vấn đề liên quan