汕头市潮南区人民政府:C#实现一个类似QQ窗体自动上卷的程序 - e路共赢的日志 - 网易博客
来源:百度文库 编辑:中财网 时间:2024/04/28 03:58:47
C#实现一个类似QQ窗体自动上卷的程序
.net技术 2010-06-29 11:33:52 阅读40 评论0 字号:大中小 订阅
QQ窗体上滑的效果,主要通过处理鼠标消息实现的。
有三种消息需要处理:
左键弹起:判断窗体的上边,是否在屏幕上边线以上,是则调整窗体的Y坐标为0.
鼠标移出窗体:判断窗体左上角Y坐标是否为0
鼠标进入窗体:判断窗体是否已经上滑,如果已经上滑,需要还原窗体。
移动窗体的时候,计算出Y轴上需要移动的距离,然后分成10次移动,每次间隔50ms,以达到连续移动的效果。
代码如下:
using System;C#实现一个类似QQ窗体自动上卷的程序源码下载:http://files.cnblogs.com/FiredFish/FormHideLikeQQ.rar
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();
msevnt.cbSize = Marshal.SizeOf(typeof(TRACKMOUSEEVENT));
msevnt.dwFlags = TME_HOVER;
msevnt.hwndTrack = (long)this.Handle;
msevnt.dwHoverTime = 300;
if (m.WParam.ToInt32() == VK_LBUTTON)
{
Point newCursor = GetPointFromLPARAM(m.LParam.ToInt32());
this.Location = new Point(this.Location.X + newCursor.X - this._mouseDownPos.X,
this.Location.Y + newCursor.Y - this._mouseDownPos.Y);
}
}
break;
default:
break;
}
}
///
/// 获得低16位值
///
///
///
public static int GET_X_LPARAM(int lParam) { return (lParam & 0xffff); }
///
/// 获得高16位值
///
///
///
public static int GET_Y_LPARAM(int lParam) { return (lParam >> 16); }
///
/// 解析出鼠标的新坐标(相对于窗体的坐标)
///
///
///
public static Point GetPointFromLPARAM(int lParam)
{ return new Point(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); }
private Point _mouseDownPos = new Point();
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
C#中,怎么实现在第一个窗体上点一个按钮,出现第二个窗体
C# Windows程序窗体大小
怎样实现类似QQ秀的试衣程序
c#怎么实现任意形状窗体
c#如何实现一个窗体或者面板从屏幕一侧,平滑移入,而且不闪烁
请问C#如何在一个类或一个窗体中使用用另一个窗体的控件?
c# 窗体数据的传递
一个关于C#的程序
请问如何用C#在窗体上实现指定分钟或小时的倒计时时钟??
怎样在C#窗体上设置让它自动显示时间..(要会运行的)
希望能帮一下小弟这个忙:用C#语言设计一个图片文件管理程序类似ACD SEE,能实现图片的预览 缩放等功能
我在C#中遇到一个问题,窗体切换的问题
一个简单C#程序
使用vc/c#如何实现类似与TSR相似的功能?
这个网有一个类似qq的那种是怎么实现的
请问如何在VB中实现将阿拉伯数字类似数码管一样的效果显示在窗体上呀!谢谢!
谁有类似QQ秀的程序
类似QQ家园的整站程序
怎么通过API在编辑类子窗体中实现自动换行和不自动换行的切换?
C# 窗体设计问题
c# 窗体控件问题
C#窗体切换
一个类似造字程序的东西
关于c#的程序