📄 notifywindow.cs
字号:
}
// Next draw borders...
drawBorder (e.Graphics);
}
protected virtual void drawBorder (Graphics fx)
{
fx.DrawRectangle (Pens.Silver, 2, 2, Width - 4, ActualHeight - 4);
// Top border
fx.DrawLine (Pens.Silver, 0, 0, Width, 0);
fx.DrawLine (Pens.White, 0, 1, Width, 1);
fx.DrawLine (Pens.DarkGray, 3, 3, Width - 4, 3);
fx.DrawLine (Pens.DimGray, 4, 4, Width - 5, 4);
// Left border
fx.DrawLine (Pens.Silver, 0, 0, 0, ActualHeight);
fx.DrawLine (Pens.White, 1, 1, 1, ActualHeight);
fx.DrawLine (Pens.DarkGray, 3, 3, 3, ActualHeight - 4);
fx.DrawLine (Pens.DimGray, 4, 4, 4, ActualHeight - 5);
// Bottom border
fx.DrawLine (Pens.DarkGray, 1, ActualHeight - 1, Width - 1, ActualHeight - 1);
fx.DrawLine (Pens.White, 3, ActualHeight - 3, Width - 3, ActualHeight - 3);
fx.DrawLine (Pens.Silver, 4, ActualHeight - 4, Width - 4, ActualHeight - 4);
// Right border
fx.DrawLine (Pens.DarkGray, Width - 1, 1, Width - 1, ActualHeight - 1);
fx.DrawLine (Pens.White, Width - 3, 3, Width - 3, ActualHeight - 3);
fx.DrawLine (Pens.Silver, Width - 4, 4, Width - 4, ActualHeight - 4);
}
protected virtual void drawCloseButton (Graphics fx)
{
if (visualStylesEnabled())
drawThemeCloseButton (fx);
else
drawLegacyCloseButton (fx);
}
/// <summary>
/// Draw a Windows XP style close button.
/// </summary>
protected void drawThemeCloseButton (Graphics fx)
{
IntPtr hTheme = OpenThemeData (Handle, "Window");
if (hTheme == IntPtr.Zero)
{
drawLegacyCloseButton (fx);
return;
}
int stateId;
if (closePressed)
stateId = CBS_PUSHED;
else if (closeHot)
stateId = CBS_HOT;
else
stateId = CBS_NORMAL;
RECT reClose = new RECT (rClose);
RECT reClip = reClose; // should fx.VisibleClipBounds be used here?
IntPtr hDC = fx.GetHdc();
DrawThemeBackground (hTheme, hDC, WP_CLOSEBUTTON, stateId, ref reClose, ref reClip);
fx.ReleaseHdc (hDC);
CloseThemeData (hTheme);
}
/// <summary>
/// Draw a Windows 95 style close button.
/// </summary>
protected void drawLegacyCloseButton (Graphics fx)
{
ButtonState bState;
if (closePressed)
bState = ButtonState.Pushed;
else // the Windows 95 theme doesn't have a "hot" button
bState = ButtonState.Normal;
ControlPaint.DrawCaptionButton (fx, rClose, CaptionButton.Close, bState);
}
/// <summary>
/// Determine whether or not XP Visual Styles are active. Compatible with pre-UxTheme.dll versions of Windows.
/// </summary>
protected bool visualStylesEnabled()
{
try
{
if (IsThemeActive() == 1)
return true;
else
return false;
}
catch (System.DllNotFoundException) // pre-XP systems which don't have UxTheme.dll
{
return false;
}
}
#endregion
#region Timers and EventHandlers
protected void viewTimer (object sender, System.EventArgs e)
{
switch (ClockState)
{
case ClockStates.Opening:
if (Top - 2 <= rScreen.Height - ActualHeight)
{
Top = rScreen.Height - ActualHeight;
Height = ActualHeight;
ClockState = ClockStates.Showing;
viewClock.Interval = WaitTime;
}
else
{
Top -= 2;
Height += 2;
}
break;
case ClockStates.Showing:
if (!WaitOnMouseOver || !rGlobDisplay.Contains(Cursor.Position))
{
viewClock.Interval = 1;
ClockState = ClockStates.Closing;
}
break;
case ClockStates.Closing:
Top += 2;
Height -= 2;
if (Top >= rScreen.Height)
{
ClockState = ClockStates.None;
viewClock.Stop();
viewClock.Dispose();
Close();
}
break;
}
}
protected override void OnMouseMove (System.Windows.Forms.MouseEventArgs e)
{
if (Title != null && rGlobTitle.Contains (Cursor.Position) && !textPressed && !closePressed)
{
Cursor = Cursors.Hand;
titleHot = true;
textHot = false; closeHot = false;
Invalidate();
}
else if (rGlobText.Contains (Cursor.Position) && !titlePressed && !closePressed)
{
Cursor = Cursors.Hand;
textHot = true;
titleHot = false; closeHot = false;
Invalidate();
}
else if (rGlobClose.Contains (Cursor.Position) && !titlePressed && !textPressed)
{
Cursor = Cursors.Hand;
closeHot = true;
titleHot = false; textHot = false;
Invalidate();
}
else if ((textHot || titleHot || closeHot) && (!titlePressed && !textPressed && !closePressed))
{
Cursor = Cursors.Default;
titleHot = false; textHot = false; closeHot = false;
Invalidate();
}
base.OnMouseMove (e);
}
protected override void OnMouseDown (System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (rGlobClose.Contains (Cursor.Position))
{
closePressed = true;
closeHot = false;
Invalidate();
}
else if (rGlobText.Contains (Cursor.Position))
{
textPressed = true;
Invalidate();
}
else if (Title != null && rGlobTitle.Contains (Cursor.Position))
{
titlePressed = true;
Invalidate();
}
}
base.OnMouseDown (e);
}
protected override void OnMouseUp (System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (closePressed)
{
Cursor = Cursors.Default;
closePressed = false;
closeHot = false;
Invalidate();
if (rGlobClose.Contains (Cursor.Position))
Close();
}
else if (textPressed)
{
Cursor = Cursors.Default;
textPressed = false;
textHot = false;
Invalidate();
if (rGlobText.Contains (Cursor.Position))
{
Close();
if (TextClicked != null)
TextClicked (this, new System.EventArgs());
}
}
else if (titlePressed)
{
Cursor = Cursors.Default;
titlePressed = false;
titleHot = false;
Invalidate();
if (rGlobTitle.Contains (Cursor.Position))
{
Close();
if (TitleClicked != null)
TitleClicked (this, new System.EventArgs());
}
}
}
base.OnMouseUp (e);
}
#endregion
#region P/Invoke
// DrawThemeBackground()
protected const Int32 WP_CLOSEBUTTON = 18;
protected const Int32 CBS_NORMAL = 1;
protected const Int32 CBS_HOT = 2;
protected const Int32 CBS_PUSHED = 3;
[StructLayout (LayoutKind.Explicit)]
protected struct RECT
{
[FieldOffset (0)] public Int32 Left;
[FieldOffset (4)] public Int32 Top;
[FieldOffset (8)] public Int32 Right;
[FieldOffset (12)] public Int32 Bottom;
public RECT (System.Drawing.Rectangle bounds)
{
Left = bounds.Left;
Top = bounds.Top;
Right = bounds.Right;
Bottom = bounds.Bottom;
}
}
// SetWindowPos()
protected const Int32 HWND_TOPMOST = -1;
protected const Int32 SWP_NOACTIVATE = 0x0010;
// ShowWindow()
protected const Int32 SW_SHOWNOACTIVATE = 4;
// UxTheme.dll
[DllImport ("UxTheme.dll")]
protected static extern Int32 IsThemeActive();
[DllImport ("UxTheme.dll")]
protected static extern IntPtr OpenThemeData (IntPtr hWnd, [MarshalAs (UnmanagedType.LPTStr)] string classList);
[DllImport ("UxTheme.dll")]
protected static extern void CloseThemeData (IntPtr hTheme);
[DllImport ("UxTheme.dll")]
protected static extern void DrawThemeBackground (IntPtr hTheme, IntPtr hDC, Int32 partId, Int32 stateId, ref RECT rect, ref RECT clipRect);
// user32.dll
[DllImport ("user32.dll")]
protected static extern bool ShowWindow (IntPtr hWnd, Int32 flags);
[DllImport ("user32.dll")]
protected static extern bool SetWindowPos (IntPtr hWnd, Int32 hWndInsertAfter, Int32 X, Int32 Y, Int32 cx, Int32 cy, uint uFlags);
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -