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

Telnet服务器

开发平台:

C#

  1. /*
  2.  * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3.  * 
  4.  * this source code originates in Johannes Wallroth's color picker control.
  5.  * http://www.codeproject.com/cs/miscctrl/color_picker.asp
  6.  * 
  7.  * $Id: ColorDialog.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  8.  */
  9. using System;
  10. using System.Diagnostics;
  11. using System.Windows.Forms;
  12. using System.Drawing;
  13. namespace Poderosa.UI
  14. {
  15. internal class ColorPaletteDialog : Form
  16. {
  17. private bool _isClosing;
  18. byte max = 40;
  19. Panel[] panel = new Panel[40];
  20. Color[] color = new Color[40]
  21. {
  22. //row 1
  23. Color.FromArgb(0,0,0), Color.FromArgb(153,51,0), Color.FromArgb(51,51,0), Color.FromArgb(0,51,0),
  24. Color.FromArgb(0,51,102), Color.FromArgb(0,0,128), Color.FromArgb(51,51,153), Color.FromArgb(51,51,51),
  25. //row 2
  26. Color.FromArgb(128,0,0), Color.FromArgb(255,102,0), Color.FromArgb(128,128,0), Color.FromArgb(0,128,0),
  27. Color.FromArgb(0,128,128), Color.FromArgb(0,0,255), Color.FromArgb(102,102,153), Color.FromArgb(128,128,128),
  28. //row 3
  29. Color.FromArgb(255,0,0), Color.FromArgb(255,153,0), Color.FromArgb(153,204,0), Color.FromArgb(51,153,102),
  30. Color.FromArgb(51,204,204), Color.FromArgb(51,102,255), Color.FromArgb(128,0,128), Color.FromArgb(153,153,153),
  31. //row 4
  32. Color.FromArgb(255,0,255), Color.FromArgb(255,204,0), Color.FromArgb(255,255,0), Color.FromArgb(0,255,0),
  33. Color.FromArgb(0,255,255), Color.FromArgb(0,204,255), Color.FromArgb(153,51,102), Color.FromArgb(192,192,192),
  34. //row 5
  35. Color.FromArgb(255,153,204), Color.FromArgb(255,204,153), Color.FromArgb(255,255,153), Color.FromArgb(204,255,204),
  36. Color.FromArgb(204,255,255), Color.FromArgb(153,204,255), Color.FromArgb(204,153,255), Color.FromArgb(255,255,255)
  37. };
  38. string[] colorName = new string[40]
  39. {
  40. "Black", "Brown", "Olive Green", "Dark Green", "Dark Teal", "Dark Blue", "Indigo", "Gray-80%",
  41. "Dark Red", "Orange", "Dark Yellow", "Green", "Teal", "Blue", "Blue-Gray", "Gray-50%",
  42. "Red", "Light Orange", "Lime", "Sea Green", "Aqua", "Light Blue", "Violet", "Gray-40%",
  43. "Pink", "Gold", "Yellow", "Bright Green", "Turquoise", "Sky Blue", "Plum", "Gray-25%",
  44. "Rose", "Tan", "Light Yellow", "Light Green", "Light Turquoise", "Pale Blue", "Lavender", "White"
  45. };
  46. Button moreColorsButton = new Button();
  47. Button cancelButton = new Button();
  48. Color selectedColor;
  49. public ColorPaletteDialog(int x, int y)
  50. {
  51. Size = new Size(158, 132);
  52. FormBorderStyle = FormBorderStyle.FixedDialog;
  53. MinimizeBox = MaximizeBox = ControlBox = false;
  54. ShowInTaskbar = false;
  55. CenterToScreen();
  56. Location = new Point(x, y);
  57. BuildPalette();
  58. moreColorsButton.Text = "Others...";
  59. moreColorsButton.Size = new Size(142, 22);
  60. moreColorsButton.Location = new Point(5, 99);
  61. moreColorsButton.Click += new EventHandler(moreColorsButton_Click);
  62. moreColorsButton.FlatStyle = FlatStyle.Popup;
  63. Controls.Add(moreColorsButton);
  64. //"invisible" button to cancel at Escape
  65. cancelButton.Size = new Size(5, 5);
  66. cancelButton.Location = new Point(-10, -10);
  67. cancelButton.Click += new EventHandler(cancelButton_Click);
  68. Controls.Add(cancelButton);
  69. cancelButton.TabIndex = 0;
  70. cancelButton.DialogResult = DialogResult.Cancel;
  71. this.CancelButton = cancelButton;
  72. }
  73. public Color Color
  74. {
  75. get {return selectedColor;}
  76. }
  77. void BuildPalette()
  78. {
  79. byte pwidth = 16;
  80. byte pheight = 16;
  81. byte pdistance = 2;
  82. byte border = 5;
  83. int x = border, y = border;
  84. ToolTip toolTip = new ToolTip();
  85. for(int i = 0; i < max; i++)
  86. {
  87. panel[i] = new Panel();
  88. panel[i].Height = pwidth;
  89. panel[i].Width = pheight;
  90. panel[i].Location = new Point(x, y);
  91. toolTip.SetToolTip(panel[i], colorName[i]);
  92. this.Controls.Add(panel[i]);
  93. if(x < ( 7 * (pwidth + pdistance)))
  94. x += pwidth + pdistance;
  95. else
  96. {
  97. x = border;
  98. y += pheight + pdistance;
  99. }
  100. panel[i].BackColor = color[i];
  101. panel[i].MouseEnter += new EventHandler(OnMouseEnterPanel);
  102. panel[i].MouseLeave += new EventHandler(OnMouseLeavePanel);
  103. panel[i].MouseDown += new MouseEventHandler(OnMouseDownPanel);
  104. panel[i].MouseUp += new MouseEventHandler(OnMouseUpPanel);
  105. panel[i].Paint += new PaintEventHandler(OnPanelPaint);
  106. }
  107. }
  108. void moreColorsButton_Click(object sender, System.EventArgs e)
  109. {    
  110.      ColorDialog colDialog = new ColorDialog();
  111.      colDialog.FullOpen = true;
  112. this.DialogResult = colDialog.ShowDialog();
  113. if(this.DialogResult == DialogResult.OK)    
  114.      selectedColor = colDialog.Color;
  115.      colDialog.Dispose();
  116. _isClosing = true;
  117. Close();
  118. }
  119.     
  120. void cancelButton_Click(object sender, System.EventArgs e)
  121. {        
  122.      Close();
  123. }
  124. void OnMouseEnterPanel(object sender, EventArgs e)
  125. {
  126. DrawPanel(sender, 1);
  127. }
  128. void OnMouseLeavePanel(object sender, EventArgs e)
  129. {
  130. DrawPanel(sender, 0);
  131. }
  132. void OnMouseDownPanel(object sender, MouseEventArgs e)
  133. {
  134. DrawPanel(sender, 2);
  135. }
  136. void OnMouseUpPanel(object sender, MouseEventArgs e)
  137. {
  138. Panel panel = (Panel)sender;
  139. selectedColor = panel.BackColor;
  140. DialogResult = DialogResult.OK;
  141. _isClosing = true;
  142. Close();
  143. }
  144. void DrawPanel(object sender, byte state)
  145. {
  146. Panel panel = (Panel)sender;
  147. Graphics g = panel.CreateGraphics();
  148. Pen pen1, pen2;
  149. if(state == 1)  //mouse over
  150. {
  151. pen1 = new Pen( SystemColors.ControlLightLight ); 
  152. pen2 = new Pen( SystemColors. ControlDarkDark);
  153. }
  154. else if(state == 2) //clicked
  155. {
  156. pen1 = new Pen( SystemColors.ControlDarkDark ); 
  157. pen2 = new Pen( SystemColors.ControlLightLight );
  158. }
  159. else //neutral
  160. {
  161. pen1 = new Pen( SystemColors.ControlDark ); 
  162. pen2 = new Pen( SystemColors.ControlDark );
  163. }
  164. Rectangle r = panel.ClientRectangle;
  165. Point p1 = new Point( r.Left, r.Top );  //top left
  166. Point p2 = new Point( r.Right -1, r.Top ); //top right
  167. Point p3 = new Point( r.Left, r.Bottom -1 ); //bottom left
  168. Point p4 = new Point( r.Right -1, r.Bottom -1 ); //bottom right
  169. g.DrawLine( pen1, p1, p2 ); 
  170. g.DrawLine( pen1, p1, p3 ); 
  171. g.DrawLine( pen2, p2, p4 ); 
  172. g.DrawLine( pen2, p3, p4 ); 
  173. }
  174. void OnPanelPaint(Object sender, PaintEventArgs e)
  175. {
  176. DrawPanel(sender, 0);
  177. }
  178. protected override void WndProc(ref Message m) {
  179. base.WndProc(ref m);
  180. if(m.Msg == 0x0086/*WM_NCACTIVATE*/ && m.WParam.ToInt32() == 0 && !_isClosing) {
  181. this.DialogResult = DialogResult.Cancel;
  182. Close();
  183. }
  184. }
  185. }
  186. }