2013-08-22 14 views
5

Ich verwende Windows XE2, die TVirtualStringTree und eine TComboBox als ein platzierter Editor.Mausrad sendet Nachricht an das falsche Steuerelement

Wenn ich eine TComboBox direkt auf dem Formular platzieren, kann ich zur Laufzeit die Liste und das Mausrad blättern die Elemente in der Liste nach oben und unten (wie gewünscht). Wenn jedoch die TComboBox zur Laufzeit von TVirtualStringTree als In-Place-Editor erstellt wird, obwohl das neu erstellte Kombinationsfeld Fokus hat, wird die WM_MOUSEWHEEL Nachricht des Mausrads an das Struktursteuerelement und nicht das Kombinationsfeld gesendet.

Dies ist offensichtlich, da die Elemente in der Dropdownliste Dropdown-Liste nicht scrollen. Stattdessen scrollt das Struktursteuerelement hinter dem Kombinationsfeld. Der feste Teil des Kombinationsfelds bewegt sich mit dem Baum, aber die Dropdown-Liste wird von dem festen Teil des Kombinationsfelds getrennt und bewegt sich nicht (wie dargestellt).

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

In beiden Fällen wird die TComboBox.Style auf csDropDownList gesetzt. Wenn das Kombinationsfeld als der Baumes in-Place-Editor erstellt wird, wird es auf diese Weise:

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

Es spielt keine Rolle, wo die Maus schwebt. Es kann direkt über die Elemente in der Auswahlliste des Kombinationsfeldes sein und das Baum-Steuerelement im Hintergrund ist immer noch dasjenige, das scrollt. Die einzige Möglichkeit zum Scrollen der Elemente im Kombinationsfeld besteht darin, die Bildlaufleiste zu verwenden.

Was würde dazu führen, dass das übergeordnete Element des fokussierten Steuerelements anstelle des Steuerelements die Mausradmeldungen empfängt (in diesem Fall TComboBox)?

+0

Ich fand diesen Artikel (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx), der erklärt, dass die Nachricht an das Steuerelement gesendet wird, und wenn es nicht damit klarkommt, dann wird es die Kette zum Elternteil hinaufgeschickt, bis es gehandhabt wird. Ich schaue jetzt, ob 'TVirtualStringTree' alles tut, was die' TComboBox' verändert. –

Antwort

1

VirtualTrees.pas enthält die folgende Erklärung in der TBaseVirtualTree Klasse:

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

Die Komponente Autor das Mausrad Nachrichten erfasst, so dass er zuerst vertikal bewegen kann und dann horizontal. Der benutzerdefinierte Code ist der Grund, dass die Mausradmeldungen an die TVirtualStringTree anstelle der TComboBox gesendet werden. Ich habe seinen Code auskommentiert und die TComboBox Dropdown-Liste wurde wie erwartet gescrollt.

Da ich wirklich nicht den TBaseVirtualTree Code entfernen möchte, habe ich meine eigene TMyComboBox mit dem folgenden Code erstellt, um als In-Place-Editor zu verwenden. Das Scrollen funktioniert jetzt sowohl in der Dropdown-Liste als auch in der Baumstruktur korrekt.

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; 

Dies fängt die CM_MOUSEWHEEL Nachricht, bevor sie an der Baumstruktur und Hände übergeben es an die TControl.DoMouseWheel() Verfahren zu verarbeiten.

+0

Es ist durchaus üblich, Nachrichten Ihres Inplace-Editors zu bearbeiten. Wenn Sie dies tun würden, würden Sie dem 'WM_MOUSEWHEEL' mitteilen, dass Sie es (von Ihrem Inplace-Editor) gehandhabt haben, also würde nichts, was Sie beschrieben haben, geschehen. – TLama

+0

Danke @TLama - Das Problem ist, dass die Nachricht nie an den In-Place-Editor gesendet wurde.Stattdessen wurde es sofort an die Baumsteuerung gesendet, wobei die TComboBox vollständig umgangen wurde. Ich musste die Nachricht in einer benutzerdefinierten 'TComboBox' neu erfassen, damit es funktioniert. Ich füge die Lösung meiner Antwort hinzu. –

+0

Die Nachricht wurde an das Kombinationsfeld gesendet, aber dieses kleine Biest ignorierte das einfach (hat es nicht gehandhabt) :-) Der in der Combo-Box wechselnde Artikel wird vom System gesteuert und für nichts anderes benutzt die Combo-Box das Mausrad Ich wundere mich nicht, dass es diese Nachricht in VCL ignoriert. – TLama