本文共 14338 字,大约阅读时间需要 47 分钟。
1, 看看成果:player_skin.bmp
1 1 17 17 icon.ico 164 39 183 58 play.bmp 164 39 183 58 pause.bmp 145 39 164 58 stop.bmp 202 39 221 58 next.bmp 183 39 202 58 prev.bmp 249 39 268 58 mute.bmp 221 39 240 58 open.bmp 152 92 188 114 equalizer.bmp 188 92 224 114 playlist.bmp 224 92 260 114 lyric.bmp 18 24 124 84 240 3 247 10 minimize.bmp 253 3 260 10 minimode.bmp 266 3 273 10 close.bmp 274 20 283 84 volume_fill.bmp true 147 20 268 31 #ff9933 simsong9 MiddleLeft 175 63 235 74 number.bmp MiddleRight 13 98 55 109 #ff9933 simsong9 MiddleLeft 59 98 129 109 #ff9933 simsong9 MiddleLeft Orange #ff00ff
164 39 183 58 play.bmp
public interface ISkinElement { string Name { get; } Position Position { get; set; } ElementStatus Status { get; set; } void Paint(Graphics g); event SkinElementStatusChangedHandler SkinElementStatusChanged; }
////// 位置信息,由左上角X、Y坐标和右下角X、Y坐标组成 /// public struct Position { public int Left; public int Top; public int Right; public int Bottom; public Position(int left, int top, int right, int bottom) { this.Left = left; this.Top = top; this.Right = right; this.Bottom = bottom; } }
////// 元素状态 /// public enum ElementStatus { Normal, MouseHover, MouseDown, Disabled }
////// 播放元素(播放按钮) /// public class PlayElement : ISkinElement { private Position position; private string image = string.Empty; [NonSerialized] private ElementStatus status; #region SkinElement 成员 ////// 获取该元素的名称 /// public string Name { get { return "PlayElement"; } } ////// 获取或设置该元素的位置 /// public Position Position { get { return this.position; } set { this.position = value; } } ////// 绘制该元素 /// public void Paint(Graphics g) { SkinPainter.PaintSkinElement(g, this.position, this.image, this.status); } ////// 获取或设置该对象的状态 /// public ElementStatus Status { get { return this.status; } set { if (this.status != value) { this.status = value; this.OnSkinElementStatusChanged(new SkinElementStatusChangedArges(value)); } } } ////// 当元素状态改变时发生 /// public event SkinElementStatusChangedHandler SkinElementStatusChanged; #endregion protected void OnSkinElementStatusChanged(SkinElementStatusChangedArges arg) { if (this.SkinElementStatusChanged != null) { this.SkinElementStatusChanged(this, arg); } } ////// 获取或设置该对象对应的图片文件(相对于皮肤文件夹的相对路径) /// public string Iamge { get { return this.image; } set { this.image = value; } } }
////// 绘制普通的类似于按钮的皮肤元素。 /// 进度条、音量控制等不应该采用此函数 /// /// 用其进行绘制 /// 绘制的位置 /// 绘制的图片的路径(相对路径,在此之前应该确定SkinRootDir属性已经被设置) /// 皮肤元素的当前状态 public static void PaintSkinElement(Graphics g, Position pos, string imgPath, ElementStatus status) { ImageAttributes imgAttributes = new ImageAttributes(); imgAttributes.SetColorKey(transparentKey, transparentKey); try { Image img = Image.FromFile(SkinRootDir + System.IO.Path.DirectorySeparatorChar + imgPath); Rectangle destRect = new Rectangle(pos.Left, pos.Top, pos.Right - pos.Left, pos.Bottom - pos.Top); int x = 0; int y = 0; int width = img.Width / 4; int height = img.Height; switch (status) { case ElementStatus.Normal: x = 0; break; case ElementStatus.MouseHover: x = width; break; case ElementStatus.MouseDown: x = 2 * width; break; case ElementStatus.Disabled: x = 3 * width; break; default: break; } g.DrawImage(img, destRect, x, y, width, height, GraphicsUnit.Pixel, imgAttributes); } catch { } }
////// 确定在指定的皮肤元素集合中,指定的点包含在哪个元素中. /// 如果同时包含在多个元素中,则以最内层的那个为准. /// /// 元素集合,在它们中间查找 /// 要进行判断的点 ///注意:由于元素之间没有Z轴层次关系,所以不应该让两个元素处在相交却不包含的关系中 ///如果不包含在指定的任一元素中,则返回null,否则返回包含该点的元素 public static ISkinElement FindSkinElementFormPosition(ListelementList, Point loc) { Rectangle rect = new Rectangle(); Rectangle lastRect = Rectangle.Empty; ISkinElement res = null; foreach (ISkinElement element in elementList) { rect.X = element.Position.Left; rect.Y = element.Position.Top; rect.Width = element.Position.Right - element.Position.Left; rect.Height = element.Position.Bottom - element.Position.Top; if (rect.Contains(loc)) { if (lastRect == Rectangle.Empty || lastRect.Contains(rect)) { lastRect = rect; res = element; } } } return res; }
private void FormMain_MouseClick(object sender, MouseEventArgs e) { ISkinElement element = Helper.FindSkinElementFormPosition(this.skinMainFormElementList, e.Location); if (element != null) { switch (element.Name) { case "ExitElement": this.Close(); break; default: break; } } }
private void FormMain_MouseMove(object sender, MouseEventArgs e) { ISkinElement element = Helper.FindSkinElementFormPosition(this.skinMainFormElementList, e.Location); if (element != null && element.Status != ElementStatus.MouseHover && element.Status != ElementStatus.Disabled) { element.Status = ElementStatus.MouseHover; this.UpdateSkinElement(element); } }
////// 更新指定皮肤元素(重新绘制皮肤的指定区域) /// /// 要被重绘的元素 private void UpdateSkinElement(ISkinElement element) { Rectangle updateRect = new Rectangle( element.Position.Left, element.Position.Top, element.Position.Right - element.Position.Left, element.Position.Bottom - element.Position.Top); this.Invalidate(updateRect); this.Update(); }
转载地址:http://fjiob.baihongyu.com/