您的位置:首页 > 移动开发 > Objective-C

三种移动无标题窗口方法的比较

2007-01-10 20:57 281 查看
语言c#,代码来自网上。

第一种,处理mousedown,mouseup,mousemove,mousedown时设置条件量,在mousemove中改变窗口位置。

局部成员声明。

[align=left]    private Point ptMouseCurrrnetPos, ptMouseNewPos, ptFormPos, ptFormNewPos;[/align]
[align=left]    private bool blnMouseDown=false;[/align]
[align=left][/align]
       主要的三个鼠标事件,即MouseDown、 MouseMove、 MouseUp三个事件。
[align=left]    private void frmTopMost_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)[/align]
[align=left]    {[/align]
[align=left]        if( blnMouseDown )[/align]
[align=left]        {[/align]
[align=left]            //Get the current position of the mouse in the screen[/align]
[align=left]            ptMouseNewPos = Control.MousePosition;[/align]
[align=left] [/align]
[align=left]            //Set window position[/align]
[align=left]            ptFormNewPos.X = ptMouseNewPos.X - ptMouseCurrrnetPos.X + ptFormPos.X;[/align]
[align=left]            ptFormNewPos.Y = ptMouseNewPos.Y - ptMouseCurrrnetPos.Y + ptFormPos.Y;[/align]
[align=left] [/align]
[align=left]            //Save window position[/align]
[align=left]            Location = ptFormNewPos;[/align]
[align=left]            ptFormPos = ptFormNewPos;[/align]
[align=left] [/align]
[align=left]            //Save mouse position[/align]
[align=left]            ptMouseCurrrnetPos = ptMouseNewPos;[/align]
[align=left]        }       [/align]
[align=left]    }[/align]
[align=left] [/align]
[align=left]    private void frmTopMost_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)[/align]
[align=left]    {[/align]
[align=left]        if(e.Button==MouseButtons.Left)[/align]
[align=left]        {[/align]
[align=left]            blnMouseDown = true;[/align]
[align=left] [/align]
[align=left]            // Save window position and mouse position[/align]
[align=left]            ptMouseCurrrnetPos = Control.MousePosition;[/align]
[align=left]            ptFormPos = Location;[/align]
[align=left]        }[/align]
[align=left]    }[/align]
[align=left] [/align]
[align=left]    private void frmTopMost_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)[/align]
[align=left]    {[/align]
[align=left]        if( e.Button == MouseButtons.Left)[/align]
[align=left]            //Return back signal[/align]
[align=left]            blnMouseDown = false;[/align]
    }
 这个方法对程序其他逻辑部分影响最小。
第二种,将客户区的鼠标事件映射到标题栏。
       const int WM_NCHITTEST = 0x0084;
        const int HTCLIENT = 0x0001;
        const int HTCAPTION = 0x0002;
        protected override void WndProc(ref System.Windows.Forms.Message m)
       {
            switch(m.Msg)
           {
                    case WM_NCHITTEST:
                             base.WndProc(ref m);
                             if (m.Result==(IntPtr)HTCLIENT)
                                      m.Result=(IntPtr)HTCAPTION;
                             break;
                    default:
                             base.WndProc(ref m);
                             break;
           }
      }
因为是把客户区的鼠标时间映射到了标题栏,所以本来正常的客户区鼠标事件如双击等等会被影响。
第三种,发送移动消息。
 DllImport("user32.dll")]
  public static extern bool ReleaseCapture();
  [DllImport("user32.dll")]
  public static extern bool SendMessage(IntPtr hwnd,int wMsg,int wParam,int lParam);
                                      
  public const int WM_SYSCOMMAND=0x0112;
  public const int SC_MOVE=0xF010;
  public const int HTCAPTION=0x0002;
  
  private void Form2_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
  {
 
8ae4
  ReleaseCapture();
   SendMessage(this.Handle,WM_SYSCOMMAND,SC_MOVE+HTCAPTION, 0);
  }

这种方法与第二种类似,左键的双击会被屏蔽。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  object signal user c# 语言