windows - 更改框架的父级后未触发鼠标事件

标签 windows delphi delphi-xe

我正在运行时更改框架的父级,以将框架从一种形式移动到另一种形式。这工作正常,但之后我的组件不再接收鼠标事件。例如,CM_MOUSEENTERCM_MOUSELEAVE 不会被触发。

Frame.Parent := SecondDisplayForm;
Frame.Align := alClient;
SecondDisplayForm.Show;

我不明白这种效果,也不知道要提供什么信息,所以如果您有提示,请在这里帮助我。

最佳答案

正如 NGLN 报道的那样,它在 D7 中工作,但在 BDS2006 中它是可重现的。我发现在 cm_mouseenter 之后和 cm_mouseleave 之前更改父级很重要,否则没有问题。我认为问题出在controls.pas中,也许这是一个错误。稍微玩了一下,我发现如果您在更改父项之前执行一条wm_mouseleave消息,一切都会恢复正常。

在我的示例代码中,我在 onclick 事件中更改了父级。

  TFrame3 = class(TFrame)
    procedure FrameClick(Sender: TObject);
  private
    procedure CMMouseEnter( var msg: TMessage ); message CM_MOUSEENTER;
    procedure CMMouseLeave( var msg: TMessage ); message CM_MOUSELEAVE;
  public
  end;

implementation

procedure TFrame3.CMMouseEnter(var msg: TMessage);
begin
  inherited;
  Color := clRed;
end;

procedure TFrame3.CMMouseLeave(var msg: TMessage);
begin
  inherited;
  Color := clBlue;
end;

procedure TFrame3.FrameClick(Sender: TObject);
begin
if parent = Form1 then
  begin
    Perform( WM_MOUSELEAVE, 0, 0 );
    parent := Form2;
    align := alClient;
    Form1.Hide;
    Form2.Show;
  end else
  begin
    Perform( WM_MOUSELEAVE, 0, 0 );
    parent := Form1;
    align := alClient;
    Form2.Hide;
    Form1.Show;
  end;
end;

我认为该问题与Controls.pas中的FMouseControl有关,但尚未正确调查。

关于windows - 更改框架的父级后未触发鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207360/

相关文章:

Delphi XE 显示至少 200 个错误,但程序编译得很好

python - 在 Windows 上的 Python 中获取和设置环境变量

delphi - 为什么在Delphi XE5中{$IFDEF MSWINDOWS}被替换为{$IF Defined(MSWINDOWS)}?

delphi - 通过单击该行中的任何单元格来选择 TStringGrid 中的一行。

delphi - 如何将 TXT 文件作为资源添加到我的 EXE 文件中?

delphi - BDE 与 Delphi XE

c# - 如何使用 Windows SDK 更新 "Additional Clocks"设置

python - 错误没有名为 curses 的模块

c++ - 无法捕获屏幕保护程序事件

delphi - Delphi XE/XE2 64位中的POPCNT