TVirtualStringTree行为默认情况下,如果它的重点是 - 它会在鼠标滚轮滚动即使鼠标不在控制(除非它是对另一TVirtualStringTree).
是否有一种快速而优雅的方法来禁用此行为?
我已经这样做与OnMouseWheel事件,并检查PtInRect是否Mouse.CursorPos如果是在控制,但我有一种感觉,有一种更好的方式做同样的,因为这样,我不得不定义每个树视图我想补充,也是一个新的事件处理何时聚焦/取消聚焦控件,所以我希望必须有更好的方法来禁用它.
所以要清楚,我希望鼠标滚轮功能像往常一样工作,但只有当鼠标在VirtualTreeView上时.
delphi c++builder virtualtreeview delphi-2010 c++builder-2010
我在表单中有一个TListView组件.它很长,我希望用户能够滚动它,如果鼠标在组件上方并滚动滚轮.我没有为TListView对象找到任何OnMouseWheel,OnMouseWheelDown或OnMouseWheelUp事件.我怎样才能做到这一点?
问候,邪恶
嗨,我有一个内部有几个框架的表格.
对于某些帧,我希望滚动内容(或至少处理鼠标轮事件).
我尝试过以下方法:
只需为每个帧分配一个OnMouseWheel事件处理程序
覆盖父窗体的MouseWheel事件:
procedure TFmReview.MouseWheelHandler(var Message: TMessage);
var Control: TControl;
begin
Control := ControlAtPos(ScreenToClient(SmallPointToPoint(TWMMouseWheel(Message).Pos)), False, True);
if Assigned(Control) and (Control <> ActiveControl) then
begin
ShowMessage(Control.Name);
Message.Result := Control.Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam);
if Message.Result = 0 then
Control.DefaultHandler(Message);
end else inherited MouseWheelHandler(Message);
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是,两者似乎都没有用.
因此,简单地说,如何将鼠标滚轮事件指向鼠标光标所在的最顶层控件(无论光标位于哪个帧/父/窗体等)?
我想编写一个使用鼠标滚轮缩放类似Google地球的组件.
我有一个使用onMouseWheel的组件,我有属性MaxZoom MinZoom和Zoom有一个更好的选项,StretchDraw与位图我试图获取组件区域的位置在窗体中
据我所知,我必须找到每个父项,直到找到tCustomform并添加所有Component的顶部和组件,以获取对象位置以找到我的对象位置.有没有更好的办法
一旦我有了位置,我可以从鼠标光标位置缩放地图,如果鼠标在我的对象上并且在哪里放大.
有任何人看到任何代码请
我创建了一个源自 TGraphicControl 的 delphi 组件。是否可以添加对鼠标滚轮的支持?
- - 编辑 - -
我已经公开了如下所示的 MouseWheel 事件,但它们没有被调用。
TMyComponent = class(TGraphicControl)
published
property OnMouseWheel;
property OnMouseWheelDown;
property OnMouseWheelUp;
end;
Run Code Online (Sandbox Code Playgroud)
- - 编辑 - -
正如下面所建议的,我试图捕获 WM_MOUSEWHEEL 和 CM_MOUSEWHEEL 消息,但它似乎不起作用。但是我设法捕获了 CM_MOUSEENTER 消息。我不明白为什么我可以捕获一种类型的消息,而不能捕获另一种。
我编写了以下代码:
procedure MouseWheel(var Msg:TWMMouseWheel);message WM_MOUSEHWHEEL;
我将它用于基于TPanel的组件(TMyP = class(TPanel))(请注意,由于我自己的原因,我不想使用TCustomPanel)
但无论如何,当我在面板上使用鼠标滚轮时,不会调用该事件.请帮我!
我正在尝试整理我的代码,因为Delphi XE2可用 - 我的代码可以追溯到Borland Pascal 7所以有很多'老'(但工作!)Win32技术,我自然也考虑到了平台独立性.在此之前已经提出了对鼠标滚轮的支持,其中有几个先前的问题1 2和3.与其中一些答案一样,我自己的解决方案是使用TApplicationEvents组件进行简单的鼠标消息拦截:
procedure TForm6.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
procedure ProcessMouseWheelMessage;
begin
Msg.message := WM_KEYDOWN;
Msg.lParam := 0;
If Integer(Msg.wParam) > 0 then
Msg.wParam := VK_UP
else
Msg.wParam := VK_DOWN;
Handled := False;
end;
begin
Case Msg.message of
WM_MOUSEWHEEL :
ProcessMouseWheelMessage;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我今天重新访问了这段代码,因为'Msg.wParam'现在是NativeInt,在上面的代码中使用了负的Msg.wParam值,除非你使用Integer(Msg.wParam).它让我注意到我没有看到任何真正明确使用鼠标滚轮的Delphi代码 - 当所有鼠标现在都有轮子并且Delphi再次处于'前沿'时可怕!我本来期望一个属性,一个组件或一些其他更"暴露"的解决方案,以及Fire Monkey车轮支持怎么样?
我是继续使用我的解决方案还是有更好的方法?
如果在Shift按下键的同时使用鼠标滚轮,我想实现水平滚动.但WM_MOUSEWHEEL在这种情况下我没有收到任何消息:
procedure WMMouseWheel(var Msg: TMessage); message WM_MOUSEWHEEL; // is not called
Run Code Online (Sandbox Code Playgroud)
根据文档,WPARAM 应该有一条WM_MOUSEWHEEL消息MK_SHIFT.
有任何想法吗?
delphi ×8
mousewheel ×4
c++builder ×1
delphi-2010 ×1
delphi-xe ×1
delphi-xe2 ×1
focus ×1
mouseevent ×1
tform ×1
tframe ×1
vcl ×1