最近在项目上要做一个消息推送的组件,实习医生站和护士站通讯的组件,医生站开立医嘱后通知护士需要审核医嘱,会诊医嘱审核之后通知会诊医生会诊,我相信在其他项目上也会用到,在这里先总结一下,留着备用。废话少说,直奔主题。
第一步,创建l两个个表,如果不用表也可以用xml存。
脚步如下:
1 -- Create table 2 create table COM_SYS_MSG 3 ( 4 msg_id NUMBER(10) not null, 5 msg_title VARCHAR2(50), 6 msg_content VARCHAR2(100), 7 publisher VARCHAR2(6), 8 publish_time DATE, 9 limited_area VARCHAR2(50) default 'ALL', 10 is_valid CHAR(1) default '0', 11 extend1 VARCHAR2(100), 12 extend2 VARCHAR2(100), 13 extend3 VARCHAR2(100), 14 role_area VARCHAR2(50) default 'ALL' 15 ) 16 tablespace USERS 17 pctfree 10 18 initrans 1 19 maxtrans 255 20 storage 21 ( 22 initial 192K 23 next 1M 24 minextents 1 25 maxextents unlimited 26 ); 27 -- Add comments to the table 28 comment on table COM_SYS_MSG 29 is '系统消息表,用于群发消息'; 30 -- Add comments to the columns 31 comment on column COM_SYS_MSG.msg_id 32 is '消息编码'; 33 comment on column COM_SYS_MSG.msg_title 34 is '消息标题'; 35 comment on column COM_SYS_MSG.msg_content 36 is '消息内容'; 37 comment on column COM_SYS_MSG.publisher 38 is '消息发布者'; 39 comment on column COM_SYS_MSG.publish_time 40 is '消息发布时间'; 41 comment on column COM_SYS_MSG.limited_area 42 is '限制范围:缺省为ALL——全部范围'; 43 comment on column COM_SYS_MSG.is_valid 44 is '是否有效,0-无效,1-有效,缺省发布消息为0,需要确认发布才更新为1'; 45 comment on column COM_SYS_MSG.extend1 46 is '审核人'; 47 comment on column COM_SYS_MSG.extend2 48 is '接收科室'; 49 comment on column COM_SYS_MSG.role_area 50 is '角色范围:缺省为ALL——全部范围'; 51 -- Create/Recreate indexes 52 create index IDX_CSM_TIME on COM_SYS_MSG (PUBLISH_TIME) 53 tablespace USERS 54 pctfree 10 55 initrans 2 56 maxtrans 255 57 storage 58 ( 59 initial 64K 60 next 1M 61 minextents 1 62 maxextents unlimited 63 ); 64 -- Create/Recreate primary, unique and foreign key constraints 65 alter table COM_SYS_MSG 66 add constraint PK_COM_SYS_MSG primary key (MSG_ID) 67 using index 68 tablespace USERS 69 pctfree 10 70 initrans 2 71 maxtrans 255 72 storage 73 ( 74 initial 64K 75 next 1M 76 minextents 1 77 maxextents unlimited 78 );
1 -- Create table 2 create table COM_IP_MSG 3 ( 4 ip_address VARCHAR2(50) not null, 5 last_view_time DATE, 6 extend1 VARCHAR2(100), 7 extend2 VARCHAR2(100), 8 extend3 VARCHAR2(100) 9 ) 10 tablespace USERS 11 pctfree 10 12 initrans 1 13 maxtrans 255 14 storage 15 ( 16 initial 64K 17 next 1M 18 minextents 1 19 maxextents unlimited 20 ); 21 -- Add comments to the table 22 comment on table COM_IP_MSG 23 is '每个IP地址的最后获取消息记录'; 24 -- Add comments to the columns 25 comment on column COM_IP_MSG.ip_address 26 is 'IP地址'; 27 comment on column COM_IP_MSG.last_view_time 28 is '最后获取消息的时间'; 29 -- Create/Recreate primary, unique and foreign key constraints 30 alter table COM_IP_MSG 31 add constraint PK_CIM_IP primary key (IP_ADDRESS) 32 using index 33 tablespace USERS 34 pctfree 10 35 initrans 2 36 maxtrans 255 37 storage 38 ( 39 initial 64K 40 next 1M 41 minextents 1 42 maxextents unlimited 43 );
第二步:
创建弹窗代码
1、准备两张资源图片文件
效果如下:
2,代码实现:
// C# TaskbarNotifier Class v1.0
// by John O'Byrne - 02 december 2002
// 01 april 2003 : Small fix in the OnMouseUp handler
// 11 january 2003 : Patrick Vanden Driessche <pvdd@devbrains.be> added a few enhancements
// Small Enhancements/Bugfix
// Small bugfix: When Content text measures larger than the corresponding ContentRectangle
// the focus rectangle was not correctly drawn. This has been solved.
// Added KeepVisibleOnMouseOver
// Added ReShowOnMouseOver
// Added If the Title or Content are too long to fit in the corresponding Rectangles,
// the text is truncateed and the ellipses are appended (StringTrimming).
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MyTaskbarNotifier
{
/// <summary>
/// TaskbarNotifier allows to display MSN style/Skinned instant messaging popups
/// </summary>
public class TaskbarNotifier : System.Windows.Forms.Form
{
#region TaskbarNotifier Protected Members
protected Bitmap BackgroundBitmap = null;
protected Bitmap CloseBitmap = null;
protected Point CloseBitmapLocation;
protected Size CloseBitmapSize;
protected Rectangle RealTitleRectangle;
protected Rectangle RealContentRectangle;
protected Rectangle WorkAreaRectangle;
protected Timer timer = new Timer();
protected TaskbarStates taskbarState = TaskbarStates.hidden;
protected string titleText;
protected string contentText;
protected Color normalTitleColor = Color.FromArgb(255,0,0);
protected Color hoverTitleColor = Color.FromArgb(255,0,0);
protected Color normalContentColor = Color.FromArgb(0,0,0);
protected Color hoverContentColor = Color.FromArgb(0,0,0x66);
protected Font normalTitleFont = new Font("Arial",12,FontStyle.Regular,GraphicsUnit.Pixel);
protected Font hoverTitleFont = new Font("Arial",12,FontStyle.Bold,GraphicsUnit.Pixel);
protected Font normalContentFont = new Font("Arial",11,FontStyle.Regular,GraphicsUnit.Pixel);
protected Font hoverContentFont = new Font("Arial",11,FontStyle.Regular,GraphicsUnit.Pixel);
protected int nShowEvents;
protected int nHideEvents;
protected int nVisibleEvents;
protected int nIncrementShow;
protected int nIncrementHide;
protected bool bIsMouseOverPopup = false;
protected bool bIsMouseOverClose = false;
protected bool bIsMouseOverContent = false;
protected bool bIsMouseOverTitle = false;
protected bool bIsMouseDown = false;
protected bool bKeepVisibleOnMouseOver = true; // Added Rev 002
protected bool bReShowOnMouseOver = false; // Added Rev 002
#endregion
#region TaskbarNotifier Public Members
public Rectangle TitleRectangle;
public Rectangle ContentRectangle;
public bool TitleClickable = false;
public bool ContentClickable = true;
public bool CloseClickable = true;
public bool EnableSelectionRectangle = true;
public event EventHandler CloseClick = null;
public event EventHandler TitleClick = null;
public event EventHandler ContentClick = null;
#endregion
#region TaskbarNotifier Enums
/// <summary>
/// List of the different popup animation status
/// </summary>
public enum TaskbarStates
{
hidden = 0,
appearing = 1,
visible = 2,
disappearing = 3
}
#endregion
#region TaskbarNotifier Constructor
/// <summary>
/// The Constructor for TaskbarNotifier
/// </summary>
public TaskbarNotifier()
{
// Window Style
FormBorderStyle = FormBorderStyle.None;
WindowState = FormWindowState.Minimized;
base.Show();
base.Hide();
WindowState = FormWindowState.Normal;
ShowInTaskbar = false;
TopMost = true;
MaximizeBox = false;
MinimizeBox = false;
ControlBox = false;
timer.Enabled = true;
timer.Tick += new EventHandler(OnTimer);
}
#endregion
#region TaskbarNotifier Properties
/// <summary>
/// Get the current TaskbarState (hidden, showing, visible, hiding)
/// </summary>
public TaskbarStates TaskbarState
{
get
{
return taskbarState;
}
}
/// <summary>
/// Get/Set the popup Title Text
/// </summary>
public string TitleText
{
get
{
return titleText;
}
set
{
titleText=value;
Refresh();
}
}
/// <summary>
/// Get/Set the popup Content Text
/// </summary>
public string ContentText
{
get
{
return contentText;
}
set
{
contentText=value;
Refresh();
}
}
/// <summary>
/// Get/Set the Normal Title Color
/// </summary>
public Color NormalTitleColor
{
get
{
return normalTitleColor;
}
set
{
normalTitleColor = value;
Refresh();
}
}
/// <summary>
/// Get/Set the Hover Title Color
/// </summary>
public Color HoverTitleColor
{
get
{
return hoverTitleColor;
}
set
{
hoverTitleColor = value;
Refresh();
}
}
/// <summary>
/// Get/Set the Normal Content Color
/// </summary>
public Color NormalContentColor
{
get
{
return normalContentColor;
}
set
{
normalContentColor = value;
Refresh();
}
}
/// <summary>
/// Get/Set the Hover Content Color
/// </summary>
public Color HoverContentColor
{
get
{
return hoverContentColor;
}
set
{
hoverContentColor = value;
Refresh();
}
}
/// <summary>
/// Get/Set the Normal Title Font
/// </summary>
public Font NormalTitleFont
{
get
{
return normalTitleFont;
}
set
{
normalTitleFont = value;
Refresh();
}
}
/// <summary>
/// Get/Set the Hover Title Font
/// </summary>
public Font HoverTitleFont
{
get
{
return hoverTitleFont;
}
set
{
hoverTitleFont = value;
Refresh();
}
}
/// <summary>
/// Get/Set the Normal Content Font
/// </summary>
public Font NormalContentFont
{
get
{
return normalContentFont;
}
set
{
normalContentFont = value;
Refresh();
}
}
/// <summary>
/// Get/Set the Hover Content Font
/// </summary>
public Font HoverContentFont
{
get
{
return hoverContentFont;
}
set
{
hoverContentFont = value;
Refresh();
}
}
/// <summary>
/// Indicates if the popup should remain visible when the mouse pointer is over it.
/// Added Rev 002
/// </summary>
public bool KeepVisibleOnMousOver
{
get
{
return bKeepVisibleOnMouseOver;
}
set
{
bKeepVisibleOnMouseOver=value;
}
}
/// <summary>
/// Indicates if the popup should appear again when mouse moves over it while it's disappearing.
/// Added Rev 002
/// </summary>
public bool ReShowOnMouseOver
{
get
{
return bReShowOnMouseOver;
}
set
{
bReShowOnMouseOver=value;
}
}
#endregion
#region TaskbarNotifier Public Methods
[DllImport("user32.dll")]
private static extern Boolean ShowWindow(IntPtr hWnd,Int32 nCmdShow);
/// <summary>
/// Displays the popup for a certain amount of time
/// </summary>
/// <param name="strTitle">The string which will be shown as the title of the popup</param>
/// <param name="strContent">The string which will be shown as the content of the popup</param>
/// <param name="nTimeToShow">Duration of the showing animation (in milliseconds)</param>
/// <param name="nTimeToStay">Duration of the visible state before collapsing (in milliseconds)</param>
/// <param name="nTimeToHide">Duration of the hiding animation (in milliseconds)</param>
/// <returns>Nothing</returns>
public void Show(string strTitle, string strContent, int nTimeToShow, int nTimeToStay, int nTimeToHide)
{
WorkAreaRectangle = Screen.GetWorkingArea(WorkAreaRectangle);
titleText = strTitle;
contentText = strContent;
nVisibleEvents = nTimeToStay;
CalculateMouseRectangles();
// We calculate the pixel increment and the timer value for the showing animation
int nEvents;
if (nTimeToShow > 10)
{
nEvents = Math.Min((nTimeToShow / 10), BackgroundBitmap.Height);
nShowEvents = nTimeToShow / nEvents;
nIncrementShow = BackgroundBitmap.Height / nEvents;
}
else
{
nShowEvents = 10;
nIncrementShow = BackgroundBitmap.Height;
}
// We calculate the pixel increment and the timer value for the hiding animation
if( nTimeToHide > 10)
{
nEvents = Math.Min((nTimeToHide / 10), BackgroundBitmap.Height);
nHideEvents = nTimeToHide / nEvents;
nIncrementHide = BackgroundBitmap.Height / nEvents;
}
else
{
nHideEvents = 10;
nIncrementHide = BackgroundBitmap.Height;
}
switch (taskbarState)
{
case TaskbarStates.hidden:
taskbarState = TaskbarStates.appearing;
SetBounds(WorkAreaRectangle.Right-BackgroundBitmap.Width-17, WorkAreaRectangle.Bottom-1, BackgroundBitmap.Width, 0);
timer.Interval = nShowEvents;
timer.Start();
// We Show the popup without stealing focus
ShowWindow(this.Handle, 4);
break;
case TaskbarStates.appearing:
Refresh();
break;
case TaskbarStates.visible:
timer.Stop();
timer.Interval = nVisibleEvents;
timer.Start();
Refresh();
break;
case TaskbarStates.disappearing:
timer.Stop();
taskbarState = TaskbarStates.visible;
SetBounds(WorkAreaRectangle.Right-BackgroundBitmap.Width-17, WorkAreaRectangle.Bottom-BackgroundBitmap.Height-1, BackgroundBitmap.Width, BackgroundBitmap.Height);
timer.Interval = nVisibleEvents;
timer.Start();
Refresh();
break;
}
}
/// <summary>
/// Hides the popup
/// </summary>
/// <returns>Nothing</returns>
public new void Hide()
{
if (taskbarState != TaskbarStates.hidden)
{
timer.Stop();
taskbarState = TaskbarStates.hidden;
base.Hide();
}
}
/// <summary>
/// Sets the background bitmap and its transparency color
/// </summary>
/// <param name="strFilename">Path of the Background Bitmap on the disk</param>
/// <param name="transparencyColor">Color of the Bitmap which won't be visible</param>
/// <returns>Nothing</returns>
public void SetBackgroundBitmap(string strFilename, Color transparencyColor)
{
BackgroundBitmap = new Bitmap(strFilename);
Width = BackgroundBitmap.Width;
Height = BackgroundBitmap.Height;
Region = BitmapToRegion(BackgroundBitmap, transparencyColor);
}
/// <summary>
/// Sets the background bitmap and its transparency color
/// </summary>
/// <param name="image">Image/Bitmap object which represents the Background Bitmap</param>
/// <param name="transparencyColor">Color of the Bitmap which won't be visible</param>
/// <returns>Nothing</returns>
public void SetBackgroundBitmap(Image image, Color transparencyColor)
{
BackgroundBitmap = new Bitmap(image);
Width = BackgroundBitmap.Width;
Height = BackgroundBitmap.Height;
Region = BitmapToRegion(BackgroundBitmap, transparencyColor);
}
/// <summary>
/// Sets the 3-State Close Button bitmap, its transparency color and its coordinates
/// </summary>
/// <param name="strFilename">Path of the 3-state Close button Bitmap on the disk (width must a multiple of 3)</param>
/// <param name="transparencyColor">Color of the Bitmap which won't be visible</param>
/// <param name="position">Location of the close button on the popup</param>
/// <returns>Nothing</returns>
public void SetCloseBitmap(string strFilename, Color transparencyColor, Point position)
{
CloseBitmap = new Bitmap(strFilename);
CloseBitmap.MakeTransparent(transparencyColor);
CloseBitmapSize = new Size(CloseBitmap.Width/3, CloseBitmap.Height);
CloseBitmapLocation = position;
}
/// <summary>
/// Sets the 3-State Close Button bitmap, its transparency color and its coordinates
/// </summary>
/// <param name="image">Image/Bitmap object which represents the 3-state Close button Bitmap (width must be a multiple of 3)</param>
/// <param name="transparencyColor">Color of the Bitmap which won't be visible</param>
/// /// <param name="position">Location of the close button on the popup</param>
/// <returns>Nothing</returns>
public void SetCloseBitmap(Image image, Color transparencyColor, Point position)
{
CloseBitmap = new Bitmap(image);
CloseBitmap.MakeTransparent(transparencyColor);
CloseBitmapSize = new Size(CloseBitmap.Width/3, CloseBitmap.Height);
CloseBitmapLocation = position;
}
#endregion
#region TaskbarNotifier Protected Methods
protected void DrawCloseButton(Graphics grfx)
{
if (CloseBitmap != null)
{
Rectangle rectDest = new Rectangle(CloseBitmapLocation, CloseBitmapSize);
Rectangle rectSrc;
if (bIsMouseOverClose)
{
if (bIsMouseDown)
rectSrc = new Rectangle(new Point(CloseBitmapSize.Width*2, 0), CloseBitmapSize);
else
rectSrc = new Rectangle(new Point(CloseBitmapSize.Width, 0), CloseBitmapSize);
}
else
rectSrc = new Rectangle(new Point(0, 0), CloseBitmapSize);
grfx.DrawImage(CloseBitmap, rectDest, rectSrc, GraphicsUnit.Pixel);
}
}
protected void DrawText(Graphics grfx)
{
if (titleText != null && titleText.Length != 0)
{
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Near;
sf.LineAlignment = StringAlignment.Center;
sf.FormatFlags = StringFormatFlags.NoWrap;
sf.Trimming = StringTrimming.EllipsisCharacter; // Added Rev 002
if (bIsMouseOverTitle)
grfx.DrawString(titleText, hoverTitleFont, new SolidBrush(hoverTitleColor), TitleRectangle, sf);
else
grfx.DrawString(titleText, normalTitleFont, new SolidBrush(normalTitleColor), TitleRectangle, sf);
}
if (contentText != null && contentText.Length != 0)
{
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
sf.Trimming = StringTrimming.Word; // Added Rev 002
if (bIsMouseOverContent)
{
grfx.DrawString(contentText, hoverContentFont, new SolidBrush(hoverContentColor), ContentRectangle, sf);
if (EnableSelectionRectangle)
ControlPaint.DrawBorder3D(grfx, RealContentRectangle, Border3DStyle.Etched, Border3DSide.Top | Border3DSide.Bottom | Border3DSide.Left | Border3DSide.Right);
}
else
grfx.DrawString(contentText, normalContentFont, new SolidBrush(normalContentColor), ContentRectangle, sf);
}
}
protected void CalculateMouseRectangles()
{
Graphics grfx = CreateGraphics();
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
SizeF sizefTitle = grfx.MeasureString(titleText, hoverTitleFont, TitleRectangle.Width, sf);
SizeF sizefContent = grfx.MeasureString(contentText, hoverContentFont, ContentRectangle.Width, sf);
grfx.Dispose();
// Added Rev 002
//We should check if the title size really fits inside the pre-defined title rectangle
if (sizefTitle.Height > TitleRectangle.Height)
{
RealTitleRectangle = new Rectangle(TitleRectangle.Left, TitleRectangle.Top, TitleRectangle.Width , TitleRectangle.Height );
}
else
{
RealTitleRectangle = new Rectangle(TitleRectangle.Left, TitleRectangle.Top, (int)sizefTitle.Width, (int)sizefTitle.Height);
}
RealTitleRectangle.Inflate(0,2);
// Added Rev 002
//We should check if the Content size really fits inside the pre-defined Content rectangle
if (sizefContent.Height > ContentRectangle.Height)
{
RealContentRectangle = new Rectangle((ContentRectangle.Width-(int)sizefContent.Width)/2+ContentRectangle.Left, ContentRectangle.Top, (int)sizefContent.Width, ContentRectangle.Height );
}
else
{
RealContentRectangle = new Rectangle((ContentRectangle.Width-(int)sizefContent.Width)/2+ContentRectangle.Left, (ContentRectangle.Height-(int)sizefContent.Height)/2+ContentRectangle.Top, (int)sizefContent.Width, (int)sizefContent.Height);
}
RealContentRectangle.Inflate(0,2);
}
protected Region BitmapToRegion(Bitmap bitmap, Color transparencyColor)
{
if (bitmap == null)
throw new ArgumentNullException("Bitmap", "Bitmap cannot be null!");
int height = bitmap.Height;
int width = bitmap.Width;
GraphicsPath path = new GraphicsPath();
for (int j=0; j<height; j++ )
for (int i=0; i<width; i++)
{
if (bitmap.GetPixel(i, j) == transparencyColor)
continue;
int x0 = i;
while ((i < width) && (bitmap.GetPixel(i, j) != transparencyColor))
i++;
path.AddRectangle(new Rectangle(x0, j, i-x0, 1));
}
Region region = new Region(path);
path.Dispose();
return region;
}
#endregion
#region TaskbarNotifier Events Overrides
protected void OnTimer(Object obj, EventArgs ea)
{
switch (taskbarState)
{
case TaskbarStates.appearing:
if (Height < BackgroundBitmap.Height)
SetBounds(Left, Top-nIncrementShow ,Width, Height + nIncrementShow);
else
{
timer.Stop();
Height = BackgroundBitmap.Height;
timer.Interval = nVisibleEvents;
taskbarState = TaskbarStates.visible;
timer.Start();
}
break;
case TaskbarStates.visible:
timer.Stop();
timer.Interval = nHideEvents;
// Added Rev 002
if ((bKeepVisibleOnMouseOver && !bIsMouseOverPopup ) || (!bKeepVisibleOnMouseOver))
{
taskbarState = TaskbarStates.disappearing;
}
//taskbarState = TaskbarStates.disappearing; // Rev 002
timer.Start();
break;
case TaskbarStates.disappearing:
// Added Rev 002
if (bReShowOnMouseOver && bIsMouseOverPopup)
{
taskbarState = TaskbarStates.appearing;
}
else
{
if (Top < WorkAreaRectangle.Bottom)
SetBounds(Left, Top + nIncrementHide, Width, Height - nIncrementHide);
else
Hide();
}
break;
}
}
protected override void OnMouseEnter(EventArgs ea)
{
base.OnMouseEnter(ea);
bIsMouseOverPopup = true;
Refresh();
}
protected override void OnMouseLeave(EventArgs ea)
{
base.OnMouseLeave(ea);
bIsMouseOverPopup = false;
bIsMouseOverClose = false;
bIsMouseOverTitle = false;
bIsMouseOverContent = false;
Refresh();
}
protected override void OnMouseMove(MouseEventArgs mea)
{
base.OnMouseMove(mea);
bool bContentModified = false;
if ( (mea.X > CloseBitmapLocation.X) && (mea.X < CloseBitmapLocation.X + CloseBitmapSize.Width) && (mea.Y > CloseBitmapLocation.Y) && (mea.Y < CloseBitmapLocation.Y + CloseBitmapSize.Height) && CloseClickable )
{
if (!bIsMouseOverClose)
{
bIsMouseOverClose = true;
bIsMouseOverTitle = false;
bIsMouseOverContent = false;
Cursor = Cursors.Hand;
bContentModified = true;
}
}
else if (RealContentRectangle.Contains(new Point(mea.X, mea.Y)) && ContentClickable)
{
if (!bIsMouseOverContent)
{
bIsMouseOverClose = false;
bIsMouseOverTitle = false;
bIsMouseOverContent = true;
Cursor = Cursors.Hand;
bContentModified = true;
}
}
else if (RealTitleRectangle.Contains(new Point(mea.X, mea.Y)) && TitleClickable)
{
if (!bIsMouseOverTitle)
{
bIsMouseOverClose = false;
bIsMouseOverTitle = true;
bIsMouseOverContent = false;
Cursor = Cursors.Hand;
bContentModified = true;
}
}
else
{
if (bIsMouseOverClose || bIsMouseOverTitle || bIsMouseOverContent)
bContentModified = true;
bIsMouseOverClose = false;
bIsMouseOverTitle = false;
bIsMouseOverContent = false;
Cursor = Cursors.Default;
}
if (bContentModified)
Refresh();
}
protected override void OnMouseDown(MouseEventArgs mea)
{
base.OnMouseDown(mea);
bIsMouseDown = true;
if (bIsMouseOverClose)
Refresh();
}
protected override void OnMouseUp(MouseEventArgs mea)
{
base.OnMouseUp(mea);
bIsMouseDown = false;
if (bIsMouseOverClose)
{
Hide();
if (CloseClick != null)
CloseClick(this, new EventArgs());
}
else if (bIsMouseOverTitle)
{
if (TitleClick != null)
TitleClick(this, new EventArgs());
}
else if (bIsMouseOverContent)
{
if (ContentClick != null)
ContentClick(this, new EventArgs());
}
}
protected override void OnPaintBackground(PaintEventArgs pea)
{
Graphics grfx = pea.Graphics;
grfx.PageUnit = GraphicsUnit.Pixel;
Graphics offScreenGraphics;
Bitmap offscreenBitmap;
offscreenBitmap = new Bitmap(BackgroundBitmap.Width, BackgroundBitmap.Height);
offScreenGraphics = Graphics.FromImage(offscreenBitmap);
if (BackgroundBitmap != null)
{
offScreenGraphics.DrawImage(BackgroundBitmap, 0, 0, BackgroundBitmap.Width, BackgroundBitmap.Height);
}
DrawCloseButton(offScreenGraphics);
DrawText(offScreenGraphics);
grfx.DrawImage(offscreenBitmap, 0, 0);
}
#endregion
private void InitializeComponent()
{
this.SuspendLayout();
//
// TaskbarNotifier
//
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Name = "TaskbarNotifier";
this.ResumeLayout(false);
}
}
}
第三步,调用:
1,在您需要显示的窗体里面添加一个定时器,
代码如下:
private System.Windows.Forms.Timer timer1;
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
在构造函数里面添加代码:
#region if (!this.DesignMode) { timer1.Enabled = true; timer1.Interval = 10000; } #endregion
2,初始化TaskbarNotifier
代码如下:
#region 初始化弹窗
taskbarNotifier.SetBackgroundBitmap(MytaskbarNotifier.Properties.Resources.skin3, Color.FromArgb(255, 0, 255));
taskbarNotifier.SetCloseBitmap(MytaskbarNotifier.Properties.Resources.close, Color.FromArgb(255, 0, 255), new Point(280, 57));
taskbarNotifier.TitleRectangle = new Rectangle(150, 57, 125, 28);
taskbarNotifier.ContentRectangle = new Rectangle(75, 92, 215, 55);
taskbarNotifier.CloseClickable = true;
taskbarNotifier.TitleClickable = false;
taskbarNotifier.ContentClickable = true;
taskbarNotifier.EnableSelectionRectangle = true;
taskbarNotifier.KeepVisibleOnMousOver = true;
taskbarNotifier.ReShowOnMouseOver = false;
taskbarNotifier.ContentClick += new EventHandler(taskbarNotifier_ContentClick);
#endregion
void taskbarNotifier_ContentClick(object sender, EventArgs e) { return;//暂时不用此功能 }
3
显示代码实习:
/// <summary>
/// 逐条显示消息
/// </summary>
/// <param name="dsMessage"></param>
private void DisplayMessage(DataRow dsMessage)
{
try
{
Int32 msgID = Convert.ToInt32(dsMessage[0].ToString());
string msgTitle = dsMessage[1].ToString();
string msgContent = dsMessage[2].ToString();
string msgPublisherCode = dsMessage[3].ToString();
string msgPublisherName = dsMessage[4].ToString();
DateTime msgPublishTime = Convert.ToDateTime(dsMessage[5].ToString());
string msgLimitedArea = dsMessage[6].ToString();
string msgIsValid = dsMessage[7].ToString();
string msgExtend1 = dsMessage[8].ToString();
string msgExtend2 = dsMessage[9].ToString();
string msgExtend3 = dsMessage[10].ToString();
string msgRoleArea = dsMessage[11].ToString();
string displayTitle = msgTitle;
string displayContent = msgContent + "\n\r" + msgPublisherName + "[" + msgPublisherCode + "]" + msgPublishTime;
taskbarNotifier.Show(displayTitle, displayContent, 500, delayTime, 500);
System.Threading.Thread.Sleep(500);
this.timer1.Start();
}
catch
{
this.timer1.Stop();
}
}
实现定时器事件代码:
decimal validTime = 1m; //系统消息有效时间
int refreshTime = 5000; //刷新数据库时间
int delayTime = 5000; //提示窗口停留时间
int intervalTime = 10000; //间隔显示时间
DataSet dsMessage = new DataSet();
/// <summary>
/// Timer
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
try
{
this.timer1.Stop();
if (dsMessage == null || dsMessage.Tables.Count == 0 || dsMessage.Tables[0].Rows.Count == 0)
{
// 获取系统消息按照权限获取要显示的消息table
//todo sql实现
SELECT COM_SYS_MSG.MSG_ID, COM_SYS_MSG.MSG_TITLE, COM_SYS_MSG.MSG_CONTENT, COM_SYS_MSG.PUBLISHER, (SELECT COM_EMPLOYEE.EMPL_NAME FROM COM_EMPLOYEE WHERE COM_EMPLOYEE.EMPL_CODE = COM_SYS_MSG.PUBLISHER) empl_name, COM_SYS_MSG.PUBLISH_TIME, COM_SYS_MSG.LIMITED_AREA, COM_SYS_MSG.IS_VALID, COM_SYS_MSG.EXTEND1, COM_SYS_MSG.EXTEND2, COM_SYS_MSG.EXTEND3, COM_SYS_MSG.ROLE_AREA FROM COM_SYS_MSG WHERE COM_SYS_MSG.LIMITED_AREA = 'ALL' AND (COM_SYS_MSG.ROLE_AREA = '{2}' or '{1}'='ALL') AND COM_SYS_MSG.IS_VALID = '1' and (COM_SYS_MSG.Extend2='{1}' or '{1}'='ALL') AND COM_SYS_MSG.PUBLISH_TIME>= ( SELECT COM_IP_MSG.LAST_VIEW_TIME FROM COM_IP_MSG WHERE COM_IP_MSG.IP_ADDRESS = '{0}') ORDER BY COM_SYS_MSG.PUBLISH_TIME
}
if (dsMessage != null && dsMessage.Tables[0].Rows.Count > 0)
{
if (dsMessage.Tables[0].Rows.Count == 1)
{
//只剩最后一条时
DateTime msgPublishTime = msgPublishTime = Convert.ToDateTime(dsMessage.Tables[0].Rows[0][5].ToString());
this.UpdateViewTime(msgPublishTime);//更新时间
//
//UPDATE com_ip_msg
//SET com_ip_msg.LAST_VIEW_TIME = to_date('{1}','yyyy-mm-dd hh24:mi:ss')
//WHERE com_ip_msg.IP_ADDRESS = '{0}'
this.timer1.Interval = refreshTime;
}
else
{
this.timer1.Interval = intervalTime;
}
this.DisplayMessage(dsMessage.Tables[0].Rows[0]);
dsMessage.Tables[0].Rows.RemoveAt(0); this.timer1.Start();
}
else
{
this.timer1.Start();
}
} catch {
this.timer1.Stop();
}
}
整理完毕。