protected override void OnPaint(PaintEventArgs e) { Image buttonImage = null; DUIFont textDUIFont = null; Color textColor = Color.Empty; Rectangle buttonRectange; if (this.Status == ButtonStatus.Down) { if (!string.IsNullOrEmpty(this._backImageSourceNameDown)) { buttonImage = DUISkinManager.GetCurrentSkinManager().GetImageSource(this._backImageSourceNameDown); } textDUIFont = DUISkinManager.GetCurrentSkinManager().GetFont(this._textFontNameDown); } else if (this.Status == ButtonStatus.Hover) { if (!string.IsNullOrEmpty(this._backImageSourceNameHover)) { buttonImage = DUISkinManager.GetCurrentSkinManager().GetImageSource(this._backImageSourceNameHover); } textDUIFont = DUISkinManager.GetCurrentSkinManager().GetFont(this._textFontNameHover); } else if (this.Status == ButtonStatus.Normal) { if (!string.IsNullOrEmpty(this._backImageSourceNameNormal)) { buttonImage = DUISkinManager.GetCurrentSkinManager().GetImageSource(this._backImageSourceNameNormal); } textDUIFont = DUISkinManager.GetCurrentSkinManager().GetFont(this._textFontNameNormal); } else { ; } //绘制背景颜色 e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle); //绘制按钮图片 if (buttonImage != null) { e.Graphics.DrawImage(buttonImage, new Rectangle((ClientRectangle.Width - buttonImage.Width) / 2, (ClientRectangle.Height - buttonImage.Height) / 2, buttonImage.Width, buttonImage.Height), 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel); } //------------------------------------------------------------------------------------- //绘制按钮文字 if (!string.IsNullOrEmpty(this.Text)) { Font textFont = null; if (textDUIFont == null || textDUIFont.Font == null) { //配置中没有指定标题字体的,使用系统默认字体 textFont = SystemFonts.DefaultFont; } else { textFont = textDUIFont.Font; } if (textDUIFont == null || textDUIFont.ForeColor.Equals(Color.Empty)) { textColor = Color.Red; //红色突出字体颜色加载失败 } else { textColor = textDUIFont.ForeColor; } //------------------------------ //计算按钮文字绘制位置 Size textSize = e.Graphics.MeasureString(this.Text, textFont).ToSize(); //计算文本绘制后的长度 int textInnerPositionX = 0; //按钮文字在按钮矩形内部的起始位置横坐标 int textInnerPositionY = 0; //按钮文字在按钮矩形内部的起始位置横坐标 //根据文字对齐方式计算文字在按钮矩形内部的起始位置 switch (this._textAlignment) { case ContentAlignment.TopLeft: textInnerPositionX = 0; textInnerPositionY = 0; break; case ContentAlignment.TopCenter: textInnerPositionX = (this.ClientRectangle.Width - textSize.Width) / 2; textInnerPositionY = 0; break; case ContentAlignment.TopRight: textInnerPositionX = this.ClientRectangle.Width - textSize.Width; textInnerPositionY = 0; break; case ContentAlignment.MiddleLeft: textInnerPositionX = 0; textInnerPositionY = (this.ClientRectangle.Height - textSize.Height) / 2; break; case ContentAlignment.MiddleCenter: textInnerPositionX = (this.ClientRectangle.Width - textSize.Width) / 2; textInnerPositionY = (this.ClientRectangle.Height - textSize.Height) / 2; break; case ContentAlignment.MiddleRight: textInnerPositionX = this.ClientRectangle.Width - textSize.Width; textInnerPositionY = (this.ClientRectangle.Height - textSize.Height) / 2; break; case ContentAlignment.BottomLeft: textInnerPositionX = 0; textInnerPositionY = this.ClientRectangle.Height - textSize.Height; break; case ContentAlignment.BottomCenter: textInnerPositionX = (this.ClientRectangle.Width - textSize.Width) / 2; textInnerPositionY = this.ClientRectangle.Height - textSize.Height; break; case ContentAlignment.BottomRight: textInnerPositionX = this.ClientRectangle.Width - textSize.Width; textInnerPositionY = this.ClientRectangle.Height - textSize.Height; break; } //计算按钮文字在整个背景上的绘制起始位置,并绘制文字 int textStartX = this.ClientRectangle.X + textInnerPositionX + this._textOffsetX; int textStartY = this.ClientRectangle.Y + textInnerPositionY + this._textOffsetY; using (Brush textBrush = new SolidBrush(textColor)) { e.Graphics.DrawString(this.Text, textFont, textBrush, textStartX, textStartY); } } }
/// <summary> /// 在双缓冲背景图上绘制当前按钮 /// </summary> /// <param name="backBufferBitmap">当前双缓冲绘图缓存的背景图片</param> /// <param name="g">与背景缓冲图绑定的绘图对象</param> /// <param name="offsetPoint">偏移点,用于消除窗口最大化时窗口边框厚度对点计算造成的误差</param> public void Render(Image backBufferBitmap, Graphics g, Point offsetPoint) { Image buttonImage = null; DUIFont textDUIFont = null; Color textColor = Color.Empty; Rectangle buttonRectange; //HoldDown标志的优先级高于按钮状态,若HoldDown为true,则按钮绘制为按下状态 if (this.HoldDown) { buttonImage = DUISkinManager.GetCurrentSkinManager().GetImageSource(this._downSourceName); textDUIFont = DUISkinManager.GetCurrentSkinManager().GetFont(this._downFontName); } //根据按钮状态采用不同的按钮贴图 else { if (this.Status == ButtonStatus.Down) { buttonImage = DUISkinManager.GetCurrentSkinManager().GetImageSource(this._downSourceName); textDUIFont = DUISkinManager.GetCurrentSkinManager().GetFont(this._downFontName); } else if (this.Status == ButtonStatus.Hover) { buttonImage = DUISkinManager.GetCurrentSkinManager().GetImageSource(this._hoverSourceName); textDUIFont = DUISkinManager.GetCurrentSkinManager().GetFont(this._hoverFontName); } else if (this.Status == ButtonStatus.Normal) { buttonImage = DUISkinManager.GetCurrentSkinManager().GetImageSource(this._normalSourceName); textDUIFont = DUISkinManager.GetCurrentSkinManager().GetFont(this._normalFontName); } else { ; } } //计算按钮在背景缓冲图上的矩形范围 buttonRectange = new Rectangle( CommonFunctions.GetImagePoint(backBufferBitmap, offsetPoint.X, offsetPoint.Y, this._position).X, CommonFunctions.GetImagePoint(backBufferBitmap, offsetPoint.X, offsetPoint.Y, this._position).Y, buttonImage.Width, buttonImage.Height); //在背景换冲图上绘制当前按钮 g.DrawImage(buttonImage, buttonRectange, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel); //------------------------------------------------------------------------------------- //绘制按钮文字 if (!string.IsNullOrEmpty(this._text)) { Font textFont = null; if (textDUIFont == null || textDUIFont.Font == null) { //配置中没有指定标题字体的,使用系统默认字体 textFont = SystemFonts.DefaultFont; } else { textFont = textDUIFont.Font; } if (textDUIFont == null || textDUIFont.ForeColor.Equals(Color.Empty)) { textColor = Color.Red; //红色突出字体颜色加载失败 } else { textColor = textDUIFont.ForeColor; } //------------------------------ //计算按钮文字绘制位置 Size textSize = g.MeasureString(this._text, textFont).ToSize(); //计算文本绘制后的长度 int textInnerPositionX = 0; //按钮文字在按钮矩形内部的起始位置横坐标 int textInnerPositionY = 0; //按钮文字在按钮矩形内部的起始位置横坐标 //根据文字对齐方式计算文字在按钮矩形内部的起始位置 switch (this._textAlignment) { case ContentAlignment.TopLeft: textInnerPositionX = 0; textInnerPositionY = 0; break; case ContentAlignment.TopCenter: textInnerPositionX = (buttonRectange.Width - textSize.Width) / 2; textInnerPositionY = 0; break; case ContentAlignment.TopRight: textInnerPositionX = buttonRectange.Width - textSize.Width; textInnerPositionY = 0; break; case ContentAlignment.MiddleLeft: textInnerPositionX = 0; textInnerPositionY = (buttonRectange.Height - textSize.Height) / 2; break; case ContentAlignment.MiddleCenter: textInnerPositionX = (buttonRectange.Width - textSize.Width) / 2; textInnerPositionY = (buttonRectange.Height - textSize.Height) / 2; break; case ContentAlignment.MiddleRight: textInnerPositionX = buttonRectange.Width - textSize.Width; textInnerPositionY = (buttonRectange.Height - textSize.Height) / 2; break; case ContentAlignment.BottomLeft: textInnerPositionX = 0; textInnerPositionY = buttonRectange.Height - textSize.Height; break; case ContentAlignment.BottomCenter: textInnerPositionX = (buttonRectange.Width - textSize.Width) / 2; textInnerPositionY = buttonRectange.Height - textSize.Height; break; case ContentAlignment.BottomRight: textInnerPositionX = buttonRectange.Width - textSize.Width; textInnerPositionY = buttonRectange.Height - textSize.Height; break; } //计算按钮文字在整个背景上的绘制起始位置,并绘制文字 int textStartX = buttonRectange.X + textInnerPositionX + this._textOffsetX; int textStartY = buttonRectange.Y + textInnerPositionY + this._textOffsetY; using (Brush textBrush = new SolidBrush(textColor)) { g.DrawString(this._text, textFont, textBrush, textStartX, textStartY); } } }
/// <summary> /// 读取皮肤控件样式配置 /// </summary> /// <param name="skinName">当前皮肤信息对象</param> /// <param name="xmlDoc">皮肤配置文件XML文档对象</param> /// <param name="parameterDict">皮肤控件样式字典</param> private void LoadSkinStyles(DUISkinInfo skinInfo, XmlDocument xmlDoc, IDictionary <string, DUIFont> fontDict, IDictionary <Type, IDictionary <string, IDUIStyle> > styleDict) { if (xmlDoc == null || fontDict == null || styleDict == null) { return; } XmlElement skinSettingElement = xmlDoc.DocumentElement; if (skinSettingElement.Name != "skinSetting") { throw new Exception("加载皮肤目录" + skinInfo.SkinName + "中的皮肤配置文件出错,根标签不合法!"); } //遍历所有二级节点 foreach (XmlNode childNode in skinSettingElement.ChildNodes) { //处理样式节点 if (childNode.Name == "styles") { foreach (XmlNode typeStyleNode in childNode.ChildNodes) { //全局Font if (typeStyleNode.Name == "fonts") { #region 全局Font处理 foreach (XmlNode fontNode in typeStyleNode.ChildNodes) { if (fontNode.Name == "font") { DUIFont newFont = new DUIFont(fontNode); if (fontDict.ContainsKey(newFont.Name)) { fontDict[newFont.Name] = newFont; } else { fontDict.Add(newFont.Name, newFont); } } } #endregion } //Label样式 else if (typeStyleNode.Name == "labelStyles") { #region labelStyles处理 foreach (XmlNode lableStyleNode in typeStyleNode.ChildNodes) { if (lableStyleNode.Name == "labelStyle") { LabelDUIStyle labelDUIStyle = new LabelDUIStyle(lableStyleNode); IDictionary <string, IDUIStyle> tmpDUIStyleDict = null; if (styleDict.ContainsKey(typeof(DUIStyleLabel))) { tmpDUIStyleDict = styleDict[typeof(DUIStyleLabel)]; } else { tmpDUIStyleDict = new Dictionary <string, IDUIStyle>(); styleDict.Add(typeof(DUIStyleLabel), tmpDUIStyleDict); } if (tmpDUIStyleDict.ContainsKey(labelDUIStyle.Name)) { tmpDUIStyleDict[labelDUIStyle.Name] = labelDUIStyle; } else { tmpDUIStyleDict.Add(labelDUIStyle.Name, labelDUIStyle); } } } #endregion } //TextBox样式 else if (typeStyleNode.Name == "textboxStyles") { #region textboxStyles处理 foreach (XmlNode textboxStyleNode in typeStyleNode.ChildNodes) { if (textboxStyleNode.Name == "textboxStyle") { TextBoxDUIStyle txtboxDUIStyle = new TextBoxDUIStyle(textboxStyleNode); IDictionary <string, IDUIStyle> tmpDUIStyleDict = null; if (styleDict.ContainsKey(typeof(DUIStyleTextBox))) { tmpDUIStyleDict = styleDict[typeof(DUIStyleTextBox)]; } else { tmpDUIStyleDict = new Dictionary <string, IDUIStyle>(); styleDict.Add(typeof(DUIStyleTextBox), tmpDUIStyleDict); } if (tmpDUIStyleDict.ContainsKey(txtboxDUIStyle.Name)) { tmpDUIStyleDict[txtboxDUIStyle.Name] = txtboxDUIStyle; } else { tmpDUIStyleDict.Add(txtboxDUIStyle.Name, txtboxDUIStyle); } } } #endregion } else if (typeStyleNode.Name == "buttonStyles") { #region buttonStyles处理 foreach (XmlNode buttonStyleNode in typeStyleNode.ChildNodes) { if (buttonStyleNode.Name == "buttonStyle") { ButtonDUIStyle buttonDUIStyle = new ButtonDUIStyle(buttonStyleNode); IDictionary <string, IDUIStyle> tmpDUIStyleDict = null; if (styleDict.ContainsKey(typeof(DUIStyleButton))) { tmpDUIStyleDict = styleDict[typeof(DUIStyleButton)]; } else { tmpDUIStyleDict = new Dictionary <string, IDUIStyle>(); styleDict.Add(typeof(DUIStyleButton), tmpDUIStyleDict); } if (tmpDUIStyleDict.ContainsKey(buttonDUIStyle.Name)) { tmpDUIStyleDict[buttonDUIStyle.Name] = buttonDUIStyle; } else { tmpDUIStyleDict.Add(buttonDUIStyle.Name, buttonDUIStyle); } } } #endregion } else { } } } } }