SCROLLBOX,在有些时候,你写了MOUSEWHEEL事件的代码,但缺看不到效果,关键在与在SCROLLBOX中都是IMAGE或LABEL控件。所以SCROLLBOX根本的不到焦点。 解决方案: 在SCROLLBOX中放入控件LISTBOX1,将LISTBOX1的长宽都设为0, 在SCROLLBOX的MOUSEMOVE事件中写入代码: procedure TForm1.ScrollBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin //listbox随鼠标移动,不移动的话在SCROLLBOX在次得到焦点的时候滚动到LISTBOX位置 listbox1.Top:=y; listbox1.Left:=x; //Listbox1 得到焦点,其实是SCROLLBOX得到焦点 listbox1.SetFocus; end; 然后在写控制鼠标滚轮的事件。 procedure TForm1.ScrollBox1MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var posi:integer; begin posi := ScrollBox1.vertScrollBar.Position - 25 ; if ScrollBox1.vertScrollBar.Position < 0 then posi := 0; ScrollBox1.vertScrollBar.Position := posi end; procedure TFrom1.ScrollBox1MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin ScrollBox1.vertScrollBar.Position := ScrollBox1.vertScrollBar.Position + 25 ; end; 这样就可以了,网上的很多方案都是截取系统的Message VM_WHEEL,其实SCROLLBOX本身就有,不需要来修改他,因为修该Message会对其他控件有影响,关键是在于他本身是否可以接受焦点。 上面代码D7没有问题。LISTBOX空间可以换成其他能接受焦点的控件来代替,但不要用EDIT控件,因为EDIT控件在接受焦点后有光标显示。 |
|