none
拖曳form時的問題 RRS feed

  • 問題

  • 各位大大好

    現在有一個Mdiform,一個Form1,及Panel1

    Panel1用control.add的方式加入至Mdiform之中

    而Form1用control.add的方式加入至Panel1之中

    當我拖曳Form1時,用control.add的方式加入至Mdiform之中

    此時,滑鼠在不放開的情況下,滑鼠的移動範圍被限制在panel1的範圍內,而沒辦法隨意移動

    不知道有沒有人可以幫忙解決這個問題呢? 謝謝各位

     

    2010年11月11日 上午 02:16

解答

  • 以Panel1為容器, 其中的元素當然無法移離容器的範圍, 否則就不叫做容器了
    • 已標示為解答 Sayke 2010年11月12日 上午 09:25
    2010年11月11日 上午 06:10

  • A.......
    我必需向你報告說明,你可以參考 tihs 大所說的一樣概念 : 「以Panel1為容器, 其中的元素當然無法移離容器的範圍, 否則就不叫做容器了 

    panel1 是個容器,所以只要你加入到 panel1 中的物件 (如你說的 Form1) 都只能在 Form1 中活動......這點是非常地動要!

     

    換個方式想一下 (比喻),或許比較 **好理解** (並非完全正確的說法喔~):

    你的  MdiForm 其實就是個 大容器,他包含著 panel1,也就是說 panel1 的活動範圍就只能在 Mdiform 中,不可能 panel1 跑超出 Mdiform 到其他的 Application 去吧?!
    同理可證, Form1 也只是在 Panel1 中,想想, Form1 的活動範圍有可能跑出去 panel1 外嗎?
    (答案應該是不可能的吧?!  除非你的 Panel1的範圍 與 Mdiform 的範圍一樣的大! 即把 panel1.Dock = System.Windows.Forms.DockStyle.Left; >> 設為 Fill )

    不知道我這樣的比方你能比較了解嗎?

    這樣或許你就能了解我為什麼請你註解掉上述的 Code 的原因了吧?!

     

     


    逐步學習,逐夢踏實;腳步要踩穩,這樣下一步才不會跌倒。 http://www.dotblogs.com.tw/nobel12
    • 已標示為解答 Sayke 2010年11月12日 上午 09:25
    2010年11月12日 上午 08:05

所有回覆

  • 以Panel1為容器, 其中的元素當然無法移離容器的範圍, 否則就不叫做容器了
    • 已標示為解答 Sayke 2010年11月12日 上午 09:25
    2010年11月11日 上午 06:10
  • 首先 感謝this大大的解惑

    "當我拖曳Form1時,用control.add的方式加入至Mdiform之中"

    我在拖曳form1時,已將form add至mdiform之中了

    那麼form1在這個時候還算是Panel1之中的元素嗎?

    2010年11月11日 上午 06:36
  • hi,

    可能是我理解力不太好,不知道你有沒有程式碼可以提供一下,方便了解你的問題!


    逐步學習,逐夢踏實;腳步要踩穩,這樣下一步才不會跌倒。 http://www.dotblogs.com.tw/nobel12
    2010年11月11日 上午 09:17
  • MdiForm 中的程式碼
    
    Form1 F1 = new Form1();
        public MDIParent1()
        {
          InitializeComponent();;
          F1.MdiParent = this;
          F1.mdiParent = this;
          F1.TopLevel = false;
          panel1.Dock = System.Windows.Forms.DockStyle.Left;
          panel1.Controls.Add(F1);
          F1.Size = panel1.Size;
          F1.Show();
        }
    
    
    Form1中的程式碼
    
    public partial class Form1 : Form
      {
        public MDIParent1 mdiParent;
        public int i=0;
        public Form1()
        {
          InitializeComponent();
          //
        }
        internal static int WM_NCHITTEST = 0x24;
        protected override void WndProc(ref  Message m)
        {
          if (m.Msg == WM_NCHITTEST)//拖動視窗標題欄事件
          {
            i++;
            if (i > 1)
            {
              i = 0;
              mdiParent.Controls.Add(this);
            }
          }
          else base.WndProc(ref  m);
        }
      }
    
    程式碼大致如上,在拖曳form1時,滑鼠不放開的狀況下,滑鼠可以移動的範圍被限制在panel1中<br/>
    <br/>
    麻煩各位大大幫忙看看~~謝謝<br/>
    
    

    2010年11月12日 上午 03:04
  • hi~

    剛看了一下你的程式碼:

    我先跟你再 check一下,你是想要該 Form1 的活動 "只是在 panel1 中" 移動,還是 要在 **整個** MdiForm 中移動?

     

    如果是在 panel1 中移動,你寫的就是沒有錯.....
    如果說你不要把 Form1 限制在 panel1 中,那麼......只要把 MdiForm 碼改成

    Form1 F1 = new Form1();
      public MDIParent1()
      {
       InitializeComponent();;
       F1.MdiParent = this;
       F1.mdiParent = this;
       F1.TopLevel = false;
    
       //panel1.Dock = System.Windows.Forms.DockStyle.Left;
       //panel1.Controls.Add(F1);
       //F1.Size = panel1.Size;
    
       F1.Show();
      }
    
    

    這樣就行啦~  

    再看看這是不是你要的?



    逐步學習,逐夢踏實;腳步要踩穩,這樣下一步才不會跌倒。 http://www.dotblogs.com.tw/nobel12
    2010年11月12日 上午 06:40
  • 首先 感謝Nobel12大大的回答

    我先說我現在的情況:

    在程式一執行時,form1是add在panel1之中

    但當我在拖動form1時,則將form1 add至mdiform底下

    而我希望在上述情況下,form1的拖動範圍是在mdiform之中,不是被限制在panel1之中

    不知道有沒有方法可以解決這個問題??

    麻煩大大再看一看~~謝謝...

    2010年11月12日 上午 07:19

  • A.......
    我必需向你報告說明,你可以參考 tihs 大所說的一樣概念 : 「以Panel1為容器, 其中的元素當然無法移離容器的範圍, 否則就不叫做容器了 

    panel1 是個容器,所以只要你加入到 panel1 中的物件 (如你說的 Form1) 都只能在 Form1 中活動......這點是非常地動要!

     

    換個方式想一下 (比喻),或許比較 **好理解** (並非完全正確的說法喔~):

    你的  MdiForm 其實就是個 大容器,他包含著 panel1,也就是說 panel1 的活動範圍就只能在 Mdiform 中,不可能 panel1 跑超出 Mdiform 到其他的 Application 去吧?!
    同理可證, Form1 也只是在 Panel1 中,想想, Form1 的活動範圍有可能跑出去 panel1 外嗎?
    (答案應該是不可能的吧?!  除非你的 Panel1的範圍 與 Mdiform 的範圍一樣的大! 即把 panel1.Dock = System.Windows.Forms.DockStyle.Left; >> 設為 Fill )

    不知道我這樣的比方你能比較了解嗎?

    這樣或許你就能了解我為什麼請你註解掉上述的 Code 的原因了吧?!

     

     


    逐步學習,逐夢踏實;腳步要踩穩,這樣下一步才不會跌倒。 http://www.dotblogs.com.tw/nobel12
    • 已標示為解答 Sayke 2010年11月12日 上午 09:25
    2010年11月12日 上午 08:05
  • 好吧..我了解了

    感謝各位大大的回應~

    2010年11月12日 上午 09:33