none
元件移位的問題 RRS feed

  • 問題

  • 我參考網路的程式,一個可以在程式執行中"移動元件位置"

    但是問題來了,我發現程式執行完設計頁面位置又恢復了(我就算用編譯完的  .exe那執行一樣)

    請問能讓元件是真的移位嗎?

      Private Declare Function BlockInput Lib "user32" (ByVal fBlock As Integer) As Integer

      '我想問這Lib "user32" (ByVal fBlock As Integer) As Integer 是呼叫use32.dll 但是我還是搞不懂怎用能根我解釋嗎?謝謝

        Dim pos As MouseEventArgs = Nothing
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            For Each ctl As Control In Me.Controls
                AddHandler ctl.MouseMove, AddressOf Ctl_MouseMove
                AddHandler ctl.MouseDown, AddressOf Ctl_MouseDown

            Next
        End Sub
        Private Sub Ctl_MouseMove(ByVal s As Object, ByVal e As MouseEventArgs)
            Dim c As Control = DirectCast(s, Control)  
            If c.Capture Then ' 控制項是否 Capture Mouse 
                '網路寫的
                'c.Location = New Point(e.X + c.Location.X - pos.X, e.Y + c.Location.Y - pos.Y) 
                '我自己寫的
                c.Left = e.X + c.Location.X - pos.X
                c.Top = e.Y + c.Location.Y - pos.Y
                Button2.Location = New Point(e.X + c.Location.X - pos.X, e.Y + c.Location.Y - pos.Y)
            End If
        End Sub

        Private Sub Ctl_MouseDown(ByVal s As Object, ByVal e As MouseEventArgs)
            pos = e ' 記錄控制項舊位置 
        End Sub
    2010年5月6日 上午 09:46

解答

  • Hi,

    修了一下您的程式

      Dim nOldWndLeft As Integer
      Dim nOldWndTop As Integer
      Dim nClickX As Integer
      Dim nClickY As Integer
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        For Each ctl As Control In Me.Controls
          AddHandler ctl.MouseMove, AddressOf Ctl_MouseMove
          AddHandler ctl.MouseDown, AddressOf Ctl_MouseDown
        Next
      End Sub
      Private Sub Ctl_MouseMove(ByVal s As Object, ByVal e As MouseEventArgs)
        Dim c As Control = DirectCast(s, Control)
        If c.Capture Then ' 控制項是否 Capture Mouse 
          '設定新的視窗位置 
          c.Top = e.Y + nOldWndTop - nClickY
          c.Left = e.X + nOldWndLeft - nClickX
          '更新紀錄的視窗位置 
          nOldWndLeft = c.Left
          nOldWndTop = c.Top
        End If
      End Sub
    
      Private Sub Ctl_MouseDown(ByVal s As Object, ByVal e As MouseEventArgs)
        Dim c As Control = DirectCast(s, Control)
        '紀錄滑鼠點選時的視窗位置與滑鼠點選位置 
        nOldWndLeft = c.Left
        nOldWndTop = c.Top
        nClickX = e.X
        nClickY = e.Y
      End Sub

     

    回到您的問題,從您的描述看來

    像是要調完後下次運行還是上次調完的樣子

    若是這樣的話您必須自行把控制項位置記住

    開啟時載入並調整


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

所有回覆

  • 我介紹一本書給你,書名是API大全集。

    應該可以給你滿意的答案。

    2010年5月6日 上午 09:54
  • Hi,

    修了一下您的程式

      Dim nOldWndLeft As Integer
      Dim nOldWndTop As Integer
      Dim nClickX As Integer
      Dim nClickY As Integer
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        For Each ctl As Control In Me.Controls
          AddHandler ctl.MouseMove, AddressOf Ctl_MouseMove
          AddHandler ctl.MouseDown, AddressOf Ctl_MouseDown
        Next
      End Sub
      Private Sub Ctl_MouseMove(ByVal s As Object, ByVal e As MouseEventArgs)
        Dim c As Control = DirectCast(s, Control)
        If c.Capture Then ' 控制項是否 Capture Mouse 
          '設定新的視窗位置 
          c.Top = e.Y + nOldWndTop - nClickY
          c.Left = e.X + nOldWndLeft - nClickX
          '更新紀錄的視窗位置 
          nOldWndLeft = c.Left
          nOldWndTop = c.Top
        End If
      End Sub
    
      Private Sub Ctl_MouseDown(ByVal s As Object, ByVal e As MouseEventArgs)
        Dim c As Control = DirectCast(s, Control)
        '紀錄滑鼠點選時的視窗位置與滑鼠點選位置 
        nOldWndLeft = c.Left
        nOldWndTop = c.Top
        nClickX = e.X
        nClickY = e.Y
      End Sub

     

    回到您的問題,從您的描述看來

    像是要調完後下次運行還是上次調完的樣子

    若是這樣的話您必須自行把控制項位置記住

    開啟時載入並調整


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年5月6日 上午 11:41
  • 請問是《VISUAL BASIC .NET WIN32 API大全集》ISBN:9575275748 這本嗎?

    2010年5月6日 上午 11:41
  • 感謝您,我看到您的寫法後,我想到該如何解決了,我可以用一個資料庫EX:ACCESS

    紀錄上一次的,這樣我的執行檔就不會每次關掉都重置。

    2010年5月6日 下午 12:34
  • 本版置頂公告:

    關於Visual Basic 資源分享

    裡面這段:

    http://msdn2.microsoft.com/en-us/library/ms973830.aspx

     

    Creating a Design Surface Using Windows Forms and GDI+ in Microsoft .NET
    範例下載:DesignSurface.exe
     
    今天在找 PageUnit 時,意外看到這個範例,雖然是 VB2003 的,但是經過升級轉換後,只有少部分有問題要改。
     
    這個範例內建了好幾個控制項,比如說矩形、文字、橢圓等,放到畫面上後還可以拖拉,可以說把 VB2005 中短缺 VB6 的 Shape 控制項補了起來 (就叫 ShapeGraphic) ,需要這類範例的版友可參考。

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