none
VB.net 2008 formBorderStyle轉成none後如何讓用戶拖曳視窗 RRS feed

  • 問題

  • 原本的是頭頂有一行位置讓用戶拖曳的

     

    但為了配合背景圖片, 所以要用none, 但設定成none後發現, 不能拖曳視窗...

     

    請問如何做到即使拖曳form的中間也能拖曳視窗?

     

    謝謝

    2010年8月14日 上午 07:45

解答

  • C#怎样实现无边框窗体拖动

    http://topic.csdn.net/u/20091109/20/7ab9c87b-6a11-4b28-9882-ff2e624eee62.html

    Public Class Form1
      Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = 163 AndAlso Me.ClientRectangle.Contains(Me.PointToClient(New Point(m.LParam.ToInt32()))) AndAlso m.WParam.ToInt32() = 2 Then
          m.WParam = 1
        End If
        MyBase.WndProc(m)
        If m.Msg = 132 AndAlso m.Result.ToInt32() = 1 Then
          m.Result = 2
        End If
      End Sub
    End Class
    
    

    歡迎參觀我的Blog.NET菜鳥自救會
    2010年8月14日 上午 08:43
    版主
  • 不需要捨近求遠,VB2008 線上手冊就有。

    ms-help://MS.MSDNQTR.v90.cht/dv_mancli/html/2cf1744b-60f1-45df-b757-6a769a12e277.htm

    HOW TO:建立非矩形 Windows Form

    [前略]

    若要撰寫移動表單的程式碼 (選擇性)

    1. 建立拖曳就可移動表單的程序。輸入與下列類似的程式碼,以建立新的 Point 物件。在計算如何移動表單時,這會做為變數。isMouseDown 欄位是用於追蹤使用者是否按住滑鼠按鍵。表單應該只在按住滑鼠時移動。

      Visual Basic  複製程式碼
      Private mouseOffset As Point
      Private isMouseDown As Boolean = False
      
      

       

      C#  複製程式碼
      private Point mouseOffset;
      private bool isMouseDown = false;
    2. 為表單的 MouseDown 事件建立事件處理常式。在處理常式中加入程式碼,讓使用者按一下表單任何一處,即可拖曳它。如需建立事件處理常式的詳細資訊,請參閱 HOW TO:使用設計工具建立事件處理常式

      輸入與下列類似的程式碼,根據滑鼠指標的目前位置,將座標指定給 mouseOffset 變數。在下列的程式碼中,請注意位移 (Offset) 位置是使用關於框線大小 (FrameBorderSize.Width) 和標題列高度 (CaptionHeight) 的系統資訊進行計算的。測試位移時必須將這些情況納入考量,因為有些測量是使用用戶端區域,而有些則是使用螢幕座標進行的。因此,位移等於框線寬度加上標題高度,再加上表單用戶端區域的位移。

      Visual Basic  複製程式碼
      Private Sub Form1_MouseDown(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseDown
        Dim xOffset As Integer
        Dim yOffset As Integer
      
        If e.Button = MouseButtons.Left Then
          xOffset = -e.X - SystemInformation.FrameBorderSize.Width
          yOffset = -e.Y - SystemInformation.CaptionHeight - _
              SystemInformation.FrameBorderSize.Height
          mouseOffset = New Point(xOffset, yOffset)
          isMouseDown = True
        End If
      End Sub
      
      

       

      C#  複製程式碼
      private void Form1_MouseDown(object sender, 
        System.Windows.Forms.MouseEventArgs e)
      {
        int xOffset;
        int yOffset;
      
        if (e.Button == MouseButtons.Left) 
        {
          xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
          yOffset = -e.Y - SystemInformation.CaptionHeight - 
            SystemInformation.FrameBorderSize.Height;
          mouseOffset = new Point(xOffset, yOffset);
          isMouseDown = true;
        }  
      }
      C# 注意事項:

      請務必加入程式碼以啟用事件處理常式。使用下列範例的程式碼,此程式碼看起來像是這樣:

        複製程式碼
      this.MouseDown += new
        System.Windows.Forms.MouseEventHandler
        (this.Form1_MouseDown);
    3. 為表單的 MouseMove 事件建立事件處理常式。

      輸入與下列類似的程式碼。當按下滑鼠左鍵並拖曳滑鼠時,表單的 Location 屬性會設定成新的位置。

      Visual Basic  複製程式碼
      Private Sub Form1_MouseMove(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseMove
        If isMouseDown Then
          Dim mousePos As Point = Control.MousePosition
          mousePos.Offset(mouseOffset.X, mouseOffset.Y)
          Location = mousePos
        End If
      End Sub
      
      

       

      C#  複製程式碼
      private void Form1_MouseMove(object sender, 
        System.Windows.Forms.MouseEventArgs e)
      {
        if (isMouseDown) 
        {
          Point mousePos = Control.MousePosition;
          mousePos.Offset(mouseOffset.X, mouseOffset.Y);
          Location = mousePos;
        }
      }
      C# 注意事項:

      請務必加入程式碼以啟用事件處理常式。使用下列範例的程式碼,此程式碼看起來像是這樣:

        複製程式碼
      this.MouseMove += new
        System.Windows.Forms.MouseEventHandler
        (this.Form1_MouseMove);
    4. 為表單的 MouseUp 事件建立事件處理常式。輸入與下列類似的程式碼。

      Visual Basic  複製程式碼
      Private Sub Form1_MouseUp(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        ' Changes the isMouseDown field so that the form does
        ' not move unless the user is pressing the left mouse button.
        If e.Button = MouseButtons.Left Then
          isMouseDown = False
        End If
      End Sub
      
      

       

      C#  複製程式碼
      private void Form1_MouseUp(object sender, 
        System.Windows.Forms.MouseEventArgs e)
      {
        // Changes the isMouseDown field so that the form does
        // not move unless the user is pressing the left mouse button.
        if (e.Button == MouseButtons.Left) 
        {
          isMouseDown = false;
        }
      }

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年8月14日 上午 09:24
  • Hi,

    這也可以參考一下

    [C#][VB.NET]自定義.NET WindowForm表單介面


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年8月16日 上午 04:16

所有回覆

  • SEE

    WM_NCLBUTTONDOWN

     

    EX:

     

    [DllImport("user32.dll")]
    public static extern void SendMessage(IntPtr hWnd, int Msg, int wParam, int
    lParam);

     

      this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown1); 

    .

    .

    .

    private void Form1_MouseDown1(object sender, System.Windows.Forms.MouseEventArgs e) 
        { 
            if(e.Button==System.Windows.Forms.MouseButtons.Left) 

                SendMessage(This.Handle, WM_NCLBUTTONDOWN, HTCAPTION   ,  0  );

          
        } 

     

     

     



    Cmf.Net (C) 2010
    2010年8月14日 上午 08:34
  • C#怎样实现无边框窗体拖动

    http://topic.csdn.net/u/20091109/20/7ab9c87b-6a11-4b28-9882-ff2e624eee62.html

    Public Class Form1
      Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = 163 AndAlso Me.ClientRectangle.Contains(Me.PointToClient(New Point(m.LParam.ToInt32()))) AndAlso m.WParam.ToInt32() = 2 Then
          m.WParam = 1
        End If
        MyBase.WndProc(m)
        If m.Msg = 132 AndAlso m.Result.ToInt32() = 1 Then
          m.Result = 2
        End If
      End Sub
    End Class
    
    

    歡迎參觀我的Blog.NET菜鳥自救會
    2010年8月14日 上午 08:43
    版主
  • 不需要捨近求遠,VB2008 線上手冊就有。

    ms-help://MS.MSDNQTR.v90.cht/dv_mancli/html/2cf1744b-60f1-45df-b757-6a769a12e277.htm

    HOW TO:建立非矩形 Windows Form

    [前略]

    若要撰寫移動表單的程式碼 (選擇性)

    1. 建立拖曳就可移動表單的程序。輸入與下列類似的程式碼,以建立新的 Point 物件。在計算如何移動表單時,這會做為變數。isMouseDown 欄位是用於追蹤使用者是否按住滑鼠按鍵。表單應該只在按住滑鼠時移動。

      Visual Basic  複製程式碼
      Private mouseOffset As Point
      Private isMouseDown As Boolean = False
      
      

       

      C#  複製程式碼
      private Point mouseOffset;
      private bool isMouseDown = false;
    2. 為表單的 MouseDown 事件建立事件處理常式。在處理常式中加入程式碼,讓使用者按一下表單任何一處,即可拖曳它。如需建立事件處理常式的詳細資訊,請參閱 HOW TO:使用設計工具建立事件處理常式

      輸入與下列類似的程式碼,根據滑鼠指標的目前位置,將座標指定給 mouseOffset 變數。在下列的程式碼中,請注意位移 (Offset) 位置是使用關於框線大小 (FrameBorderSize.Width) 和標題列高度 (CaptionHeight) 的系統資訊進行計算的。測試位移時必須將這些情況納入考量,因為有些測量是使用用戶端區域,而有些則是使用螢幕座標進行的。因此,位移等於框線寬度加上標題高度,再加上表單用戶端區域的位移。

      Visual Basic  複製程式碼
      Private Sub Form1_MouseDown(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseDown
        Dim xOffset As Integer
        Dim yOffset As Integer
      
        If e.Button = MouseButtons.Left Then
          xOffset = -e.X - SystemInformation.FrameBorderSize.Width
          yOffset = -e.Y - SystemInformation.CaptionHeight - _
              SystemInformation.FrameBorderSize.Height
          mouseOffset = New Point(xOffset, yOffset)
          isMouseDown = True
        End If
      End Sub
      
      

       

      C#  複製程式碼
      private void Form1_MouseDown(object sender, 
        System.Windows.Forms.MouseEventArgs e)
      {
        int xOffset;
        int yOffset;
      
        if (e.Button == MouseButtons.Left) 
        {
          xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
          yOffset = -e.Y - SystemInformation.CaptionHeight - 
            SystemInformation.FrameBorderSize.Height;
          mouseOffset = new Point(xOffset, yOffset);
          isMouseDown = true;
        }  
      }
      C# 注意事項:

      請務必加入程式碼以啟用事件處理常式。使用下列範例的程式碼,此程式碼看起來像是這樣:

        複製程式碼
      this.MouseDown += new
        System.Windows.Forms.MouseEventHandler
        (this.Form1_MouseDown);
    3. 為表單的 MouseMove 事件建立事件處理常式。

      輸入與下列類似的程式碼。當按下滑鼠左鍵並拖曳滑鼠時,表單的 Location 屬性會設定成新的位置。

      Visual Basic  複製程式碼
      Private Sub Form1_MouseMove(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseMove
        If isMouseDown Then
          Dim mousePos As Point = Control.MousePosition
          mousePos.Offset(mouseOffset.X, mouseOffset.Y)
          Location = mousePos
        End If
      End Sub
      
      

       

      C#  複製程式碼
      private void Form1_MouseMove(object sender, 
        System.Windows.Forms.MouseEventArgs e)
      {
        if (isMouseDown) 
        {
          Point mousePos = Control.MousePosition;
          mousePos.Offset(mouseOffset.X, mouseOffset.Y);
          Location = mousePos;
        }
      }
      C# 注意事項:

      請務必加入程式碼以啟用事件處理常式。使用下列範例的程式碼,此程式碼看起來像是這樣:

        複製程式碼
      this.MouseMove += new
        System.Windows.Forms.MouseEventHandler
        (this.Form1_MouseMove);
    4. 為表單的 MouseUp 事件建立事件處理常式。輸入與下列類似的程式碼。

      Visual Basic  複製程式碼
      Private Sub Form1_MouseUp(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        ' Changes the isMouseDown field so that the form does
        ' not move unless the user is pressing the left mouse button.
        If e.Button = MouseButtons.Left Then
          isMouseDown = False
        End If
      End Sub
      
      

       

      C#  複製程式碼
      private void Form1_MouseUp(object sender, 
        System.Windows.Forms.MouseEventArgs e)
      {
        // Changes the isMouseDown field so that the form does
        // not move unless the user is pressing the left mouse button.
        if (e.Button == MouseButtons.Left) 
        {
          isMouseDown = false;
        }
      }

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年8月14日 上午 09:24
  • Hi,

    這也可以參考一下

    [C#][VB.NET]自定義.NET WindowForm表單介面


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年8月16日 上午 04:16
  • 對不起,大大,在半年前做過,現在又沒vb08只能憑印象,拼錯字請見諒

    在Windows.form.cursor的命名空間下,我記得有"Location"的值,能得到Mouse 在整個螢幕上的座標

    dim FormPiont as point

    dim drag as boolean=false

    Form事件:

    1.MouseDown

    FormPoint=e.Location

    drag=true

    2.MouseUp

    drag=False

    3.MouseMove

    Me.Location=new Point(Windows.form.cursor.Location.x-FormPoint.x,Windows.form.cursor.Location.y-FormPoint.y)

    另外如果要限定Mouse的按鈕

    MouseDown的事件改成  If e.button=MouseButtons.Left Then drag=True

    2010年8月17日 上午 06:28