Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

Книги по теме

Искать:
в:
Порядок:

Исходник

Автор:

W@ndERR ®

 
Название:

LinearGradientFill - хранит информацию для градиентной заливки

Дата: 03 February 2004
Описание: Обыкновенный сервисный (вспомогательный) класс. Содержит пример создания своего UITypeEditor, реализации интерфейсов IXmlSerializable, ISerializable 
  Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения следующую строку: [CODEPOST ID=78]LinearGradientFill - хранит информацию для градиентной заливки[/CODEPOST]
Оценка: Проголосовало 6 посетителей, средняя оценка 4.50
Оценить:
  1 /// <summary>
  2 /// Вспомогательный класс для хранения информации о линейной градиентной заливке.
  3 /// </summary>
  4 [TypeConverter(typeof(ExpandableObjectConverter)),
  5 Editor(typeof(LinearGradientFillEditor), typeof(UITypeEditor)),
  6 Serializable]
  7 public class LinearGradientFill : ICloneable, ISerializable, IXmlSerializable
  8 {
  9 	#region Переменные
 10 	private Color colorA = Color.DarkGray;
 11 	private Color colorB = Color.LightGray;
 12 	private LinearGradientMode gradientStyle = LinearGradientMode.Horizontal;
 13 	#endregion
 14 
 15 	#region Конструкторы
 16 	/// <summary>
 17 	/// Конструктор по умолчанию.
 18 	/// </summary>
 19 	public LinearGradientFill() {}
 20 
 21 	/// <summary>
 22 	/// Конструктор, используемый при десериализации.
 23 	/// </summary>
 24 	/// <param name="info">класс <see cref="SerializationInfo"/> для информации о сериализации</param>
 25 	/// <param name="context">источник для сериализации</param>
 26 	protected LinearGradientFill(SerializationInfo info, StreamingContext context)
 27 	{
 28 		// Десериализация цветов
 29 		this.colorA = (Color) info.GetValue("ColorA", typeof(Color));
 30 		this.colorB = (Color) info.GetValue("ColorB", typeof(Color));
 31 		// Десериализация стиля заливки
 32 		int temp = info.GetInt32("GradientStyle");
 33 		// Проверка полученного значения GradientStyle
 34 		if(!Enum.IsDefined(typeof(LinearGradientMode), temp))
 35 			throw new InvalidEnumArgumentException("GradientStyle", temp, typeof(LinearGradientMode));
 36 		this.gradientStyle = (LinearGradientMode) temp;
 37 	}
 38 	#endregion
 39 
 40 	#region Методы
 41 	#region Перегруженные методы
 42 	/// <summary>
 43 	/// Сравнение объектов LinearGradientFill.
 44 	/// </summary>
 45 	/// <param name="obj">объект для сравнения</param>
 46 	/// <returns>результат сравнения</returns>
 47 	public override bool Equals(object obj)
 48 	{
 49 		LinearGradientFill linearGradientFill = obj as LinearGradientFill;
 50 
 51 		if(linearGradientFill == null)
 52 			return false;
 53 
 54 		if((linearGradientFill.ColorA == this.ColorA) && (linearGradientFill.ColorB == this.ColorB))
 55 			return (linearGradientFill.GradientStyle == this.GradientStyle);
 56 		else
 57 			return false;
 58 	}
 59 
 60 	/// <summary>
 61 	/// Генерация хэш-кода.
 62 	/// </summary>
 63 	/// <returns>хэш-код</returns>
 64 	public override int GetHashCode()
 65 	{
 66 		return base.GetHashCode();
 67 	}
 68 
 69 	/// <summary>
 70 	/// Строковое представление.
 71 	/// </summary>
 72 	/// <returns>результат конвертации</returns>
 73 	public override string ToString()
 74 	{
 75 		return this.GetType().Name.Replace(this.GetType().Namespace, String.Empty);
 76 	}
 77 	#endregion
 78 
 79 	#region Реализация интерфейса ICloneable
 80 	object ICloneable.Clone()
 81 	{
 82 		LinearGradientFill linearGradientFill = new LinearGradientFill();
 83 
 84 		linearGradientFill.ColorA = this.ColorA;
 85 		linearGradientFill.ColorB = this.ColorB;
 86 		linearGradientFill.GradientStyle = this.GradientStyle;
 87 
 88 		return linearGradientFill;
 89 	}
 90 	#endregion
 91 
 92 	#region Реализация интерфейса ISerializable
 93 	/// <summary>
 94 	/// Метод сериализации класса.
 95 	/// </summary>
 96 	/// <param name="info">класс <see cref="SerializationInfo"/> для информации о сериализации</param>
 97 	/// <param name="context">источник для сериализации</param>
 98 	[SecurityPermission(SecurityAction.Demand, SerializationFormatter=true)]
 99 	void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
100 	{
101 		info.AddValue("ColorA", this.colorA, typeof(Color));
102 		info.AddValue("ColorB", this.colorB, typeof(Color));
103 		info.AddValue("GradientStyle", (int) this.gradientStyle);
104 	}
105 	#endregion
106 
107 	#region Реализация интерфейса IXmlSerializable
108 	/// <summary>
109 	/// Метод генерации XSD схемы для XML сериализации.
110 	/// </summary>
111 	/// <returns>XSD схема</returns>
112 	/// <remarks>
113 	/// Может вернуть null, но в этом случае метод <see cref="IXmlSerializable.WriteXml"/> должен сначала записывать XSD схему, а только потом данные,
114 	/// по аналогии метод <see cref="IXmlSerializable.ReadXml"/> должен первоначально прочитать схему, а затем данные.
115 	/// </remarks>
116 	XmlSchema IXmlSerializable.GetSchema()
117 	{
118 		XmlSchema schema = new XmlSchema();
119 		XmlSchemaElement linearGradientFill, colorA, colorB, gradientStyle;
120 		XmlSchemaComplexType linearGradientFillType;
121 		XmlSchemaSequence sequence;
122 
123 		schema.Namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
124 		schema.Namespaces.Add("xsd", "http://www.w3.org/2001/XMLSchema");
125 		schema.TargetNamespace = "http://tempuri.org";
126 		schema.Id = "LinearGradientFill";
127 
128 		linearGradientFill = new XmlSchemaElement();
129 		linearGradientFill.Name = "LinearGradientFill";
130 		linearGradientFillType = new XmlSchemaComplexType();
131 		linearGradientFill.SchemaType = linearGradientFillType;
132 		// Используем последовательность, чтобы свойства всегда были в одинаковом порядке
133 		sequence = new XmlSchemaSequence();
134 		// ColorA
135 		colorA = new XmlSchemaElement();
136 		colorA.Name = "ColorA";
137 		colorA.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");
138 
139 		sequence.Items.Add(colorA);
140 		// ColorB
141 		colorB = new XmlSchemaElement();
142 		colorB.Name = "ColorB";
143 		colorB.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");
144 
145 		sequence.Items.Add(colorB);
146 		// GradientStyle
147 		gradientStyle = new XmlSchemaElement();
148 		gradientStyle.Name = "GradientStyle";
149 		gradientStyle.SchemaTypeName = new XmlQualifiedName("int", "http://www.w3.org/2001/XMLSchema");
150 
151 		sequence.Items.Add(gradientStyle);
152 
153 		linearGradientFillType.Particle = sequence;
154 
155 		schema.Items.Add(linearGradientFill);
156 
157 		schema.Compile(new ValidationEventHandler(this.LinearGradientFillSchemaValidation));
158 
159 		return schema;
160 	}
161 
162 	private void LinearGradientFillSchemaValidation(object sender, ValidationEventArgs e)
163 	{
164 		System.Diagnostics.Trace.WriteLine(e.Message);
165 	}
166 
167 	/// <summary>
168 	/// Метод для десериализации класса из XML.
169 	/// </summary>
170 	/// <param name="reader">класс <see cref="XmlReader"/> для чтения XML</param>
171 	void IXmlSerializable.ReadXml(XmlReader reader)
172 	{
173 		byte alpha, red, green, blue;
174 
175 		reader.ReadStartElement();
176 
177 		reader.ReadStartElement("LinearGradientFill");
178 		// ColorA
179 		reader.ReadStartElement("ColorA");
180 		string color = reader.ReadString();
181 		Match match = Regex.Match(
182 			color,
183 			"#(?<alpha>[A-F0-9]{2})(?<red>[A-F0-9]{2})(?<green>[A-F0-9]{2})(?<blue>[A-F0-9]{2})");
184 		if(match.Success)
185 		{
186 			alpha = Convert.ToByte(match.Groups["alpha"].Value, 16);
187 			red = Convert.ToByte(match.Groups["red"].Value, 16);
188 			green = Convert.ToByte(match.Groups["green"].Value, 16);
189 			blue = Convert.ToByte(match.Groups["blue"].Value, 16);
190 
191 			this.colorA = Color.FromArgb(alpha, red, green, blue);
192 		}
193 		reader.ReadEndElement();
194 		// ColorB
195 		reader.ReadStartElement("ColorB");
196 		color = reader.ReadString();
197 		match = Regex.Match(
198 			color,
199 			"#(?<alpha>[A-F0-9]{2})(?<red>[A-F0-9]{2})(?<green>[A-F0-9]{2})(?<blue>[A-F0-9]{2})");
200 		if(match.Success)
201 		{
202 			alpha = Convert.ToByte(match.Groups["alpha"].Value, 16);
203 			red = Convert.ToByte(match.Groups["red"].Value, 16);
204 			green = Convert.ToByte(match.Groups["green"].Value, 16);
205 			blue = Convert.ToByte(match.Groups["blue"].Value, 16);
206 
207 			this.colorB = Color.FromArgb(alpha, red, green, blue);
208 		}
209 		reader.ReadEndElement();
210 		// GradientStyle
211 		reader.ReadStartElement("GradientStyle");
212 		int temp = int.Parse(reader.ReadString());
213 		if(!Enum.IsDefined(typeof(LinearGradientMode), temp))
214 			throw new InvalidEnumArgumentException("GradientStyle", temp, typeof(LinearGradientMode));
215 		this.gradientStyle = (LinearGradientMode) temp;
216 		reader.ReadEndElement();
217 
218 		reader.ReadEndElement();
219 
220 		reader.ReadEndElement();
221 	}
222 
223 	/// <summary>
224 	/// Метод для сериализации класса в XML.
225 	/// </summary>
226 	/// <param name="writer">класс <see cref="XmlWriter"/> для записи XML</param>
227 	void IXmlSerializable.WriteXml(XmlWriter writer)
228 	{
229 		writer.WriteStartElement("LinearGradientFill");
230 		// ColorA
231 		writer.WriteStartElement("ColorA");
232 		writer.WriteString(String.Format("#{0:X2}{1:X2}{2:X2}{3:X2}", this.colorA.A, this.colorA.R, this.colorA.G, this.colorA.B));
233 		writer.WriteEndElement();
234 		// ColorB
235 		writer.WriteStartElement("ColorB");
236 		writer.WriteString(String.Format("#{0:X2}{1:X2}{2:X2}{3:X2}", this.colorB.A, this.colorB.R, this.colorB.G, this.colorB.B));
237 		writer.WriteEndElement();
238 		// GradientStyle
239 		writer.WriteStartElement("GradientStyle");
240 		writer.WriteString(((int) this.gradientStyle).ToString());
241 		writer.WriteEndElement();
242 
243 		writer.WriteEndElement();
244 	}
245 	#endregion
246 
247 	#region Поддержка Design Time
248 	[EditorBrowsable(EditorBrowsableState.Never)]
249 	internal bool ShouldSerializeColorA()
250 	{
251 		return this.colorA != Color.DarkGray;
252 	}
253 
254 	[EditorBrowsable(EditorBrowsableState.Never)]
255 	internal bool ShouldSerializeColorB()
256 	{
257 		return this.colorB != Color.LightGray;
258 	}
259 
260 	[EditorBrowsable(EditorBrowsableState.Never)]
261 	internal bool ShouldSerializeGradientStyle()
262 	{
263 		return this.gradientStyle != LinearGradientMode.Horizontal;
264 	}
265 	#endregion
266 	#endregion
267 
268 	#region Свойства
269 	/// <summary>
270 	/// Первый цвет линейной градиентной заливки.
271 	/// </summary>
272 	[DefaultValue(typeof(Color), "DarkGray"),
273 	RefreshProperties(RefreshProperties.Repaint),
274 	Description("Первый цвет линейной градиентной заливки.")]
275 	public Color ColorA { get { return this.colorA; } set { this.colorA = value; } }
276 
277 	/// <summary>
278 	/// Второй цвет линейной градиентной заливки.
279 	/// </summary>
280 	[DefaultValue(typeof(Color), "LightGray"),
281 	RefreshProperties(RefreshProperties.Repaint),
282 	Description("Второй цвет линейной градиентной заливки.")]
283 	public Color ColorB { get { return this.colorB; } set { this.colorB = value; } }
284 
285 	/// <summary>
286 	/// Стиль линейной градиентной заливки.
287 	/// </summary>
288 	[DefaultValue(LinearGradientMode.Horizontal),
289 	RefreshProperties(RefreshProperties.Repaint),
290 	Description("Стиль линейной градиентной заливки.")]
291 	public LinearGradientMode GradientStyle
292 	{
293 		get { return this.gradientStyle; }
294 		set
295 		{
296 			if(!Enum.IsDefined(typeof(LinearGradientMode), value))
297 				throw new InvalidEnumArgumentException("value", (int) value, typeof(LinearGradientMode));
298 
299 			this.gradientStyle = value;
300 		}
301 	}
302 	#endregion
303 }
304 
305 internal class LinearGradientFillEditor : UITypeEditor
306 {
307 	#region Методы
308 	public override bool GetPaintValueSupported(ITypeDescriptorContext context)
309 	{
310 		return true;
311 	}
312 
313 	public override void PaintValue(PaintValueEventArgs e)
314 	{
315 		LinearGradientFill fill = e.Value as LinearGradientFill;
316 
317 		if(fill != null)
318 		{
319 			LinearGradientBrush brush = new LinearGradientBrush(e.Bounds, fill.ColorA, fill.ColorB, fill.GradientStyle);
320 
321 			e.Graphics.FillRectangle(brush, e.Bounds);
322 		}
323 		else
324 			base.PaintValue(e);
325 	}
326 	#endregion
327 }
Вернуться к списку исходников в категории Winforms
 
Наш Киев

Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта