1 using System;
2 using System.Collections.Generic;
3 using System.Windows.Forms;
4 using System.ComponentModel;
5 using System.Drawing;
6 using System.Drawing.Drawing2D;
7 using System.Runtime.InteropServices;
8 using System.Diagnostics;
9
10 namespace CaptionBox {
11 public class ThemeForm : Form {
12 #region private structs
13
14 struct _NonClientSizeInfo {
15 public Size CaptionButtonSize;
16 public Size BorderSize;
17 public int CaptionHeight;
18 public Rectangle CaptionRect;
19 public Rectangle Rect;
20 public Rectangle ClientRect;
21 public int Width;
22 public int Height;
23 };
24
25 #endregion
26
27 #region constants
28
29 const int WM_NCACTIVATE = 0x86;
30 const int WM_NCPAINT = 0x85;
31 const int WM_NCLBUTTONDOWN = 0xA1;
32 const int WM_NCRBUTTONDOWN = 0x00A4;
33 const int WM_NCRBUTTONUP = 0x00A5;
34 const int WM_NCMOUSEMOVE = 0x00A0;
35 const int WM_NCLBUTTONUP = 0x00A2;
36 const int WM_NCCALCSIZE = 0x0083;
37 const int WM_NCMOUSEHOVER = 0x02A0;
38 const int WM_NCMOUSELEAVE = 0x02A2;
39 const int WM_NCHITTEST = 0x0084;
40 const int WM_NCCREATE = 0x0081;
41 //const int WM_RBUTTONUP = 0x0205;
42
43 const int WM_LBUTTONDOWN = 0x0201;
44 const int WM_CAPTURECHANGED = 0x0215;
45 const int WM_LBUTTONUP = 0x0202;
46 const int WM_SETCURSOR = 0x0020;
47 const int WM_CLOSE = 0x0010;
48 const int WM_SYSCOMMAND = 0x0112;
49 const int WM_MOUSEMOVE = 0x0200;
50 const int WM_SIZE = 0x0005;
51 const int WM_SIZING = 0x0214;
52 const int WM_GETMINMAXINFO = 0x0024;
53 const int WM_ENTERSIZEMOVE = 0x0231;
54 const int WM_WINDOWPOSCHANGING = 0x0046;
55
56 // FOR WM_SIZING MSG WPARAM
57 const int WMSZ_BOTTOM = 6;
58 const int WMSZ_BOTTOMLEFT = 7;
59 const int WMSZ_BOTTOMRIGHT = 8;
60 const int WMSZ_LEFT = 1;
61 const int WMSZ_RIGHT = 2;
62 const int WMSZ_TOP = 3;
63 const int WMSZ_TOPLEFT = 4;
64 const int WMSZ_TOPRIGHT = 5;
65
66 // left mouse button is down.
67 const int MK_LBUTTON = 0x0001;
68
69 const int SC_CLOSE = 0xF060;
70 const int SC_MAXIMIZE = 0xF030;
71 const int SC_MINIMIZE = 0xF020;
72 const int SC_RESTORE = 0xF120;
73 const int SC_CONTEXTHELP = 0xF180;
74
75 const int HTCAPTION = 2;
76 const int HTCLOSE = 20;
77 const int HTHELP = 21;
78 const int HTMAXBUTTON = 9;
79 const int HTMINBUTTON = 8;
80 const int HTTOP = 12;
81
82 const int SM_CYBORDER = 6;
83 const int SM_CXBORDER = 5;
84 const int SM_CYCAPTION = 4;
85
86 const int CS_DropSHADOW = 0x20000;
87 const int GCL_STYLE = (-26);
88
89 #endregion
90
91 #region windows api
92
93 [DllImport("User32.dll")]
94 private static extern IntPtr GetWindowDC(IntPtr hwnd);
95 [DllImport("User32.dll")]
96 [return: MarshalAs(UnmanagedType.Bool)]
97 private static extern bool GetWindowRect(IntPtr hwnd, ref _RECT rect);
98 [DllImport("User32.dll")]
99 private static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
100
101 [DllImport("user32.dll", CharSet = CharSet.Auto)]
102 public static extern int SetClassLong(IntPtr hwnd, int nIndex, int dwNewLong);
103 [DllImport("user32.dll", CharSet = CharSet.Auto)]
104 public static extern int GetClassLong(IntPtr hwnd, int nIndex);
105
106 #endregion
107
108 #region default constructor
109
110 public ThemeForm() {
111 Text = "ThemeForm1";
112 CloseButtonImage = Properties.Resources.close.ToBitmap();
113 CloseButtonHoverImage = Properties.Resources.close2.ToBitmap();
114 CloseButtonPressDownImage = Properties.Resources.close2.ToBitmap();
115
116 MaximumButtonImage = Properties.Resources.max.ToBitmap();
117 MaximumButtonHoverImage = Properties.Resources.max2.ToBitmap();
118 MaximumButtonPressDownImage = Properties.Resources.max2.ToBitmap();
119
120 MaximumNormalButtonImage = Properties.Resources.maxnorm.ToBitmap();
121 MaximumNormalButtonHoverImage = Properties.Resources.maxnorm2.ToBitmap();
122 MaximumNormalButtonPressDownImage = Properties.Resources.maxnorm2.ToBitmap();
123
124 MinimumButtonImage = Properties.Resources.min.ToBitmap();
125 MinimumButtonHoverImage = Properties.Resources.min2.ToBitmap();
126 MinimumButtonPressDownImage = Properties.Resources.min2.ToBitmap();
127
128 HelpButtonImage = Properties.Resources.help.ToBitmap();
129 HelpButtonHoverImage = Properties.Resources.help2.ToBitmap();
130 HelpButtonPressDownImage = Properties.Resources.help2.ToBitmap();
131 CaptionColor = Brushes.White;
132 CaptionBackgroundColor = Color.DimGray;
133
134 SetClassLong(this.Handle, GCL_STYLE, GetClassLong(this.Handle, GCL_STYLE) | CS_DropSHADOW); //API函数加载,实现窗体边框阴影效果
135 }
136
137 #endregion
138
139 [DefaultValue("")]
140 [Browsable(true)]
141 [Category("ControlBox")]
142 public virtual ContextMenuStrip CaptionContextMenu { get; set; }
143
144 protected virtual void OnCaptionContextMenu(int x, int y) {
145 if (this.CaptionContextMenu != null)
146 this.CaptionContextMenu.Show(x, y);
147 }
148
149 #region properties
150
151 [Category("ControlBox")]
152 [Description("Close button image in control box.")]
153 [DisplayName("CloseButtonImage")]
154 [DesignOnly(true)]
155 public Image CloseButtonImage { get; set; }
156
157 [Category("ControlBox")]
158 [Description("Close button image pressed down in control box.")]
159 [DisplayName("CloseButtonPressDownImage")]
160 [DesignOnly(true)]
161 public Image CloseButtonPressDownImage { get; set; }
162
163 [Category("ControlBox")]
164 [Description("Close button image hover in control box.")]
165 [DisplayName("CloseButtonHoverImage")]
166 [DesignOnly(true)]
167 public Image CloseButtonHoverImage { get; set; }
168
169 [Category("ControlBox")]
170 [Description("Maximum button image in control box.")]
171 [DisplayName("MaximumButtonImage")]
172 [DesignOnly(true)]
173 public Image MaximumButtonImage { get; set; }
174
175 [Category("ControlBox")]
176 [Description("Maximum button hover image in control box.")]
177 [DisplayName("MaximumButtonHoverImage")]
178 [DesignOnly(true)]
179 public Image MaximumButtonHoverImage { get; set; }
180
181 [Category("ControlBox")]
182 [Description("Maximum button pressed down image in control box.")]
183 [DisplayName("MaximumButtonPressDownImage")]
184 [DesignOnly(true)]
185 public Image MaximumButtonPressDownImage { get; set; }
186
187 [Category("ControlBox")]
188 [Description("Maximum Normal button image in control box.")]
189 [DisplayName("MaximumNormalButtonImage")]
190 [DesignOnly(true)]
191 public Image MaximumNormalButtonImage { get; set; }
192
193 [Category("ControlBox")]
194 [Description("Maximum Normal button hover image in control box.")]
195 [DisplayName("MaximumNormalButtonHoverImage")]
196 [DesignOnly(true)]
197 public Image MaximumNormalButtonHoverImage { get; set; }
198
199 [Category("ControlBox")]
200 [Description("Maximum Normal button pressed down image in control box.")]
201 [DisplayName("MaximumNormalButtonPressDownImage")]
202 [DesignOnly(true)]
203 public Image MaximumNormalButtonPressDownImage { get; set; }
204
205 [Category("ControlBox")]
206 [Description("Minimum button image in control box.")]
207 [DisplayName("MinimumButtonImage")]
208 [DesignOnly(true)]
209 public Image MinimumButtonImage { get; set; }
210
211 [Category("ControlBox")]
212 [Description("Minimum button hover image in control box.")]
213 [DisplayName("MinimumButtonHoverImage")]
214 [DesignOnly(true)]
215 public Image MinimumButtonHoverImage { get; set; }
216
217 [Category("ControlBox")]
218 [Description("Minimum button pressed down image in control box.")]
219 [DisplayName("MinimumButtonPressDownImage")]
220 [DesignOnly(true)]
221 public Image MinimumButtonPressDownImage { get; set; }
222
223 [Category("ControlBox")]
224 [Description("Help button image in control box.")]
225 [DisplayName("HelpButtonImage")]
226 [DesignOnly(true)]
227 public Image HelpButtonImage { get; set; }
228
229 [Category("ControlBox")]
230 [Description("Help button hover image in control box.")]
231 [DisplayName("HelpButtonHoverImage")]
232 [DesignOnly(true)]
233 public Image HelpButtonHoverImage { get; set; }
234
235 [Category("ControlBox")]
236 [Description("Help button pressed down image in control box.")]
237 [DisplayName("HelpButtonPressDownImage")]
238 [DesignOnly(true)]
239 public Image HelpButtonPressDownImage { get; set; }
240
241 [Category("CaptionColor")]
242 [Description("The color of caption.")]
243 [DisplayName("CaptionColor")]
244 [DesignOnly(true)]
245 public Brush CaptionColor { get; set; }
246
247 [Category("CaptionColor")]
248 [Description("The color of caption.")]
249 [DisplayName("CaptionBackgroundColor")]
250 [DefaultValue(typeof(Color), "Black")]
251 [DesignOnly(true)]
252 public Color CaptionBackgroundColor { get; set; }
253
254 #endregion
255
256 #region help methods
257
258 private _NonClientSizeInfo GetNonClientInfo(IntPtr hwnd) {
259 _NonClientSizeInfo info = new _NonClientSizeInfo();
260 info.CaptionButtonSize = SystemInformation.CaptionButtonSize;
261 info.CaptionHeight = SystemInformation.CaptionHeight;
262
263 switch (this.FormBorderStyle) {
264 case System.Windows.Forms.FormBorderStyle.Fixed3D:
265 info.BorderSize = SystemInformation.FixedFrameBorderSize;
266 break;
267 case System.Windows.Forms.FormBorderStyle.FixedDialog:
268 info.BorderSize = SystemInformation.FixedFrameBorderSize;
269 break;
270 case System.Windows.Forms.FormBorderStyle.FixedSingle:
271 info.BorderSize = SystemInformation.FixedFrameBorderSize;
272 break;
273 case System.Windows.Forms.FormBorderStyle.FixedToolWindow:
274 info.BorderSize = SystemInformation.FixedFrameBorderSize;
275 info.CaptionButtonSize = SystemInformation.ToolWindowCaptionButtonSize;
276 info.CaptionHeight = SystemInformation.ToolWindowCaptionHeight;
277 break;
278 case System.Windows.Forms.FormBorderStyle.Sizable:
279 info.BorderSize = SystemInformation.FrameBorderSize;
280 break;
281 case System.Windows.Forms.FormBorderStyle.SizableToolWindow:
282 info.CaptionButtonSize = SystemInformation.ToolWindowCaptionButtonSize;
283 info.BorderSize = SystemInformation.FrameBorderSize;
284 info.CaptionHeight = SystemInformation.ToolWindowCaptionHeight;
285 break;
286 default:
287 info.BorderSize = SystemInformation.BorderSize;
288 break;
289 }
290
291 _RECT areatRect = new _RECT();
292 GetWindowRect(hwnd, ref areatRect);
293
294 int width = areatRect.right - areatRect.left;
295 int height = areatRect.bottom - areatRect.top;
296
297 info.Width = width;
298 info.Height = height;
299
300 Point xy = new Point(areatRect.left, areatRect.top);
301 xy.Offset(-areatRect.left, -areatRect.top);
302
303 info.CaptionRect = new Rectangle(xy.X, xy.Y + info.BorderSize.Height, width, info.CaptionHeight);
304 info.Rect = new Rectangle(xy.X, xy.Y, width, height);
305 info.ClientRect = new Rectangle(xy.X + info.BorderSize.Width,
306 xy.Y + info.CaptionHeight + info.BorderSize.Height,
307 width - info.BorderSize.Width * 2,
308 height - info.CaptionHeight - info.BorderSize.Height * 2);
309
310 return info;
311 }
312
313 private void DrawTitle(Graphics g, _NonClientSizeInfo ncInfo, bool active) {
314 int titleX;
315
316 if (this.ShowIcon &&
317 this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.FixedToolWindow &&
318 this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.SizableToolWindow) {
319 Size iconSize = SystemInformation.SmallIconSize;
320 g.DrawIcon(this.Icon, new Rectangle(new Point(ncInfo.BorderSize.Width, ncInfo.BorderSize.Height + (ncInfo.CaptionHeight - iconSize.Height) / 2), iconSize));
321 titleX = ncInfo.BorderSize.Width + iconSize.Width + ncInfo.BorderSize.Width;
322 } else {
323 titleX = ncInfo.BorderSize.Width;
324 }
325
326 SizeF captionTitleSize = g.MeasureString(this.Text, SystemFonts.CaptionFont);
327 g.DrawString(this.Text, SystemFonts.CaptionFont, CaptionColor,
328 new RectangleF(titleX,
329 (ncInfo.BorderSize.Height + ncInfo.CaptionHeight - captionTitleSize.Height) / 2,
330 ncInfo.CaptionRect.Width - ncInfo.BorderSize.Width * 2 - SystemInformation.MinimumWindowSize.Width,
331 ncInfo.CaptionRect.Height), StringFormat.GenericTypographic);
332 }
333
334 private void DrawBorder(Graphics g, _NonClientSizeInfo ncInfo, Brush background, bool active) {
335 Rectangle borderTop = new Rectangle(ncInfo.Rect.Left,
336 ncInfo.Rect.Top,
337 ncInfo.Rect.Left + ncInfo.Rect.Width,
338 ncInfo.Rect.Top + ncInfo.BorderSize.Height);
339 Rectangle borderLeft = new Rectangle(
340 new Point(ncInfo.Rect.Location.X, ncInfo.Rect.Location.Y + ncInfo.BorderSize.Height),
341 new Size(ncInfo.BorderSize.Width, ncInfo.ClientRect.Height + ncInfo.CaptionHeight + ncInfo.BorderSize.Height));
342 Rectangle borderRight = new Rectangle(ncInfo.Rect.Left + ncInfo.Rect.Width - ncInfo.BorderSize.Width,
343 ncInfo.Rect.Top + ncInfo.BorderSize.Height,
344 ncInfo.BorderSize.Width,
345 ncInfo.ClientRect.Height + ncInfo.CaptionHeight + ncInfo.BorderSize.Height);
346 Rectangle borderBottom = new Rectangle(ncInfo.Rect.Left + ncInfo.BorderSize.Width,
347 ncInfo.Rect.Top + ncInfo.Rect.Height - ncInfo.BorderSize.Height,
348 ncInfo.Rect.Width - ncInfo.BorderSize.Width * 2,
349 ncInfo.Rect.Height);
350
351 //Rectangle leftbottom = new Rectangle(new Point(ncInfo.Rect.Location.X, ncInfo.Rect.Height - ncInfo.BorderSize.Width * 2),
352 // new Size(ncInfo.BorderSize.Width * 2, ncInfo.BorderSize.Width * 2));
353
354 //g.FillPie(Brushes.Red, leftbottom, 90, 180);
355 //g.FillRectangle(Brushes.Red, leftbottom);
356 // top border
357 g.FillRectangle(background, borderTop);
358 // left border
359 g.FillRectangle(background, borderLeft);
360 // right border
361 g.FillRectangle(background, borderRight);
362 // bottom border
363 g.FillRectangle(background, borderBottom);
364 }
365
366 private void DrawCaption(IntPtr hwnd, bool active) {
367 IntPtr dc;
368 Graphics g;
369 Size iconSize;
370 _NonClientSizeInfo ncInfo;
371 Brush backgroundColor = new SolidBrush(CaptionBackgroundColor);
372 Brush foregroundColor = CaptionColor;
373
374 iconSize = SystemInformation.SmallIconSize;
375
376 dc = GetWindowDC(hwnd);
377 ncInfo = GetNonClientInfo(hwnd);
378 g = Graphics.FromHdc(dc);
379
380 g.FillRectangle(backgroundColor, ncInfo.CaptionRect);
381
382 DrawBorder(g, ncInfo, backgroundColor, active);
383 DrawTitle(g, ncInfo, active);
384 DrawControlBox(g, ncInfo, backgroundColor, this.ControlBox, this.MaximizeBox, this.MinimizeBox, this.HelpButton);
385
386 g.Dispose();
387 ReleaseDC(hwnd, dc);
388 }
389
390 private void DrawControlBox(Graphics g, _NonClientSizeInfo info, Brush background, bool closeBtn, bool maxBtn, bool minBtn, bool helpBtn) {
391 if (this.ControlBox) {
392 int closeBtnPosX = info.CaptionRect.Left + info.CaptionRect.Width - info.BorderSize.Width - info.CaptionButtonSize.Width;
393 int maxBtnPosX = closeBtnPosX - info.CaptionButtonSize.Width;
394 int minBtnPosX = maxBtnPosX - info.CaptionButtonSize.Width;
395 int btnPosY = info.BorderSize.Height + (info.CaptionHeight - info.CaptionButtonSize.Height) / 2;
396
397 Rectangle btnRect = new Rectangle(new Point(closeBtnPosX, btnPosY), info.CaptionButtonSize);
398 Rectangle maxRect = new Rectangle(new Point(maxBtnPosX, btnPosY), info.CaptionButtonSize);
399 Rectangle minRect = new Rectangle(new Point(minBtnPosX, btnPosY), info.CaptionButtonSize);
400
401 Brush backgroundColor = new SolidBrush(CaptionBackgroundColor);
402
403 g.FillRectangle(backgroundColor, btnRect);
404 g.FillRectangle(backgroundColor, maxRect);
405 g.FillRectangle(backgroundColor, minRect);
406
407 g.DrawImage(CloseButtonImage, btnRect);
408
409 if (this.MaximizeBox || this.MinimizeBox) {
410 if (this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.FixedToolWindow &&
411 this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.SizableToolWindow) {
412 if (this.WindowState == FormWindowState.Maximized) {
413 g.DrawImage(MaximumNormalButtonImage, maxRect);
414 } else {
415 g.DrawImage(MaximumButtonImage, maxRect);
416 }
417 g.DrawImage(MinimumButtonImage, minRect);
418 }
419 } else if (this.HelpButton) {
420 if (this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.FixedToolWindow &&
421 this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.SizableToolWindow) {
422 g.DrawImage(HelpButtonImage, maxRect);
423 }
424 }
425 }
426 }
427
428 #endregion
429
430 #region Major method WndProc
431
432 private int LOBYTE(long p) { return (int)(p & 0x0000FFFF); }
433 private int HIBYTE(long p) { return (int)(p >> 16); }
434
435 protected override void WndProc(ref Message m) {
436 if (this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.None) {
437 switch (m.Msg) {
438 case WM_NCPAINT:
439 DrawCaption(m.HWnd, Form.ActiveForm == this);
440 return;
441 case WM_NCACTIVATE:
442 DrawCaption(m.HWnd, m.WParam.ToInt32() > 0);
443 return;
444 case WM_NCRBUTTONDOWN: {
445 int posX, posY;
446 int wp = m.WParam.ToInt32();
447 long lp = m.LParam.ToInt64();
448 posX = LOBYTE(lp);
449 posY = HIBYTE(lp);
450
451 if (wp == HTCAPTION) {
452 Point pt = this.PointToClient(new Point(posX, posY));
453 if (this.CaptionContextMenu != null) {
454 this.CaptionContextMenu.Show(posX, posY);
455 return;
456 }
457 }
458 break;
459 }
460 case WM_SETCURSOR:
461 if (this.ControlBox) {
462 int posX, posY;
463 int wp = m.WParam.ToInt32();
464 long lp = m.LParam.ToInt64();
465 posX = LOBYTE(lp);
466 posY = HIBYTE(lp);
467
468 Brush backgroundColor = new SolidBrush(CaptionBackgroundColor);
469 _NonClientSizeInfo ncInfo = GetNonClientInfo(m.HWnd);
470 IntPtr dc = GetWindowDC(m.HWnd);
471
472 Graphics g = Graphics.FromHdc(dc);
473 int closeBtnPosX = ncInfo.CaptionRect.Left + ncInfo.CaptionRect.Width - ncInfo.BorderSize.Width - ncInfo.CaptionButtonSize.Width;
474 int maxBtnPosX, minBtnPosX;
475 maxBtnPosX = closeBtnPosX - ncInfo.CaptionButtonSize.Width;
476 minBtnPosX = maxBtnPosX - ncInfo.CaptionButtonSize.Width;
477
478 int btnPosY = ncInfo.BorderSize.Height + (ncInfo.CaptionHeight - ncInfo.CaptionButtonSize.Height) / 2;
479
480 Rectangle btnRect = new Rectangle(new Point(closeBtnPosX, btnPosY), ncInfo.CaptionButtonSize);
481 Rectangle maxRect = new Rectangle(new Point(maxBtnPosX, btnPosY), ncInfo.CaptionButtonSize);
482 Rectangle minRect = new Rectangle(new Point(minBtnPosX, btnPosY), ncInfo.CaptionButtonSize);
483
484 g.FillRectangle(backgroundColor, btnRect);
485 g.FillRectangle(backgroundColor, maxRect);
486 g.FillRectangle(backgroundColor, minRect);
487
488 if (posX != HTCLOSE) {
489 g.DrawImage(CloseButtonImage, btnRect);
490 } else if (MouseButtons != System.Windows.Forms.MouseButtons.Left) {
491 g.DrawImage(CloseButtonHoverImage, btnRect);
492 } else {
493 g.DrawImage(CloseButtonPressDownImage, btnRect);
494 }
495
496 if (this.MaximizeBox || this.MinimizeBox) {
497 if (this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.FixedToolWindow &&
498 this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.SizableToolWindow) {
499 if (this.WindowState == FormWindowState.Maximized) {
500 if (this.MaximizeBox) {
501 if (posX != HTMAXBUTTON) {
502 g.DrawImage(MaximumNormalButtonImage, maxRect);
503 } else if (MouseButtons != System.Windows.Forms.MouseButtons.Left) {
504 g.DrawImage(MaximumNormalButtonHoverImage, maxRect);
505 } else {
506 g.DrawImage(MaximumNormalButtonPressDownImage, maxRect);
507 }
508 } else {
509 g.DrawImage(MaximumNormalButtonImage, maxRect);
510 }
511 } else {
512 if (this.MaximizeBox) {
513 if (posX != HTMAXBUTTON) {
514 g.DrawImage(MaximumButtonImage, maxRect);
515 } else if (MouseButtons != System.Windows.Forms.MouseButtons.Left) {
516 g.DrawImage(MaximumButtonHoverImage, maxRect);
517 } else {
518 g.DrawImage(MaximumButtonPressDownImage, maxRect);
519 }
520 } else {
521 g.DrawImage(MaximumButtonImage, maxRect);
522 }
523 }
524
525 if (this.MinimizeBox) {
526 if (posX != HTMINBUTTON) {
527 g.DrawImage(MinimumButtonImage, minRect);
528 } else if (MouseButtons != System.Windows.Forms.MouseButtons.Left) {
529 g.DrawImage(MinimumButtonHoverImage, minRect);
530 } else {
531 g.DrawImage(MinimumButtonPressDownImage, minRect);
532 }
533 } else {
534 g.DrawImage(MinimumButtonImage, minRect);
535 }
536 }
537 } else if (this.HelpButton) {
538 if (this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.FixedToolWindow &&
539 this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.SizableToolWindow) {
540 if (posX != HTHELP) {
541 g.DrawImage(HelpButtonImage, maxRect);
542 } else if (MouseButtons != System.Windows.Forms.MouseButtons.Left) {
543 g.DrawImage(HelpButtonHoverImage, maxRect);
544 } else {
545 g.DrawImage(HelpButtonPressDownImage, maxRect);
546 }
547 }
548 }
549
550 g.Dispose();
551 ReleaseDC(m.HWnd, dc);
552 }
553 break;
554 case WM_NCLBUTTONUP: {
555 int wp = m.WParam.ToInt32();
556 switch (wp) {
557 case HTCLOSE:
558 m.Msg = WM_SYSCOMMAND;
559 m.WParam = new IntPtr(SC_CLOSE);
560 break;
561 case HTMAXBUTTON:
562 if (this.MaximizeBox) {
563 m.Msg = WM_SYSCOMMAND;
564 if (this.WindowState == FormWindowState.Maximized) {
565 m.WParam = new IntPtr(SC_RESTORE);
566 } else {
567 m.WParam = new IntPtr(SC_MAXIMIZE);
568 }
569 }
570 break;
571 case HTMINBUTTON:
572 if (this.MinimizeBox) {
573 m.Msg = WM_SYSCOMMAND;
574 m.WParam = new IntPtr(SC_MINIMIZE);
575 }
576 break;
577 case HTHELP:
578 m.Msg = WM_SYSCOMMAND;
579 m.WParam = new IntPtr(SC_CONTEXTHELP);
580 break;
581 default:
582 break;
583 }
584 break;
585 }
586
587 case WM_NCLBUTTONDOWN:
588 if (this.ControlBox) {
589 bool ret = false;
590 int posX, posY;
591 int wp = m.WParam.ToInt32();
592 long lp = m.LParam.ToInt64();
593 posX = LOBYTE(lp);
594 posY = HIBYTE(lp);
595
596 _NonClientSizeInfo ncInfo = GetNonClientInfo(m.HWnd);
597 IntPtr dc = GetWindowDC(m.HWnd);
598 Brush backgroundColor = new SolidBrush(CaptionBackgroundColor);
599
600 Graphics g = Graphics.FromHdc(dc);
601 int closeBtnPosX = ncInfo.CaptionRect.Left + ncInfo.CaptionRect.Width - ncInfo.BorderSize.Width - ncInfo.CaptionButtonSize.Width;
602 int maxBtnPosX, minBtnPosX;
603 int btnPosY = ncInfo.BorderSize.Height + (ncInfo.CaptionHeight - ncInfo.CaptionButtonSize.Height) / 2;
604 maxBtnPosX = closeBtnPosX - ncInfo.CaptionButtonSize.Width;
605 minBtnPosX = maxBtnPosX - ncInfo.CaptionButtonSize.Width;
606
607 Rectangle btnRect = new Rectangle(new Point(closeBtnPosX, btnPosY), ncInfo.CaptionButtonSize);
608 Rectangle maxRect = new Rectangle(new Point(maxBtnPosX, btnPosY), ncInfo.CaptionButtonSize);
609 Rectangle minRect = new Rectangle(new Point(minBtnPosX, btnPosY), ncInfo.CaptionButtonSize);
610
611 g.FillRectangle(backgroundColor, btnRect);
612 g.FillRectangle(backgroundColor, maxRect);
613 g.FillRectangle(backgroundColor, minRect);
614
615 if (wp == HTCLOSE) {
616 g.DrawImage(CloseButtonPressDownImage, btnRect);
617 ret = true;
618 } else {
619 g.DrawImage(CloseButtonImage, btnRect);
620 }
621
622 if (this.MaximizeBox || this.MinimizeBox) {
623 if (this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.SizableToolWindow &&
624 this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.FixedToolWindow) {
625 if (this.WindowState == FormWindowState.Maximized) {
626 if (wp == HTMAXBUTTON && this.MaximizeBox) {
627 minBtnPosX = maxBtnPosX - ncInfo.CaptionButtonSize.Width;
628 g.DrawImage(MaximumNormalButtonPressDownImage, maxRect);
629 ret = true;
630 } else {
631 g.DrawImage(MaximumNormalButtonImage, maxRect);
632 }
633 } else {
634 if (wp == HTMAXBUTTON && this.MaximizeBox) {
635 minBtnPosX = maxBtnPosX - ncInfo.CaptionButtonSize.Width;
636 g.DrawImage(MaximumButtonPressDownImage, maxRect);
637 ret = true;
638 } else {
639 g.DrawImage(MaximumButtonImage, maxRect);
640 }
641 }
642 if (wp == HTMINBUTTON && this.MinimizeBox) {
643 g.DrawImage(MinimumButtonPressDownImage, minRect);
644 ret = true;
645 } else {
646 g.DrawImage(MinimumButtonImage, minRect);
647 }
648 }
649 } else if (this.HelpButton) {
650 if (this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.FixedToolWindow &&
651 this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.SizableToolWindow) {
652 if (wp == HTHELP) {
653 g.DrawImage(HelpButtonPressDownImage, maxRect);
654 ret = true;
655 } else {
656 g.DrawImage(HelpButtonImage, maxRect);
657 }
658 }
659 }
660
661 g.Dispose();
662 ReleaseDC(m.HWnd, dc);
663
664 if (ret)
665 return;
666 }
667 break;
668 }
669 }
670
671 base.WndProc(ref m);
672 }
673
674 #endregion
675 }
676 }