设为首页 加入收藏

TOP

一个类似QQ窗体自动上卷的程序(一)
2014-11-24 02:41:02 来源: 作者: 【 】 浏览:0
Tags:一个 类似 窗体 自动 上卷 程序

QQ窗体上滑的效果,主要通过处理鼠标消息实现的。


有三种消息需要处理:


左键弹起:判断窗体的上边,是否在屏幕上边线以上,是则调整窗体的Y坐标为0.


鼠标移出窗体:判断窗体左上角Y坐标是否为0


鼠标进入窗体:判断窗体是否已经上滑,如果已经上滑,需要还原窗体。


移动窗体的时候,计算出Y轴上需要移动的距离,然后分成10次移动,每次间隔50ms,以达到连续移动的效果。


代码如下:


类QQ窗体
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace FormHideLikeQQ
{
public partial class QQForm : Form
{
public QQForm()
{
InitializeComponent();
}


///


/// 鼠标弹起时,如果上边缘超过上顶端线。将其移动到顶端线上
///

///
///
private void QQForm_MouseUp()
{
if (this.Location.Y < 0)
{
MoveForm(new Point(this.Location.X, 0));
}
}


///


/// 如果上边缘在上顶端线上,鼠标离开则上滑窗体
///

///
///
private void QQForm_MouseLeave()
{
if (this.Location.Y == 0)
{
MoveForm(new Point(this.Location.X, 5 - this.Size.Height));
}
}

///
/// 窗体移动函数,有缓慢移动特效。
///

///
private void MoveForm(Point newPos)
{
//500ms内移动完
Point currentPos = this.Location;
double step = (newPos.Y - this.Location.Y) / 10.0;
for (int i = 1; i <= 10; i++)
{
this.Location = new Point(this.Location.X, (int)(currentPos.Y + step * i));
System.Threading.Thread.Sleep(50);
}
}


///


/// 鼠标进入窗体的响应事件
///

private void QQForm_MouseEnter()
{
if (this.Location.Y == (5 - this.Size.Height))
{
MoveForm(new Point(this.Location.X, 0));
}
}


[DllImport("user32")]
public static extern bool TrackMouseEvent(TRACKMOUSEEVENT lpEventTrack);


[StructLayout( LayoutKind.Sequential,CharSet=CharSet.Ansi)]
public struct TRACKMOUSEEVENT {
public long cbSize;
public long dwFlags;
public long hwndTrack;
public long dwHoverTime;
}


private const int WM_MOUSEHOVER = 0x2a1;
private const int WM_MOUSELEAVE = 0x2a3;
private const int WM_MOUSEMOVE = 0x200;
private const int TME_HOVER = 0x1;
private const int WM_LBUTTONUP = 0x202;
private const int WM_LBUTTONDOWN = 0x201;
private const int VK_LBUTTON = 0x01;


///


/// 消息处理函数
///

///
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);


switch (m.Msg)
{
case WM_LBUTTONDOWN:
{
if (m.WParam.ToInt32() == VK_LBUTTON)
{
this._mouseDownPos = GetPointFromLPARAM(m.LParam.ToInt32());
}
}
break;
case WM_LBUTTONUP:
QQForm_MouseUp();
break;
case WM_MOUSELEAVE:
QQForm_MouseLeave();
break;
case WM_MOUSEHOVER:
QQForm_MouseEnter();
break;
case WM_MOUSEMOVE:
{
TRACKMOUSEEVENT msevnt = new TRACKMOUSEEVENT();

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux popen函数的使用总结 下一篇Helix Server多个缓冲区溢出漏洞

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: