active中鼠标事件的响应

SVIP_ 2014-04-25 10:47:22
最近在做一个delphi的active控件, 发现在控件中按钮的mouseon事件居然没反应, 这是什么情况, 但是鼠标按下的事件是可以的. 求各位支招.
...全文
284 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SVIP_ 2014-05-15
  • 打赏
  • 举报
回复
谢谢版主了 目前用的其他办法处理了. 1. 在控件的MouseMove事件中, 将控件的tag置1, 并改变控件的图片或者颜色
  if TImageButton(Sender).Tag = 0 then
  begin
    TImageButton(Sender).Tag := 1;
    TImageButton(Sender).PicNormal.Bitmap.Assign(TImageButton(Sender).PicMouseOn.Bitmap);
    TImageButton(Sender).Invalidate;
  end;
2. 用timer定时器实时监视鼠标和控件的位置判断.
procedure TActiveMonitorX.tmrBtnTimer(Sender: TObject);
var
  i: Integer;
  ptScreen, pt: TPoint;
  Rc: TRect;
begin
  GetCursorPos(pt);
 // WriteTxLog('%d, %d', [pt.X, pt.Y]);
  for i := 0 to Length(FBtnHandle)-1 do
  begin
    if FBtnHandle[i].Tag = 0 then Continue;
    ptScreen.X := 0;
    ptScreen.Y := 0;
    Windows.ClientToScreen(FBtnHandle[i].Handle, ptScreen);
    Rc := Rect(ptScreen.X, ptScreen.Y, ptScreen.X+ FBtnHandle[i].Width, ptScreen.Y+FBtnHandle[i].Height);
    if not PtInRect(Rc, pt) then
    begin
      FBtnHandle[i].Tag := 0;
      FBtnHandle[i].PicNormal.Bitmap.Assign(FBtnHandle[i].PicMouseDown.Bitmap);
      FBtnHandle[i].Invalidate;
    end;  
  end;
end;
效果算达到了. 结贴吧.
金卯刀 2014-05-14
  • 打赏
  • 举报
回复
不是说如何使用;而是告诉你,mouseenter/leave事件的触发原理。从给出的VCL看,除非是没有消息进入,否则都可以触发。 单独的exe运行,没问题;而在你的activex会有问题。需要确认一下,调用方在调用你的activex后,是如何显示窗口?嵌入到某个容器中?独立的窗口显示? 试着比较两种显示方式的差异。需要注意的是,如果是嵌入式的,窗口的风格需要做调整,才能正常处理一些消息。
SVIP_ 2014-05-13
  • 打赏
  • 举报
回复
引用 7 楼 Avan_Lau 的回复:
[quote=引用 1 楼 Avan_Lau 的回复:] OnEnter OnExit? 如果是这类,检查一下focusedControl的变化。因为只有在焦点变化时才发生
引用 2 楼 Avan_Lau 的回复:
如果按钮只有一个,默认焦点在按钮上,且只有这个按钮能获得焦点。当然就不会触发了....
修正以上说法,VCL写法如下:

