Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        /// <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);
                }
            }
        }
Esempio n. 3
0
        /// <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
                        {
                        }
                    }
                }
            }
        }