2013-08-22 19 views
5

Sto usando Windows XE2, il TVirtualStringTree e un TComboBox come un editor sul posto.Rotellina del mouse che invia il messaggio al controllo errato

Quando inserisco uno TComboBox direttamente nel modulo, in fase di esecuzione posso scorrere verso il basso l'elenco e la rotellina del mouse scorre le voci nell'elenco su e giù (come desiderato). Tuttavia, quando il TComboBox viene creato in fase di esecuzione da TVirtualStringTree come un editor sul posto, anche se la casella combinata appena creata è attiva, il messaggio WM_MOUSEWHEEL della rotella del mouse viene inviato al controllo struttura e non alla casella combinata.

Ciò è evidente perché gli elementi nell'elenco a discesa casella combinata non scorrono. Invece, il controllo dell'albero dietro la casella combinata scorre. La parte fissa della casella combinata si sposta con l'albero, ma l'elenco a discesa viene disconnesso dalla porzione fissa della casella combinata e non si sposta (come illustrato).

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

In entrambi i casi il TComboBox.Style è impostato csDropDownList. Quando la casella combinata è creato come editor sul posto dell'albero, si è fatto in questo modo:

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

non importa dove il mouse è in bilico. Può essere direttamente sopra gli elementi nell'elenco a discesa casella combinata e il controllo struttura ad albero in background è ancora quello che scorre. L'unico modo per scorrere gli elementi nella casella combinata consiste nell'utilizzare la barra di scorrimento.

Che cosa farebbe sì che il genitore del controllo focalizzato ricevesse i messaggi della rotellina del mouse invece del controllo stesso (in questo caso, lo TComboBox)?

+0

Ho trovato questo articolo (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx) che spiega che il messaggio viene inviato al controllo, e se non lo gestisce, viene inviato alla catena fino a quando non viene gestito. Sto cercando ora di vedere se 'TVirtualStringTree' fa qualcosa che cambierebbe il modo in cui' TComboBox' gestisce il messaggio. –

risposta

1

VirtualTrees.pas include la seguente dichiarazione nella classe TBaseVirtualTree:

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

L'autore componente catturato i messaggi rotellina del mouse in modo da poter scorrere verticalmente prima e poi in orizzontale. Il codice personalizzato è il motivo per cui i messaggi della rotellina del mouse vengono inviati a TVirtualStringTree anziché a TComboBox. Ho commentato il suo codice e l'elenco a discesa TComboBox scorreva come previsto.

Poiché non desidero rimuovere il codice TBaseVirtualTree, ho creato il mio TMyComboBox con il seguente codice da utilizzare come editor sul posto. Ora lo scorrimento funziona correttamente sia nell'elenco a discesa che nel controllo ad albero.

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; 

Questa cattura il messaggio CM_MOUSEWHEEL prima di essere passato al controllo struttura e le mani al metodo TControl.DoMouseWheel() da elaborare.

+0

È piuttosto una pratica comune gestire i messaggi del proprio editor sul posto. Se lo facessi, diresti al 'WM_MOUSEWHEEL' che lo hai gestito (dal tuo editor di posto), quindi nulla di ciò che hai descritto sarebbe accaduto. – TLama

+0

Grazie a @TLama: il problema è che il messaggio non è mai stato inviato all'editor sul posto.Invece, è stato immediatamente inviato al controllo dell'albero, ignorando del tutto il 'TComboBox'. Ho dovuto ricatturare il messaggio in un 'TComboBox' personalizzato per farlo funzionare. Aggiungerò la soluzione alla mia risposta. –

+0

Il messaggio è stato inviato alla casella combinata, ma quella piccola bestia ha semplicemente ignorato che (non l'ha gestito) :-) La modifica delle voci nella casella combinata è controllata dal sistema e per nient'altro la casella combinata utilizza la rotellina del mouse, quindi Non mi sto chiedendo di ignorare questo messaggio in VCL. – TLama

Problemi correlati