procedure TWinControl.WndProc(var Message: TMessage);
....
          if (FMouseControl <> Target) then
          begin
            if ((FMouseControl <> nil) and (CaptureControl = nil)) or
               ((CaptureControl <> nil) and (FMouseControl = CaptureControl)) or
               ((CaptureControl is TControl) and (CaptureControl.Parent = FMouseControl)) then
              FMouseControl.Perform(CM_MOUSELEAVE, 0, 0);
            if FMouseControl <> nil then
              FMouseControl.RemoveFreeNotification(Self);
            FMouseControl := Target;
            if FMouseControl <> nil then
              FMouseControl.FreeNotification(Self);
            if ((FMouseControl <> nil) and (CaptureControl = nil)) or
               ((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
              FMouseControl.Perform(CM_MOUSEENTER, 0, 0);
          end;
..
[/quote] 请问这个要如何使用
金卯刀 2014-05-05
  • 打赏
  • 举报
回复
引用 1 楼 Avan_Lau 的回复:
OnEnter OnExit? 如果是这类,检查一下focusedControl的变化。因为只有在焦点变化时才发生
引用 2 楼 Avan_Lau 的回复:
如果按钮只有一个,默认焦点在按钮上,且只有这个按钮能获得焦点。当然就不会触发了....
修正以上说法,VCL写法如下:

procedure TWinControl.WndProc(var Message: TMessage);
....
          if (FMouseControl <> Target) then
          begin
            if ((FMouseControl <> nil) and (CaptureControl = nil)) or
               ((CaptureControl <> nil) and (FMouseControl = CaptureControl)) or
               ((CaptureControl is TControl) and (CaptureControl.Parent = FMouseControl)) then
              FMouseControl.Perform(CM_MOUSELEAVE, 0, 0);
            if FMouseControl <> nil then
              FMouseControl.RemoveFreeNotification(Self);
            FMouseControl := Target;
            if FMouseControl <> nil then
              FMouseControl.FreeNotification(Self);
            if ((FMouseControl <> nil) and (CaptureControl = nil)) or
               ((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
              FMouseControl.Perform(CM_MOUSEENTER, 0, 0);
          end;
..
金卯刀 2014-05-05
  • 打赏
  • 举报
回复
引用 3 楼 doorsky123 的回复:
谢谢版主的回复. 暂时还没解决/
VCL并没有针对此特殊处理。 调用方,载入你的activex之后,activeform是否获得了焦点?
SVIP_ 2014-04-29
  • 打赏
  • 举报
回复
引用 4 楼 nm_wyh 的回复:
在ActiveX控件中有以下的一个初始化过程,其中就有 OnMouseEnter := MouseEnterEvent; OnMouseLeave := MouseLeaveEvent; 两个事件。这里的事件是对外的,有可能这里出了问题,消息被劫持走了,你可以尝试写一些提示或日志跟踪一下这两个事件。
procedure THDTYPublicActiveX.Initialize;
begin
  inherited Initialize;
  OnActivate := ActivateEvent;
  OnClick := ClickEvent;
  OnCreate := CreateEvent;
  OnDblClick := DblClickEvent;
  OnDeactivate := DeactivateEvent;
  OnDestroy := DestroyEvent;
  OnKeyPress := KeyPressEvent;
  OnMouseEnter := MouseEnterEvent;
  OnMouseLeave := MouseLeaveEvent;
  OnPaint := PaintEvent;
end;
好像是没有 OnMouseEnter := MouseEnterEvent; OnMouseLeave := MouseLeaveEvent; 这两个事件的. 我用的D7 其实就是默认创建一个ActiveForm 然后放上一个lable 加上两句 procedure TActiveFormX.lbl1MouseEnter(Sender: TObject); begin lbl1.Font.Color := clRed; end; procedure TActiveFormX.lbl1MouseLeave(Sender: TObject); begin lbl1.Font.Color := clBlack; end; 这样就没反映, 不知道何解
nm_wyh 2014-04-28
  • 打赏
  • 举报
回复
在ActiveX控件中有以下的一个初始化过程,其中就有 OnMouseEnter := MouseEnterEvent; OnMouseLeave := MouseLeaveEvent; 两个事件。这里的事件是对外的,有可能这里出了问题,消息被劫持走了,你可以尝试写一些提示或日志跟踪一下这两个事件。
procedure THDTYPublicActiveX.Initialize;
begin
  inherited Initialize;
  OnActivate := ActivateEvent;
  OnClick := ClickEvent;
  OnCreate := CreateEvent;
  OnDblClick := DblClickEvent;
  OnDeactivate := DeactivateEvent;
  OnDestroy := DestroyEvent;
  OnKeyPress := KeyPressEvent;
  OnMouseEnter := MouseEnterEvent;
  OnMouseLeave := MouseLeaveEvent;
  OnPaint := PaintEvent;
end;
SVIP_ 2014-04-28
  • 打赏
  • 举报
回复
谢谢版主的回复. 暂时还没解决/
金卯刀 2014-04-25
  • 打赏
  • 举报
回复
如果按钮只有一个,默认焦点在按钮上,且只有这个按钮能获得焦点。当然就不会触发了....
金卯刀 2014-04-25
  • 打赏
  • 举报
回复
OnEnter OnExit? 如果是这类,检查一下focusedControl的变化。因为只有在焦点变化时才发生

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