三种移动无标题窗口方法的比较
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);
}
这种方法与第二种类似,左键的双击会被屏蔽。
第一种,处理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);
}
这种方法与第二种类似,左键的双击会被屏蔽。
相关文章推荐
- 用C#做一个悬浮窗口[含三种移动无标题窗体的办法]
- WIN32无标题栏窗口移动方法种种
- 无标题栏窗口移动方法种种
- 无标题栏窗口移动方法种种
- Linux图形桌面窗口没有标题栏,不能移动,关闭,最小化的解决方法
- 无标题栏窗口移动方法种种
- 视图实现圆角效果的三种方法及比较
- asp.net跳转页面的三种方法比较
- C#里面比较时间大小三种方法
- 三种细边框表格的实现方法比较(转)
- asp.net跳转页面的三种方法比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- 三种方法让Response.Redirect在新窗口打开
- Win8系统在同一个窗口不能打开新文件夹的三种解决方法
- ios view实现圆角效果的三种方法及比较
- 无标题栏窗口移动
- 比较简单实用的使用正则三种版本的js去空格处理方法
- 建立空窗口时,窗口函数受到的消息(三种拦截记录消息的方法)
- [转]SQL 2000 Insert返回自动编号id三种方法比较
- Java Swing 中三种事件处理方法之比较