DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: namnvh
今日帖子: 0
在线用户: 1
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 15:05:24
标题:
高手们,紧急求救!!!! 在线等~~~~~~~~~~ 浏览:2425
加入我的收藏
楼主: 问题是这样的:窗体在桌面上自动移动,我想使鼠标放在它上面时,它就停止移动;移开鼠标后窗体继续移动。我发现FORM没有ONMOUSEENTER这个事件!请问,我该怎么实现?!谢谢各位帮助一下小弟!
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smallant (小小蚂蚁) ★☆☆☆☆ -
普通会员
2004/1/14 15:12:19
1楼: move 事件 试试判定!
多加个中间变量!
----------------------------------------------
寵辱不驚,看庭前花開花落。
去畱無意,望天上雲捲雲舒。

千江有水千江月,万里无云万里天。
作者:
男 nptch (nptch) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 15:15:13
1楼: 重写wndproc事件
判断WM_MOUSEMOVE消息触发时就是鼠标在FORM上。

Public
  procedure wndproc(var msg:Tmessage);override;
...

  procedure Tform1.wndproc(var msg:Tmessage);
  begin
    if msg.msg=WM_MOUSEMOVE then
    begin
      //do something
    end else 
    Inherited;
  end;
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 15:15:43
2楼: 在窗体上放一控件,panel或image,align := alClient
 ;)


----------------------------------------------
-
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 15:17:36
3楼: 谢谢各位,小弟先试一下!
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 15:21:44
4楼: 十分感谢1楼的师兄!能停下来了!但是我想将鼠标移开的时候,窗体又继续移动,怎么办喃?
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 nptch (nptch) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 15:37:03
5楼: WM_MOUSELEAVE
----------------------------------------------
-
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 15:48:39
6楼: 哎呀,NPTCH大哥,我真的很笨啊!试了,但是不对,我不知道怎么把这两个事件放在一起哈!
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 15:53:22
7楼: NPTCH大哥,又出了一个问题!用WM_MOUSEMOVE来使它停下来,并不是每次都可以哈!这是怎么回事呢?
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 nptch (nptch) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 16:07:52
8楼: if msg.msg=wm_mousemove then
  //do
if msg.msg=wm_mouseleave then
  //do
至于有时不行,我没看过你的源码,你发到我的信箱我看看!
nptch@mail.china.com
----------------------------------------------
-
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 16:17:38
9楼: 邮件已经发过去了哈!

如果我想自定义一个消息来判断鼠标是否在窗体中,行不行呢?
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 nptch (nptch) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 16:49:23
10楼: if msg.Msg=Cm_mouseenter then
  begin
    timer1.Enabled:=false;
  end;
  if msg.Msg=cm_mouseleave then
  begin
    timer1.Enabled:=true;
  end;
  inherited;
----------------------------------------------
-
作者:
男 nptch (nptch) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 16:50:12
11楼: 我试了可以!
----------------------------------------------
-
作者:
男 nptch (nptch) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 17:14:10
12楼: inherited;
  case msg.Msg of
    CM_mouseenter:timer1.Enabled:=false;
    CM_MOUSELEAVE:begin
      timer1.Enabled:=true;
      sendmessage(handle,WM_LBUTTONDOWN,0,0);
    end;
  end;
有时移开了也不法再移动是因为事件被锁定了,可以模拟一个数标单击消息,解决问题!
----------------------------------------------
-
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/14 17:15:39
13楼: 恩,好的,我再试一下!再次感谢你!
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/15 15:17:48
14楼: NPTCH大哥,我试了,还是不行哈!
于是,我这样用的,你看行得通不:?
procedure TfrmFly.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
        Timer1.Enabled := False;
end;
这段代码可以使窗体停下来哈,而且次次能成功(至少我试的几次都可以哈)!但是,怎么才能使它又继续移动喃?

如果有哪位高手知道,请告诉小弟一声,感谢!~~~~~~~~~~~
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/15 15:19:47
15楼: 我在 Timer1.Enabled := False;后又加了一句哈:
if (x = 0) or (y = 0) then
    Timer1.Enabled := True;
但是这样只有很少机会才能成功,能解释一下是为什么吗?
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/15 15:30:45
16楼: NPTCH大哥,我又将上面那两句删了,用的是你教我的方法:
procedure TfrmFly.WndProc(var Msg: TMessage);
begin
        if Msg.Msg = CM_MOUSELEAVE then
                Timer1.Enabled := True
        else
                inherited;
end;
可以成功了哈,不过,为什么鼠标只有从上方离开窗体的时候才能每次都行,若从其它三个方向离开,则不是次次都行哈!WHY????????
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/15 15:36:41
17楼: 我又重新试了一下,如果是慢慢将鼠标移出窗体,那么次次都能成功哈!它的原因是不是:鼠标移动过快的话,WNDPROC消息并不能接收到?
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/15 15:47:32
18楼: NPTCH大哥,小弟的问题解决了哈!我是这样实现的:
procedure TfrmFly.WndProc(var Msg: TMessage);
begin
        if Msg.Msg = CM_MOUSEENTER then
                Timer1.Enabled := False;

        if Msg.Msg = CM_MOUSELEAVE then
                Timer1.Enabled := True
        else
                inherited;
end;

procedure TfrmFly.WMNCHITTEST(var Msg: TWMNCHitTest);
begin
        inherited;
        
        if HTCLIENT = Msg.Result then
                Msg.Result := HTCAPTION;
end;

非常感谢你给的帮助!谢谢,谢谢了哈!
----------------------------------------------
俺很菜,但俺很执着!!!
作者:
男 smonkey421 (猩猩) ★☆☆☆☆ -
盒子活跃会员
2004/1/15 15:57:30
19楼: 但是我觉得我这个方法是不是笨了一点哦?!有没有简单一点的?
----------------------------------------------
俺很菜,但俺很执着!!!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行150.3906毫秒 RSS