[筆記文] 討論區 如何設計一個透明的容器 For .Net (二)

  • 3220
  • 0

[筆記文] 討論區 如何設計一個透明的容器 For .Net (二)

 

1 . 來源 :

程式設計俱樂部 http://www.programmer-club.com.tw/

2 . 網友需求 : 

http://www.programmer-club.com.tw/showsametitleN/csharp/12734.html

 

經過實驗您所提供的方式, 結果如下 :
1. 建立一個 usercontrol.cs, 並在其建構子內加上 this.BackColor=Color.Transparent, 然後
    執行 '建置方案', 再回主劃面, 拉入這個 usercontrol 時, 出現 '控制項不支援透明的背景色彩'
    錯誤訊息. 
 
2. 如果在其建構子內加上 :
     SetStyle(ControlStyles.UserPaint, true);
     SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    然後才加上 :
     this.BackColor = Color.Transparent;
     
    此時, 執行 '建置方案', 再回主劃面, 就可以拉入這個 usercontrol, 但是 此 usercontrol 看起來
    是 '透明的', 其實他只是跟其 parent (即 mainform) 的 backgroup 同色而已, 因為如果在此
    usercontrol 與 mainform 中間放置一個有顏色的 panel, 則此 panel 就會被此 usercontrol
    覆蓋住. 這就是我在本文 (問題說明) 內所提到的疑問, 請問是否有什麼方法, 可以使此 usercontrol
    不覆蓋住 panel, 而能透過此 usercontrol 看到 panel ?

3 . 想法 : 

推掉之前的想法,改用 Form 的屬性 新增 視窗 Form2

                Form2.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

            Form2.TransparencyKey = SystemColors.Control;

            Form2. BackColor = SystemColors.Control;
建立完全透明的控制項,並在 Form2 新增設定 Form2 可移動區域的程式碼 get set 欄位
並把滑鼠控制移動寫在 Form2 裡,讓 Form1 控制的程式碼簡單化。
然後再 Form1 
//設定移動區域
form2.show();
可以在 Form1 控制 form2 的控制項可移動區域,和起始區域
等等。 PS : 特別注意,當你 form2 完全透明,滑鼠是無法點到 form2 的。
故會再 Form2 繪製 邊框讓滑鼠可以點選

 

4 . 看註解說故事 : 


       // Form2 程式碼
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            //設定背景色,透明色彩,FormBorderStyle
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.TransparencyKey = SystemColors.Control;
            this.BackColor = SystemColors.Control;
        }
        //設定內部變數當左鍵滑鼠點下記錄 X,Y 座標
        private int downX, downY;

        //設定內部變數設定是否可以繼續滑鼠點選移動
        private Boolean IsMove =false;

       //重點設定,因為設定 完全透明 所以必須讓滑鼠有點選的框框
        //要不當完全透明時,是無法直接點到視窗控制項(Form2)
        private void Form2_Paint(object sender, PaintEventArgs e)
        {
            //繪製邊框
            e.Graphics .DrawRectangle (new Pen (Color.Black,3 ),3,3,this.Width -6,this.Height -6);
        }

        //設定建立要限制移動的區域,此指的就是你的主視窗
        //上下左右邊界的 get Set 屬性欄位
        private int mySetLeft, mySetTop, mySetRight, mySetBottom;
        public int SetLeft {   get { return mySetLeft; }   set { mySetLeft = value; } }
        public int SetTop {    get { return mySetTop; }    set { mySetTop = value; }  }
        public int SetRight { get { return mySetRight; } set { mySetRight = value; } }
        public int SetBottom { get { return mySetBottom; } set { mySetBottom = value; } }

        //判斷是否移動到設定的邊界,並停止移動
        private void Form2_Move(object sender, EventArgs e)
        {
            if (this.Left <= SetLeft) { this.IsMove = false; this.Left = this.SetLeft; }
            if (this.Top <= SetTop) { this.IsMove = false; this.Top = this.SetTop; }
            if (this.Right >= SetRight) { this.IsMove = false; this.Left = this.SetRight - this.Width; }
            if (this.Bottom >= SetBottom) { this.IsMove = false; this.Top = this.SetBottom - this.Height; }

        }

        //以下滑鼠按住邊框左鍵移動
        private void Form2_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                if (this.IsMove == true)
                {
                    this.Left += (e.X - downX);
                    this.Top += (e.Y - downY);
                }
                else { this.IsMove = true; }
            }
                     
        }

        private void Form2_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left) {
                downX = e.X;
                downY = e.Y;
               
            }
        }
      
    }
}

Form1 程式碼


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //就是一個 button 控制項顯示 Form2 ,並設定可移動區域
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            //設定 f2 (Form2) 所能移動的區域
            f2.SetLeft = this.Left;
            f2.SetTop = this.Top;
            f2.SetRight  = this.Right  ;
            f2.SetBottom  = this.Bottom ;
            //顯示
            f2.Show(this);
           
            
        }
         //改變背景色彩
        private void button3_Click(object sender, EventArgs e) {
              this.BackColor = Color.Red;

        }
    }
}

5 . 執行畫面

 

Form2 設計階段畫面和執行階段畫面

 

顯示透明容器 Form2 

 

改變 Form1 背景色

 

拖移 Form2 

 

 

Form2 可移動區域限制

 

6 . 以上參考


==================================================== 
有些事就該把它當作一種回憶...
一種放在記憶中任隨時間慢慢的侵蝕慢慢的隨風漂泊........
 ===================================================
~~~請支持 點部落 格,點點下方的廣告吧~~~