C#制作高仿360安全衛士窗體(三)- 文本框

          距上篇C#制作高仿360安全衛士窗體(二)也將近一個多月了,這個月事情還是像往常一樣的多。不多我也樂在其中,畢竟我做的是我喜歡做的東西。今天特地抽空把怎么制作文本框寫一下。同時也希望有愛好這些玩意的同仁和我進行交流…
          文本框的開發比起按鈕開發還是有一點不同,因為我這里主要是給文本框做美化,所以不需要完完全全的進行自己開發。只是重寫它的某些事件,然后展現不同的效果。下面是運行后的效果。
          20130911154725
          這個文本框實現了多行以及鼠標進入移出等事件的效果,那么開發這個素材只有一個也是從之前360皮膚包里面提取出來進行修改的:
          Textbox
          一、嵌入資源
          將以上素材另存為,在解決方案中Images目錄里面建立一個TextBoxImages文件夾,將圖片素材拷貝進去,并設置圖片屬性中生成操作選擇為“嵌入的資源”。

          二、添加控件
          資源嵌入之后再在ControlEx目錄中建立一個TextBoxEx文件夾,在該文件夾下創建一個名為TextBoxEx的用戶控件。該用戶控件是用來實現皮膚變化,而真正的TextBox需要再從工具欄中拖一個到用戶控件中。調整用戶控件的寬高為為160*22,TextBox的寬高為154*16,TextBox的Margin屬性為3,3,3,3,TextBox的BorderStyle屬性值為None,將屬性都調整完畢之后就可以開始進行代碼的處理了。
          20130911160133

          三、編碼
          該控件的主要處理方法都比較簡單,主要思路是重寫TextBox的狀態,然后再在用戶控件上根據狀態繪制不同的樣式。
          1、變量聲明
          [code lang=”csharp”]#region 聲明
          private Bitmap _TextBoxBackImg = ImageObject.GetResBitmap(“FANGSI.UI.Images.TextBoxImages.Textbox.png”);
          private State state = State.Normal;
          private bool _Isico = false;
          private Bitmap _Ico;
          private Padding _IcoPadding = new Padding(3, 3, 0, 0);
          //枚鼠標狀態
          private enum State
          {
          ??? Normal = 1,
          ??? MouseOver = 2,
          ??? MouseDown = 3,
          ??? Disable = 4,
          ??? Default = 5
          }
          #endregion[/code]
          2、構造參數處理,初始化控件的屬性
          [code lang=”csharp”]#region 構造
          public TextBoxEx()
          {
          ??? InitializeComponent();
          ??? this.SetStyle(ControlStyles.UserPaint, true);
          ??? this.SetStyle(ControlStyles.DoubleBuffer, true);
          ??? this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
          ??? this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
          ??? this.SetStyle(ControlStyles.StandardDoubleClick, false);
          ??? this.SetStyle(ControlStyles.Selectable, true);
          ??? this.BackColor = Color.Transparent;
          }
          #endregion[/code]
          3、屬性定義,其中可以加入自己想要功能的特殊字段再根據自己的需要進行處理
          [code lang=”csharp”]#region 屬性

          [Category(“放肆雷特擴展屬性”), Description(“輸入最大字符數”)]
          public int MaxLength
          {
          get { return BaseText.MaxLength; }
          set { BaseText.MaxLength = value; }

          }

          [Category(“放肆雷特擴展屬性”), Description(“與控件關聯的文本”)]
          public new string Text
          {
          get
          {
          return BaseText.Text;
          }
          set
          {
          BaseText.Text = value;
          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“將控件設為密碼顯示”)]
          public bool IsPass
          {
          get
          {
          return BaseText.UseSystemPasswordChar;
          }
          set
          {
          BaseText.UseSystemPasswordChar = value;
          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“密碼顯示字符”)]
          public char PassChar
          {
          get
          {
          return BaseText.PasswordChar;
          }
          set
          {
          BaseText.PasswordChar = value;
          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“將控件設為多行文本顯示”)]
          public bool Multiline
          {
          get
          {
          return BaseText.Multiline;
          }
          set
          {
          BaseText.Multiline = value;
          if (value)
          {
          BaseText.Height = this.Height – 6;
          }
          else
          {
          base.Height = 22;
          BaseText.Height = 16;
          this.Invalidate();
          }

          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“設置控件中文本字體”)]
          public Font font
          {
          get
          {
          return BaseText.Font;
          }
          set
          {
          BaseText.Font = value;
          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“將控件設為只讀”)]
          public bool ReadOnly
          {
          get
          {
          return BaseText.ReadOnly;
          }
          set
          {
          BaseText.ReadOnly = value;
          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“多行文本的編輯行”)]
          public String[] lines
          {
          get
          {
          return BaseText.Lines;
          }
          set
          {
          BaseText.Lines = value;
          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“是否顯示圖標”)]
          public bool Isico
          {
          get
          {
          return _Isico;
          }
          set
          {
          _Isico = value;
          if (value)
          {
          if (_Ico != null)
          {
          BaseText.Location = new Point(_IcoPadding.Left + _Ico.Width, 3);
          BaseText.Width = BaseText.Width – _IcoPadding.Left – _Ico.Width;
          }
          else
          {
          BaseText.Location = new Point(25, 3);
          BaseText.Width = BaseText.Width – 25;
          }
          }
          this.Invalidate();
          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“圖標文件”)]
          public Bitmap Ico
          {
          get
          {
          return _Ico;
          }
          set
          {
          _Ico = value;
          }
          }

          [Category(“放肆雷特擴展屬性”), Description(“控件內部間距,圖標文件”)]
          public Padding IcoPadding
          {
          get { return _IcoPadding; }
          set
          {
          _IcoPadding = value;
          this.Invalidate();
          }
          }
          #endregion[/code]
          4、委托,委托圖標點擊事件
          [code lang=”csharp”]#region 委托
          public event EventHandler IcoOnclick;
          #endregion[/code]
          5、方法處理
          [code lang=”csharp”]#region 方法
          protected override void OnPaint(PaintEventArgs e)
          {
          Rectangle rc = this.ClientRectangle;
          Graphics g = e.Graphics;
          ImageDrawRect.DrawRect(g, _TextBoxBackImg, rc, Rectangle.FromLTRB(10, 10, 10, 10), (int)state, 5);
          if (_Isico)
          {
          if (_Ico != null)
          {
          g.DrawImage(_Ico, new Point(_IcoPadding.Left, _IcoPadding.Top));
          }
          }
          base.OnPaint(e);
          }

          private void TextBoxEx_Resize(object sender, EventArgs e)
          {
          if (this.Height > 22)
          {
          Multiline = true;
          }
          else
          {
          this.Height = 22;
          Multiline = false;
          }
          }

          private void NotifyIcoOnclick()
          {
          if (IcoOnclick != null)
          {
          IcoOnclick(this, EventArgs.Empty);
          }
          }

          public void AppendText(string ss)
          {
          BaseText.AppendText(ss);
          }

          private void BaseText_MouseEnter(object sender, EventArgs e)
          {
          state = State.MouseOver;
          this.Invalidate();
          }

          private void BaseText_MouseLeave(object sender, EventArgs e)
          {
          state = State.Normal;
          this.Invalidate();
          }

          private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
          {
          if (_Ico != null)
          {
          if (new Rectangle(_IcoPadding.Left, _IcoPadding.Top, _Ico.Width, _Ico.Height).Contains(e.X, e.Y))
          {
          NotifyIcoOnclick();
          }
          }
          }

          private void TextBoxEx_MouseEnter(object sender, EventArgs e)
          {
          state = State.MouseOver;
          this.Invalidate();
          }

          private void TextBoxEx_MouseLeave(object sender, EventArgs e)
          {
          state = State.Normal;
          this.Invalidate();
          }
          #endregion[/code]
          OK,寫完收工…這個控件功力強大,使用簡單很符合中國程序猿的使用習慣直接從工具欄拖放即可..如果還有不懂的歡迎進行留言。下一篇就開始講360安全衛士最上面一排的水晶按鈕的制作敬請期待喔。。

          本博客所有文章如無特別注明均為原創

          如果覺得對你有幫助,可以通過下方打賞對作者表示鼓勵

          本文采用知識共享署名-非商業性使用-相同方式共享

          如若轉載,請注明出處:《C#制作高仿360安全衛士窗體(三)- 文本框》http://www.solariosolutions.com/519.html

          (0)
          打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
          鋒哥的頭像鋒哥管理員
          上一篇 2013年9月9日 09:15
          下一篇 2013年9月22日 10:24

          相關推薦

          發表回復

          登錄后才能評論

          評論列表(10條)

          • 鯊魚
            鯊魚 2013年10月28日 10:28

            當文本框的長度過小的時候,左右邊框不見了。BUG怎么解決?

            • 胖子的頭像
              鋒哥 2013年10月28日 10:34

              @鯊魚文本框長度最少不能小于兩邊邊框的長度。在改變大小時做下控制限制最小長度就沒有問題了。

            • 鯊魚
              鯊魚 2013年10月28日 11:02

              @鋒哥兩邊邊框的長度是什么?不是很理解,例如文本框長度是50,那么兩邊邊框的長度應該是多少呢?
              另外,我想問的我的確不需要那么長的文本框怎么辦呢?

            • 胖子的頭像
              鋒哥 2013年10月28日 11:17

              @鯊魚這個長度和你在寫控件的時候用的邊距有關系,TextBox的Margin屬性為3,3,3,3,那么再加上你的文本框長度。那就是56px,最小寬度不能低于8px文本框就算1像素的邊框。

            • 鯊魚
              鯊魚 2013年10月28日 11:15

              @鋒哥好像,文本框的長度是沒有小于兩邊邊框的長度,如果文本框是20px,兩邊邊框才6px,但是這時,已經消失了左邊的邊框。

            • 胖子的頭像
              鋒哥 2013年10月28日 11:24

              @鯊魚你先要理解這個文本框是怎么出來的,是一個文本框和一個用戶控件作為背景通過重寫文本框的鼠標移出移入事件進行效果的處理。如果左邊的邊框消失了,是不是里面的文本框把左邊的邊框遮住了呢?你在縮小的時候控制一下文本框相對于用戶控件的左邊距呢看看可以不

            • 鯊魚
              鯊魚 2013年10月28日 11:51

              @鋒哥我將文本框的起點坐標設在X=25,左邊框還是會消失。
              我嘗試DrawRect方法測試。
              if (r.Height > img.Height && r.Width <= img.Width / Totalindex)
              {
              r1 = new Rectangle(x, y, img.Width / Totalindex, lr.Top);
              r2 = new Rectangle(x1, y1, r.Width, lr.Top);
              g.DrawImage(img, r2, r1, GraphicsUnit.Pixel);

              r1 = new Rectangle(x, y + lr.Top, img.Width / Totalindex, img.Height - lr.Top - lr.Bottom);
              r2 = new Rectangle(x1, y1 + lr.Top, r.Width, r.Height - lr.Top - lr.Bottom);
              if ((lr.Top + lr.Bottom) == 0) r1.Height = r1.Height - 1;
              g.DrawImage(img, r2, r1, GraphicsUnit.Pixel);

              r1 = new Rectangle(x, y + img.Height - lr.Bottom, img.Width / Totalindex, lr.Bottom);
              r2 = new Rectangle(x1, y1 + r.Height - lr.Bottom, r.Width, lr.Bottom);
              g.DrawImage(img, r2, r1, GraphicsUnit.Pixel);
              }

              這段代碼,分別重繪了 上 、左右、下的邊框。發現唯一的變量是控件本身的寬度(控制高度不變)
              也就是說邊框消失和控件本身的長度變化有關。結果還是還沒有搞懂!
              不過謝謝放肆大哥了。

            • 鯊魚
              鯊魚 2013年10月28日 11:56

              @鋒哥我想應該是 取出圖品的上邊框和左邊框的比例問題。由于縮小,所以左邊框變的極細,外觀上好像消失了。
              做法有兩個!
              1、縮小時,左邊框的畫法和放大時一樣,分別左上,左,左下都重繪。
              2、改變原始圖片的左邊框寬度和上邊框寬度的比例。 :eek:

            • 胖子的頭像
              鋒哥 2013年10月28日 12:00

              @鯊魚繪制的圖片是不會按照比例縮小的。你把圖片放大就可以看出,并沒有質量的損失。你說的這個bug主要得改變用戶控件里面的那個文本框的大小來解決。

          • 1111
            1111 2013年10月20日 09:38

            :lol:

          国产厨房乱子伦露脸,XXXXAAA欧美,日本 888 XXXX,国产欧美日韩一区二区图片