有点模仿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(); // } //} } }