|
|
|
 |
 |
Исходник |
 |
|
 |
 |
|
Автор:
|
|
|
Название:
|
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 |
|
|
 |
 |
 |
 |
|
|