11 using System.Windows.Forms;
13 using System.Drawing.Drawing2D;
20 internal class PopupNotifierForm :
System.Windows.Forms.Form
25 public event EventHandler LinkClick;
30 public event EventHandler CloseClick;
32 internal event EventHandler ContextMenuOpened;
33 internal event EventHandler ContextMenuClosed;
35 private bool mouseOnClose =
false;
36 private bool mouseOnLink =
false;
37 private bool mouseOnOptions =
false;
38 private int heightOfTitle;
42 private bool gdiInitialized =
false;
43 private Rectangle rcBody;
44 private Rectangle rcHeader;
45 private Rectangle rcForm;
46 private LinearGradientBrush brushBody;
47 private LinearGradientBrush brushHeader;
48 private Brush brushButtonHover;
49 private Pen penButtonBorder;
50 private Pen penContent;
51 private Pen penBorder;
52 private Brush brushForeColor;
53 private Brush brushLinkHover;
54 private Brush brushContent;
55 private Brush brushTitle;
63 public PopupNotifierForm(PopupNotifier parent)
66 this.SetStyle(ControlStyles.OptimizedDoubleBuffer,
true);
67 this.SetStyle(ControlStyles.ResizeRedraw,
true);
68 this.SetStyle(ControlStyles.AllPaintingInWmPaint,
true);
69 this.ShowInTaskbar =
false;
71 this.VisibleChanged +=
new EventHandler(PopupNotifierForm_VisibleChanged);
72 this.MouseMove +=
new MouseEventHandler(PopupNotifierForm_MouseMove);
73 this.MouseUp +=
new MouseEventHandler(PopupNotifierForm_MouseUp);
74 this.Paint +=
new PaintEventHandler(PopupNotifierForm_Paint);
82 private void PopupNotifierForm_VisibleChanged(
object sender, EventArgs e)
88 mouseOnOptions =
false;
95 private void InitializeComponent()
98 this.ClientSize =
new System.Drawing.Size(392, 66);
99 this.FormBorderStyle =
System.Windows.Forms.FormBorderStyle.None;
100 this.Name =
"PopupNotifierForm";
101 this.StartPosition =
System.Windows.Forms.FormStartPosition.Manual;
103 this.ResumeLayout(
false);
109 public new PopupNotifier Parent {
get;
set; }
117 private int AddValueMax255(
int input,
int add)
119 return (input + add < 256) ? input + add : 255;
128 private int DedValueMin0(
int input,
int ded)
130 return (input - ded > 0) ? input - ded : 0;
138 private Color GetDarkerColor(Color color)
140 return System.Drawing.Color.FromArgb(255, DedValueMin0((
int)color.R, Parent.GradientPower), DedValueMin0((
int)color.G, Parent.GradientPower), DedValueMin0((
int)color.B, Parent.GradientPower));
148 private Color GetLighterColor(Color color)
150 return System.Drawing.Color.FromArgb(255, AddValueMax255((
int)color.R, Parent.GradientPower), AddValueMax255((
int)color.G, Parent.GradientPower), AddValueMax255((
int)color.B, Parent.GradientPower));
156 private RectangleF RectContentText
160 if (Parent.Image != null)
162 return new RectangleF(
163 Parent.ImagePadding.Left + Parent.ImageSize.Width + Parent.ImagePadding.Right + Parent.ContentPadding.Left,
164 Parent.HeaderHeight + Parent.TitlePadding.Top + heightOfTitle + Parent.TitlePadding.Bottom + Parent.ContentPadding.Top,
165 this.Width - Parent.ImagePadding.Left - Parent.ImageSize.Width - Parent.ImagePadding.Right - Parent.ContentPadding.Left - Parent.ContentPadding.Right - 16 - 5,
166 this.Height - Parent.HeaderHeight - Parent.TitlePadding.Top - heightOfTitle - Parent.TitlePadding.Bottom - Parent.ContentPadding.Top - Parent.ContentPadding.Bottom - 1);
170 return new RectangleF(
171 Parent.ContentPadding.Left,
172 Parent.HeaderHeight + Parent.TitlePadding.Top + heightOfTitle + Parent.TitlePadding.Bottom + Parent.ContentPadding.Top,
173 this.Width - Parent.ContentPadding.Left - Parent.ContentPadding.Right - 16 - 5,
174 this.Height - Parent.HeaderHeight - Parent.TitlePadding.Top - heightOfTitle - Parent.TitlePadding.Bottom - Parent.ContentPadding.Top - Parent.ContentPadding.Bottom - 1);
182 private Rectangle RectClose
184 get {
return new Rectangle(this.Width - 5 - 16, Parent.HeaderHeight + 3, 16, 16); }
190 private Rectangle RectOptions
192 get {
return new Rectangle(this.Width - 5 - 16, Parent.HeaderHeight + 3 + 16 + 5, 16, 16); }
200 private void PopupNotifierForm_MouseMove(
object sender, MouseEventArgs e)
202 if (Parent.ShowCloseButton)
204 mouseOnClose = RectClose.Contains(e.X, e.Y);
206 if (Parent.ShowOptionsButton)
208 mouseOnOptions = RectOptions.Contains(e.X, e.Y);
210 mouseOnLink = RectContentText.Contains(e.X, e.Y);
219 private void PopupNotifierForm_MouseUp(
object sender, MouseEventArgs e)
221 if (e.Button ==
System.Windows.Forms.MouseButtons.Left)
223 if (RectClose.Contains(e.X, e.Y) && (CloseClick != null))
225 CloseClick(
this, EventArgs.Empty);
227 if (RectContentText.Contains(e.X, e.Y) && (LinkClick != null))
229 LinkClick(
this, EventArgs.Empty);
231 if (RectOptions.Contains(e.X, e.Y) && (Parent.OptionsMenu != null))
233 if (ContextMenuOpened != null)
235 ContextMenuOpened(
this, EventArgs.Empty);
237 Parent.OptionsMenu.Show(
this,
new Point(RectOptions.Right - Parent.OptionsMenu.Width, RectOptions.Bottom));
238 Parent.OptionsMenu.Closed +=
new ToolStripDropDownClosedEventHandler(OptionsMenu_Closed);
248 private void OptionsMenu_Closed(
object sender, ToolStripDropDownClosedEventArgs e)
250 Parent.OptionsMenu.Closed -=
new ToolStripDropDownClosedEventHandler(OptionsMenu_Closed);
252 if (ContextMenuClosed != null)
254 ContextMenuClosed(
this, EventArgs.Empty);
261 private void AllocateGDIObjects()
263 rcBody =
new Rectangle(0, 0, this.Width, this.Height);
264 rcHeader =
new Rectangle(0, 0, this.Width, Parent.HeaderHeight);
265 rcForm =
new Rectangle(0, 0, this.Width - 1, this.Height - 1);
267 brushBody =
new LinearGradientBrush(rcBody, Parent.BodyColor, GetLighterColor(Parent.BodyColor), LinearGradientMode.Vertical);
268 brushHeader =
new LinearGradientBrush(rcHeader, Parent.HeaderColor, GetDarkerColor(Parent.HeaderColor), LinearGradientMode.Vertical);
269 brushButtonHover =
new SolidBrush(Parent.ButtonHoverColor);
270 penButtonBorder =
new Pen(Parent.ButtonBorderColor);
271 penContent =
new Pen(Parent.ContentColor, 2);
272 penBorder =
new Pen(Parent.BorderColor);
273 brushForeColor =
new SolidBrush(ForeColor);
274 brushLinkHover =
new SolidBrush(Parent.ContentHoverColor);
275 brushContent =
new SolidBrush(Parent.ContentColor);
276 brushTitle =
new SolidBrush(Parent.TitleColor);
278 gdiInitialized =
true;
284 private void DisposeGDIObjects()
289 brushHeader.Dispose();
290 brushButtonHover.Dispose();
291 penButtonBorder.Dispose();
292 penContent.Dispose();
294 brushForeColor.Dispose();
295 brushLinkHover.Dispose();
296 brushContent.Dispose();
297 brushTitle.Dispose();
306 private void PopupNotifierForm_Paint(
object sender, PaintEventArgs e)
310 AllocateGDIObjects();
314 e.Graphics.FillRectangle(brushBody, rcBody);
315 e.Graphics.FillRectangle(brushHeader, rcHeader);
316 e.Graphics.DrawRectangle(penBorder, rcForm);
319 e.Graphics.DrawImage(Properties.Resources.Grip, (
int)((
this.Width - Properties.Resources.Grip.Width) / 2), (
int)((Parent.HeaderHeight - 3) / 2));
321 if (Parent.ShowCloseButton)
325 e.Graphics.FillRectangle(brushButtonHover, RectClose);
326 e.Graphics.DrawRectangle(penButtonBorder, RectClose);
328 e.Graphics.DrawLine(penContent, RectClose.Left + 4, RectClose.Top + 4, RectClose.Right - 4, RectClose.Bottom - 4);
329 e.Graphics.DrawLine(penContent, RectClose.Left + 4, RectClose.Bottom - 4, RectClose.Right - 4, RectClose.Top + 4);
331 if (Parent.ShowOptionsButton)
335 e.Graphics.FillRectangle(brushButtonHover, RectOptions);
336 e.Graphics.DrawRectangle(penButtonBorder, RectOptions);
338 e.Graphics.FillPolygon(brushForeColor,
new Point[] {
new Point(RectOptions.Left + 4, RectOptions.Top + 6),
new Point(RectOptions.Left + 12, RectOptions.Top + 6),
new Point(RectOptions.Left + 8, RectOptions.Top + 4 + 6) });
342 if (Parent.Image != null)
344 e.Graphics.DrawImage(Parent.Image, Parent.ImagePadding.Left, Parent.HeaderHeight + Parent.ImagePadding.Top, Parent.ImageSize.Width, Parent.ImageSize.Height);
348 heightOfTitle = (int)e.Graphics.MeasureString(
"A", Parent.TitleFont).Height;
349 int titleX = Parent.TitlePadding.Left;
350 if (Parent.Image != null)
352 titleX += Parent.ImagePadding.Left + Parent.ImageSize.Width + Parent.ImagePadding.Right;
356 e.Graphics.DrawString(Parent.TitleText, Parent.TitleFont, brushTitle, titleX, Parent.HeaderHeight + Parent.TitlePadding.Top);
359 this.Cursor = mouseOnLink ? Cursors.Hand : Cursors.Default;
360 Brush brushText = mouseOnLink ? brushLinkHover : brushContent;
361 e.Graphics.DrawString(Parent.ContentText, Parent.ContentFont, brushText, RectContentText);
368 protected override void Dispose(
bool disposing)
374 base.Dispose(disposing);