有点模仿QQ消息盒子的感觉,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using DevComponents.DotNetBar;
namespace BW_ArasSpirit
{
public partial class SystemMsgBox : Form
{
private static SystemMsgBox _initialize = null;
public static SystemMsgBox getinstance()
{
if (_initialize == null)
{
_initialize = new SystemMsgBox();
}
return _initialize;
}
#region 变量
private bool boolVisible = false;
#endregion
#region 拖动无边框窗体
[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;
#endregion
public SystemMsgBox()
{
InitializeComponent();
}
//#region 鼠标Move Hover Leave样式区域
//private void labelShowMsg_MouseMove(object sender, MouseEventArgs e)
//{
// labelShowMsg.ForeColor = Color.FromArgb(50, 50, 50);
//}
//private void labelShowMsg_MouseLeave(object sender, EventArgs e)
//{
// labelShowMsg.ForeColor = Color.FromArgb(100, 100, 100);
//}
//#endregion
#region 取消窗体关闭事件
private void FormMessage_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
boolVisible = true;
timerShowWindow.Enabled = true;
timerWait.Enabled = false;
}
#endregion
#region 窗体关闭
private void btnFormClose_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Close();
}
}
#endregion
#region 显示窗体函数
public void ShowWindow(List<Task> wlplist,List<Task> ptasklist)
{
this.Show();
this.Opacity = 0;
boolVisible = false;
timerWait.Interval = 5000;
Point point;
try
{
point = frmSet.point;
}
catch (Exception e)
{
throw e;
}
this.Location = new Point((((point.X+10) + (point.X -10))/2)- (this.Size.Width/2), Screen.PrimaryScreen.Bounds.Height - 40 - this.Size.Height);
timerShowWindow.Enabled = true;
int wlpcount = wlplist.Count;
int pacount = ptasklist.Count;
if (wlpcount == 0)
{
lbltasklist.Text = "项目流任务-" + ptasklist[0].Ptaskname + " (" + ptasklist.Count + ")";
labelXTitle.Text ="消息盒子"+" ("+"1"+")";
}
if (pacount == 0)
{
lblwlplist.Text = "工作流任务-" + wlplist[0].Wlptaskname + " (" + wlplist.Count + ")";
labelXTitle.Text = "消息盒子" + " (" + "1" + ")";
}
if (wlpcount != 0 && pacount != 0)
{
lbltasklist.Text = "项目流任务-" + ptasklist[0].Ptaskname + " (" + ptasklist.Count + ")";
lblwlplist.Text = "工作流任务-" + wlplist[0].Wlptaskname + " (" + wlplist.Count + ")";
labelXTitle.Text = "消息盒子" + " (" + "2" + ")";
}
}
#endregion
#region 控制窗体显示
private void timerShowWindow_Tick(object sender, EventArgs e)
{
if (!boolVisible)
{
this.Opacity += 0.1;
if (this.Opacity >= 1)
{
timerShowWindow.Enabled = false;
timerWait.Enabled = false;
boolVisible = false;
}
}
else
{
this.Opacity -= 0.1;
if (this.Opacity == 0)
{
boolVisible = false;
this.Hide();
timerShowWindow.Enabled = false;
timerWait.Enabled = false;
}
}
}
#endregion
#region 等待
private void timerWait_Tick(object sender, EventArgs e)
{
timerShowWindow.Enabled = false;
timerWait.Enabled = false;
}
#endregion
#region 移动无边框窗体事件
private void labelXTitle_MouseDown(object sender, MouseEventArgs e)
{
//ReleaseCapture();
//SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);//*********************调用移动无窗体控件函数
}
#endregion
public delegate void MyDelegate(bool istrue);
public event MyDelegate MyEvent;
private void label1_Click(object sender, EventArgs e)
{
try
{
MyEvent(true);
this.Hide();
}
catch (Exception exp)
{
throw exp;
}
}
public static bool istrueexit = false;
private void SystemMsgBox_Load(object sender, EventArgs e)
{
}
//private void labelXTitle_MouseMove(object sender, MouseEventArgs e)
//{
// labelXTitle.ForeColor = Color.Red;
// labelXTitle.Font = new Font(labelXTitle.Font, FontStyle.Bold | FontStyle.Underline);
//}
//private void labelXTitle_MouseLeave(object sender, EventArgs e)
//{
// labelXTitle.ForeColor = Color.White;
// labelXTitle.Font = new Font(labelXTitle.Font, FontStyle.Bold);
//}
}
}
mian.cs
public SystemMsgBox smb = SystemMsgBox.getinstance();
private void niIcon_MouseDown(object sender, MouseEventArgs e)
{
if (isRun && IsCloseWindow == "0")
{
point = Cursor.Position;
if (!smb.Visible)
{
smb.MyEvent +=new SystemMsgBox.MyDelegate(this.getreturnvalue);
smb.ShowWindow(wlptasklist,ptasklist);
timerpoint.Start();
}
}
}
private Point lastpoint;
private void timerpoint_Tick(object sender, EventArgs e)
{
if (lastpoint == null) return;
if (smb.Visible)
{
//定义范围
//起始位置
lastpoint = Cursor.Position;
if (lastpoint.Y > point.Y + 100 || lastpoint.Y < point.Y - 100)
{
//超出高度隐藏
smb.Hide();
timerpoint.Stop();
}
//根据y的范围判定x的取值
int x = (((point.X + 10) + (point.X - 10)) / 2) - (211 / 2);
int y = Screen.PrimaryScreen.Bounds.Height - 40 - 97;
//图标的上方,判断窗体的范围
if (lastpoint.Y < y || lastpoint.Y != y)
{
if (lastpoint.X < x || lastpoint.X > x + 211)
{
smb.Hide();
}
}
//图标的下方,判断图标的范围
//if (lastpoint.Y > y || lastpoint.Y != y)
//{
// if (lastpoint.X < x + 211 / 2 - 10 || lastpoint.X > x + 211 / 2 + 10)
// {
// smb.Hide();
// }
//}
}
}