ProgressBarEx.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. using System.IO;
  6. using System.Drawing;
  7. using System.Drawing.Drawing2D;
  8. using System.ComponentModel;
  9. namespace LYFZ.ComponentLibrary
  10. {
  11. public class ProgressBarEx : System.Windows.Forms.ProgressBar
  12. {
  13. [System.Runtime.InteropServices.DllImport("user32.dll ")]
  14. static extern IntPtr GetWindowDC(IntPtr hWnd);
  15. [System.Runtime.InteropServices.DllImport("user32.dll ")]
  16. static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
  17. public Color foreColor = System.Drawing.SystemColors.MenuHighlight;
  18. public Font font = new System.Drawing.Font("微软雅黑", 11.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
  19. public string foreText = "";
  20. public bool bshowText = false;
  21. protected override void WndProc(ref Message m)
  22. {
  23. base.WndProc(ref m);
  24. if (m.Msg == 0xf || m.Msg == 0x133)
  25. {
  26. //拦截系统消息,获得当前控件进程以便重绘。
  27. //一些控件(如TextBox、Button等)是由系统进程绘制,重载OnPaint方法将不起作用.
  28. //所有这里并没有使用重载OnPaint方法绘制TextBox边框。
  29. //
  30. //MSDN:重写 OnPaint 将禁止修改所有控件的外观。
  31. //那些由 Windows 完成其所有绘图的控件(例如 Textbox)从不调用它们的 OnPaint 方法,
  32. //因此将永远不会使用自定义代码。请参见您要修改的特定控件的文档,
  33. //查看 OnPaint 方法是否可用。如果某个控件未将 OnPaint 作为成员方法列出,
  34. //则您无法通过重写此方法改变其外观。
  35. //
  36. //MSDN:要了解可用的 Message.Msg、Message.LParam 和 Message.WParam 值,
  37. //请参考位于 MSDN Library 中的 Platform SDK 文档参考。可在 Platform SDK(“Core SDK”一节)
  38. //下载中包含的 windows.h 头文件中找到实际常数值,该文件也可在 MSDN 上找到。
  39. IntPtr hDC = GetWindowDC(m.HWnd);
  40. if (hDC.ToInt32() == 0)
  41. {
  42. return;
  43. }
  44. //base.OnPaint(e);
  45. System.Drawing.Graphics g = Graphics.FromHdc(hDC);
  46. SizeF foreSize = g.MeasureString(foreText, font);
  47. //base.OnPaint(e);
  48. if (bshowText)
  49. {
  50. g.DrawString(foreText, font, new SolidBrush(foreColor), new PointF(this.Width - foreSize.Width, (this.Height - foreSize.Height) / 2));
  51. }
  52. //返回结果
  53. m.Result = IntPtr.Zero;
  54. //释放
  55. ReleaseDC(m.HWnd, hDC);
  56. }
  57. }
  58. protected override void OnPaint(PaintEventArgs e)
  59. {
  60. }
  61. }
  62. }