如何使form在桌面内顺时钟飞行移动边缘不会飞出桌面以外

解决方案 »

  1.   

    一个事件发生时,就执行飞行移动任务,不然停止自动移动,
    类似于以前一个追着鼠标的猫form的游戏,现在是把form制作成为类似猫的东西,鼠标进了form就自动移开鼠标的范围再停止,如果太难只在左右飞行也可以,飞到左边尽头就飞右边,飞到右边尽头就飞左边,鼠标进了form就自动移开鼠标的范围再停止,总之鼠标和form水火不容
      

  2.   

    form无法移动吗
    这里有例子Delphi的动画制作技巧
    Delphi中所有对象都提供了Top、Left、Height、Width四个属性用以控制对象的位置和大小另外在Delphi中还提供了一个Time的构件利用它们可以方便地实现一些动画。
    一、拉幕
    拉幕式即从中间往两边慢慢显示画面。在此把dbimage1的center属性设成true把stretch属性设成false。把Width属性设成0适当设置Left的值使其显示在屏幕中间。实现动画主要方法是修改Left属性值逐渐变小和Width属性值逐渐变大要注意的是为了让幕布从中间均匀地向两边拉开Width的改变值必须是Left改变值的2倍。在Dimeer1的OnTime事件中输入如下语句
    if dbimage1.left>0 then
    begin
    dbimage1.left=dbimage1.left-1
    dbimage1.width=dbimage1.width+2
    //dbimage1.width的改变值必须是dbimage1.left改变值的2倍
    end
    else
    timer1.enabled=false//拉幕结束。
    把上面程序中的Left改为TopWidth改为Height就可以实现竖直方向的拉幕。如果把拉幕这种效果运用于文本类型的对象就可以实现一行一行地显示文本的效果。
    二、手风琴
    在拉幕式的动画中当画面整个显示后再把画面从两边往中间慢慢遮住如此不断循环像拉手风琴一样。实现时需加入一个变量State用以表明此时的状态。具体程序如下
    procedure TForm1.Timer1TimerSender TObject
    begin
    if state=1 then
    if dbimage1.left>0 then
    begin
    dbimage1.left=dbimage1.left-1
    dbimage1.width=dbimage1.width+2
    end
    else
    //当幕完全拉开后改变状态变量
    state=2
    else //从两边往中间拉
    if dbimage1.left<form1.width div 2 then
    begin
    dbimage1.left=dbimage1.left+1
    dbimage1.width=dbimage1.width-2
    end
    else
    //当幕合上后改变状态变量
    state=1
    end
    三、栅栏式
    画面初始被竖直栅栏遮住然后各条栅栏逐渐变窄被栅栏分割的画面逐渐完整起来。在这种动画中栅栏的角色由STATICTEXT类型的对象来充当画面呈现几条栅栏就需要几个STATICTEXT对象。只需改变STATICTEXT类型对象的Left 和 Width属性即可Left逐渐变大Width逐渐变小在Timer1的OnClick事件上每一个STATICTEXT对象作如下处理
    if st1.width>0 then //ST1是STACTICTEXT类型的一个对象
    begin
    st1.width=st1.width-2
    st1.left=st1.left+1 
    end
    else
    //再一次循环
    begin
    st1.width=40 //Width和Left由实际情况决定
    st1.left=40
    end
    如果把上面的栅栏水平排列把Left改成Top把Width改成Height则成为百页窗的效果大家有兴趣的话可以试试。
    四、翻页
    这是一种旋转的效果实际上是把Top的值固定改变Height的值并把Stretch的值设为True。在Timer1的OnTime事件中键入以下程序可以实现向上翻页
    if dbimage1.height>0 then
    dbimage1.height=dbimage1.height-4
    若把上面程序中的Height的属性值从小变到大则实现向下翻页的效果。若把Top改成Left把Height改成Width则实现左右翻页的效果。如果把Left和Width一起同时改变则可以使图片以某一条通过图片的竖直线为轴进行旋转在Timer1的OnTimeR事件中程序如下
    procedure TForm1.Timer1TimerSender TObject
    begin
    if state=1
    then
    if dbimage1.width>0 then
    begin
    //画面逐渐变小
    dbimage1.left=dbimage1.left+1
    dbimage1.width=dbimage1.width-2
    //width的改变值必须是left改变值的两倍
    end
    else
    state=2
    else
    if dbimage1.width<250 then
    begin
    dbimage1.left=dbimage1.left-1
    dbimage1.width=dbimage1.width+2
    end
    else
    state=1
    end
    从以上程序可以看出这是把画面变小后再慢慢变大变小是一个状态State=1变窄是另一个状态State=2这两种状态交替出现即可出现动画。
    五、从画面外逐渐移飞过
    在设计封面的时候经常需要让标题从画面上飞过的效果。 要实现这种类型的动画实际上只需改变标题的Top垂直方向飞过或Left属性水平方向飞过。
    例如实现一个标题在一幅画上从左往右飞过。先在Form1里建立一个图形对象Dbimage1和文字对象Statictext1注意TEXT类型的对象无法显示在图片上把位置和大小尺寸设好然后在Form1里建立一个Time对象Time1把其Enabled属性设为TrueInterval属性设为10并在事件OnTime里键入如下语句
    procedure TForm1.Timer1TimerSender TObjectbegin
    if statictext1.left<dbimage1.width+dbimage1.left then
    statictext1..left=statictext1.left+3
    else
    statictext1.left=dbimage1.left
    //当标题飞出图片后使标题重新位于图片的左边再一次从左向右入屏幕
    end
    说明
    1.如果只想使标题从左向右移动一次Else语句改为Timer1.enabled=false
    2. 数值3是标题移动的速度值可以随意更改
    3. 若标题只移到图片的某一位置则把“statictext1.left<dbimage1.width+dbimage1.left”改为“statictext1.left<位置值”并把Else语句改为Timer1.enabled=false;
    4. 只需把Left的值从大变到小则实现从右往左飞过
    5. 把上面的Left改为Top把Width改为Height即可实现垂直方向的动画。 
      

  3.   

    不知道有没有理解错楼主的意思。procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
        if abs(x-form1.Width)>x then form1.Left:=form1.Left+1 else form1.Left:=form1.Left-1;
        if abs(y-form1.Height)>y then form1.top:=form1.top+1 else form1.Top:=form1.Top-1;
    end;
    这样窗体会往桌面外跑出的可能,但加点限制就可以了。像和尚的唐僧
      

  4.   

    screen.width
    screen.height
    移动过程中把窗口位置和上面桌面数值进行比较。
    做出判断。
      

  5.   

    写在oncreate事件中
    AnimateWindow(Form1.Handle,200,AW_HOR_NEGATIVE)//从右边飞出
      

  6.   

    等鼠标再次移动入在动
    可以吗?写在oncreate事件中
    AnimateWindow(Form1.Handle,200,AW_HOR_NEGATIVE)//从右边飞出
    速度如何调节?
      

  7.   

    AnimateWindow(Form1.Handle,200,AW_HOR_NEGATIVE)//从右边飞出
    那个200就是速度
    你自己干吗不试试,还有最后一个差数是从什么地方飞出,你可以从上、左上角,别的都可以,你把最后那个差数变变
      

  8.   

    AnimateWindow从来没有见过不知道怎么查参数AW_HOR_NEGATIVE
      

  9.   

    处理FORM的left top height width 很简单的
      

  10.   

    AnimateWindow从来没有见过不知道怎么查参数AW_HOR_NEGATIVE
    你按Ctrl再点AW_HOR_NEGATIVE,他会到
    windows单元去,它上面下面的那几个就是了,你不会是刚学吧
      

  11.   

    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
        if abs(x-form1.Width)>x then form1.Left:=form1.Left+1 else form1.Left:=form1.Left-1;
        if abs(y-form1.Height)>y then form1.top:=form1.top+1 else form1.Top:=form1.Top-1;
    end;
    这样窗体会往桌面外跑出的可能,但加点限制就可以了。像和尚的唐僧
    主要问题是,鼠标在移动到标题部分的时候就不再移动了,如何解决?
      

  12.   

    AnimateWindow(Form1.Handle,200,AW_HOR_NEGATIVE)//从右边飞出这是启动时的特效
    我说的是运行时可以自动移动,不需要再浪费时间点击拖再移动的效果
    在运行的时候用看看,是加入什么事件啊