DrawUtil.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2.  * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3.  * $Id: DrawUtil.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  4.  */
  5. using System;
  6. using System.Drawing;
  7. using System.Diagnostics;
  8. namespace Poderosa.UI {
  9. public class DrawUtil {
  10. //娵傒偺偁傞Border傪昤夋偡傞
  11. internal enum RoundBorderElement {
  12. Outer,
  13. Inner,
  14. Light,
  15. LightLight
  16. }
  17. public class RoundRectColors {
  18. public uint border_color;
  19. public uint outer_color;
  20. public uint inner_color;
  21. public uint light_color;
  22. public uint lightlight_color;
  23. internal uint GetColor(RoundBorderElement e) {
  24. switch(e) {
  25. case RoundBorderElement.Inner:
  26. return inner_color;
  27. case RoundBorderElement.Outer:
  28. return outer_color;
  29. case RoundBorderElement.Light:
  30. return light_color;
  31. case RoundBorderElement.LightLight:
  32. return lightlight_color;
  33. }
  34. Debug.Assert(false, "should not reach here");
  35. return 0;
  36. }
  37.   
  38. }
  39. //嵍忋偺娵傒傪昤偔偲偒丄[x,y]偱嶲徠偡傞
  40. private static readonly RoundBorderElement[,] _round_border_info = new RoundBorderElement[3,3] {
  41.           { RoundBorderElement.Outer,      RoundBorderElement.LightLight, RoundBorderElement.Light      },
  42.           { RoundBorderElement.LightLight, RoundBorderElement.Light,      RoundBorderElement.LightLight },
  43.           { RoundBorderElement.Light,      RoundBorderElement.LightLight, RoundBorderElement.Inner      },
  44. };
  45. public static void DrawRoundRect(Graphics g, int x, int y, int width, int height, RoundRectColors colors) {
  46. IntPtr hdc = g.GetHdc();
  47. const int ROUND_SIZE = 3; //3*3僺僋僙儖偼帺慜偱昤夋
  48. IntPtr pen = Win32.CreatePen(0, 1, colors.border_color);
  49. Win32.SelectObject(hdc, pen);
  50. //忋
  51. Win32.MoveToEx(hdc, x+ROUND_SIZE, y);
  52. Win32.LineTo(hdc, x+width-ROUND_SIZE+1, y);
  53. //壓
  54. Win32.MoveToEx(hdc, x+ROUND_SIZE, y+height);
  55. Win32.LineTo(hdc, x+width-ROUND_SIZE+1, y+height);
  56. //嵍
  57. Win32.MoveToEx(hdc, x, y+ROUND_SIZE);
  58. Win32.LineTo(hdc, x, y+height-ROUND_SIZE+1);
  59. //塃
  60. Win32.MoveToEx(hdc, x+width, y+ROUND_SIZE);
  61. Win32.LineTo(hdc, x+width, y+height-ROUND_SIZE+1);
  62. Win32.DeleteObject(pen);
  63. DrawRoundCorner(hdc, x,       y,        1, 1, colors); //嵍忋
  64. DrawRoundCorner(hdc, x+width, y,       -1, 1, colors); //塃忋
  65. DrawRoundCorner(hdc, x,       y+height, 1,-1, colors); //嵍壓
  66. DrawRoundCorner(hdc, x+width, y+height,-1,-1, colors); //塃壓
  67. g.ReleaseHdc(hdc);
  68. }
  69. //攝楍偺嶲徠偵夞揮偑偐偐偭偰偄傞偺偵拲堄
  70. private static void DrawRoundCorner(IntPtr hdc, int bx, int by, int dx, int dy, RoundRectColors colors) {
  71. int y = by;
  72. for(int j=0; j<3; j++) {
  73. int x = bx;
  74. for(int i=0; i<3; i++) {
  75. Win32.SetPixel(hdc, x, y, colors.GetColor(_round_border_info[i,j]));
  76. x += dx;
  77. }
  78. y += dy;
  79. }
  80. }
  81. //婸搙傪敿暘偵偟偨怓傪曉偡
  82. public static Color DarkColor(Color src) {
  83. return Color.FromArgb(src.R/2, src.G/2, src.B/2);
  84. }
  85. public static Color LightColor(Color src) {
  86. return Color.FromArgb(src.R/2+128, src.G/2+128, src.B/2+128);
  87. }
  88. //COLORREF偵懳墳偟偨惍悢傪曉偡
  89. public static uint ToCOLORREF(Color c) {
  90. uint t = (uint)c.ToArgb();
  91. //COLORREF偼0x00BBGGRR丄ToArgb偼0x00RRGGBB
  92. uint r = (t & 0x00FF0000) >> 16;
  93. uint b = (t & 0x000000FF) << 16;
  94. t &= 0x0000FF00;
  95. return t | r | b;
  96. }
  97. public static uint MergeColor(uint col1, uint col2) {
  98. uint r = (((col1 & 0x0000FF) + (col2 & 0x0000FF)) >> 1) & 0x0000FF;
  99. uint g = (((col1 & 0x00FF00) + (col2 & 0x00FF00)) >> 1) & 0x00FF00;
  100. uint b = (((col1 & 0xFF0000) + (col2 & 0xFF0000)) >> 1) & 0xFF0000;
  101. return r | g | b;
  102. }
  103. }
  104. }