• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Làm cho window tự động sáp dô đường biên của Desktop

Các thủ thuật về truyền thông đa phương tiện, đồ họa

Moderators: tungcan5diop, QUANITGROBEST

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Làm cho window tự động sáp dô đường biên của Desktop

Postby Kỳ Nam » Fri 07/11/2008 3:35 pm

Thủ thuật: Làm cho window tự động sáp dô đường biên của Desktop
Tác giả: hình như ở codeproject.com
Mô tả: Khi di chuyển window đến gần đường biên của Desktop , window sẽ tự động sáp tới


code này hay , thay đổi Const mSnapOffset để vừa ý mình

Code: Select all

  1. Imports System.Runtime.InteropServices
  2.  
  3. Public Class Form1
  4.     Private Const mSnapOffset As Integer = 15
  5.     Private Const WM_WINDOWPOSCHANGING As Integer = &H46
  6.  
  7.     Public Structure WINDOWPOS
  8.         Public hwnd As IntPtr
  9.         Public hwndInsertAfter As IntPtr
  10.         Public x As Integer
  11.         Public y As Integer
  12.         Public cx As Integer
  13.         Public cy As Integer
  14.         Public flags As Integer
  15.     End Structure
  16.  
  17.     Protected Overrides Sub WndProc(ByRef m As Message)
  18.         ' Listen for operating system messages
  19.         Select Case m.Msg
  20.             Case WM_WINDOWPOSCHANGING
  21.                 SnapToDesktopBorder(Me, m.LParam, 0)
  22.         End Select
  23.  
  24.         MyBase.WndProc(m)
  25.     End Sub
  26.  
  27.     Public Shared Sub SnapToDesktopBorder(ByVal clientForm As Form, ByVal LParam As IntPtr, ByVal widthAdjustment As Integer)
  28.         ' Snap client to the top, left, bottom or right desktop border
  29.         ' as the form is moved near that border.
  30.  
  31.         Try
  32.             ' Marshal the LPARAM value which is a WINDOWPOS struct
  33.             Dim NewPosition As New WINDOWPOS
  34.             NewPosition = CType(Runtime.InteropServices.Marshal.PtrToStructure(LParam, GetType(WINDOWPOS)), WINDOWPOS)
  35.  
  36.             If NewPosition.y = 0 OrElse NewPosition.x = 0 Then
  37.                 Return ' Nothing to do!
  38.             End If
  39.  
  40.             ' Adjust the client size for borders and caption bar
  41.             Dim ClientRect As Rectangle = clientForm.RectangleToScreen(clientForm.ClientRectangle)
  42.             ClientRect.Width += SystemInformation.FrameBorderSize.Width - widthAdjustment
  43.             ClientRect.Height += (SystemInformation.FrameBorderSize.Height + SystemInformation.CaptionHeight)
  44.  
  45.             ' Now get the screen working area (without taskbar)
  46.             Dim WorkingRect As Rectangle = Screen.GetWorkingArea(clientForm.ClientRectangle)
  47.  
  48.             ' Left border
  49.             If NewPosition.x >= WorkingRect.X - mSnapOffset AndAlso _
  50.                 NewPosition.x <= WorkingRect.X + mSnapOffset Then
  51.                 NewPosition.x = WorkingRect.X
  52.             End If
  53.  
  54.             ' Get screen bounds and taskbar height (when taskbar is horizontal)
  55.             Dim ScreenRect As Rectangle = Screen.GetBounds(Screen.PrimaryScreen.Bounds)
  56.             Dim TaskbarHeight As Integer = ScreenRect.Height - WorkingRect.Height
  57.  
  58.             ' Top border (check if taskbar is on top or bottom via WorkingRect.Y)
  59.             If NewPosition.y >= -mSnapOffset AndAlso _
  60.                 (WorkingRect.Y > 0 AndAlso NewPosition.y <= (TaskbarHeight + mSnapOffset)) OrElse _
  61.                 (WorkingRect.Y <= 0 AndAlso NewPosition.y <= (mSnapOffset)) Then
  62.                 If TaskbarHeight > 0 Then
  63.                     NewPosition.y = WorkingRect.Y ' Horizontal Taskbar
  64.                 Else
  65.                     NewPosition.y = 0 ' Vertical Taskbar
  66.                 End If
  67.             End If
  68.  
  69.             ' Right border
  70.             If NewPosition.x + ClientRect.Width <= WorkingRect.Right + mSnapOffset AndAlso _
  71.                 NewPosition.x + ClientRect.Width >= WorkingRect.Right - mSnapOffset Then
  72.                 NewPosition.x = WorkingRect.Right - (ClientRect.Width + SystemInformation.FrameBorderSize.Width)
  73.             End If
  74.  
  75.             ' Bottom border
  76.             If NewPosition.y + ClientRect.Height <= WorkingRect.Bottom + mSnapOffset AndAlso _
  77.                 NewPosition.y + ClientRect.Height >= WorkingRect.Bottom - mSnapOffset Then
  78.                 NewPosition.y = WorkingRect.Bottom - (ClientRect.Height + SystemInformation.FrameBorderSize.Height)
  79.             End If
  80.  
  81.             ' Marshal it back
  82.             Runtime.InteropServices.Marshal.StructureToPtr(NewPosition, LParam, True)
  83.         Finally
  84.         End Try
  85.     End Sub
  86. End Class



User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: Làm cho window tự động sáp dô đường biên của Desktop

Postby Kỳ Nam » Sat 08/11/2008 3:18 pm

code này tui sửa lại từ code trên

Code: Select all

  1. Public Class Form1
  2.  
  3.     Private Const SnapOffset As Integer = 20
  4.     Private Const WM_WINDOWPOSCHANGING As Integer = &H46
  5.  
  6.     Public Structure WINDOWPOS
  7.         Public hwnd As IntPtr
  8.         Public hwndInsertAfter As IntPtr
  9.         Public x As Integer
  10.         Public y As Integer
  11.         Public cx As Integer
  12.         Public cy As Integer
  13.         Public flags As SWP
  14.     End Structure
  15.  
  16.     <Flags()> Public Enum SWP
  17.         Normal = 0
  18.         NoSize = &H1
  19.         NoMove = &H2
  20.         NoZOrder = &H4
  21.         NoRedraw = &H8
  22.         NoActivate = &H10
  23.         FrameChanged = &H20
  24.         ShowWindow = &H40
  25.         HideWindow = &H80
  26.         NoCopyBits = &H100
  27.         NoOwnerZOrder = &H200
  28.         NoSendChanging = &H400
  29.         DrawFrame = FrameChanged
  30.         NoReposition = NoOwnerZOrder
  31.         DeferErase = &H2000
  32.         AsyncWindowPos = &H4000
  33.     End Enum
  34.  
  35.     Protected Overrides Sub WndProc(ByRef m As Message)
  36.         ' Listen for operating system messages
  37.         Select Case m.Msg
  38.             Case WM_WINDOWPOSCHANGING
  39.                 SnapToDesktopBorder(m.LParam)
  40.         End Select
  41.  
  42.         MyBase.WndProc(m)
  43.     End Sub
  44.  
  45.     Private Sub SnapToDesktopBorder(ByVal LParam As IntPtr)
  46.         ' Snap client to the top, left, bottom or right desktop border
  47.         ' as the form is moved near that border.
  48.  
  49.         ' Marshal the LPARAM value which is a WINDOWPOS struct
  50.         Dim WPNewPosition As WINDOWPOS = DirectCast(Runtime.InteropServices.Marshal.PtrToStructure(LParam, GetType(WINDOWPOS)), WINDOWPOS)
  51.  
  52.         If (WPNewPosition.Flags And SWP.NoSize) = 0 OrElse (WPNewPosition.Flags And SWP.NoMove) = 0 Then
  53.             Dim RWorking As Rectangle = Screen.FromControl(Me).WorkingArea
  54.  
  55.             If Math.Abs(WPNewPosition.x - RWorking.X) <= SnapOffset Then
  56.                 WPNewPosition.x = RWorking.X
  57.             ElseIf Math.Abs(WPNewPosition.x + WPNewPosition.cx - RWorking.Right) <= SnapOffset Then
  58.                 WPNewPosition.x = RWorking.Right - WPNewPosition.cx
  59.             End If
  60.  
  61.             If Math.Abs(WPNewPosition.y - RWorking.Y) <= SnapOffset Then
  62.                 WPNewPosition.y = RWorking.Y
  63.             ElseIf Math.Abs(WPNewPosition.y + WPNewPosition.cy - RWorking.Bottom) <= SnapOffset Then
  64.                 WPNewPosition.y = RWorking.Bottom - WPNewPosition.cy
  65.             End If
  66.  
  67.             ' Marshal it back
  68.             Runtime.InteropServices.Marshal.StructureToPtr(WPNewPosition, LParam, True)
  69.         End If 
  70.     End Sub
  71.  
  72. End Class

User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 31 times
Contact:

Re: Làm cho window tự động sáp dô đường biên của Desktop

Postby clarkkent » Sun 14/12/2008 8:44 am

Đã test, cũng hay...
Mình có 2 form, form này snap vào form kia được không...
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...

User avatar
Kỳ Nam
Guru
Guru
Posts: 510
Joined: Sun 12/08/2007 8:47 pm
Location: Qui Nhơn
Been thanked: 1 time
Contact:

Re: Làm cho window tự động sáp dô đường biên của Desktop

Postby Kỳ Nam » Sun 14/12/2008 9:27 am

làm được , nhưng mà cậu phải thêm code dô

User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 31 times
Contact:

Re: Làm cho window tự động sáp dô đường biên của Desktop

Postby clarkkent » Fri 02/01/2009 4:54 pm

Mới thấy cái này... nhưng form boder=none để lấy XY khi mouse down

Code: Select all

  1.   Dim X1 As Integer, Y1 As Integer, WR As Rectangle
  2.  
  3.    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
  4.       X1 = e.X
  5.       Y1 = e.Y
  6.       WR = Screen.GetWorkingArea(Me)
  7.    End Sub
  8.    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
  9.       If Not e.Button = Windows.Forms.MouseButtons.Left Then Exit Sub
  10.  
  11.       Dim NewX As Integer = Me.Left + (e.X - X1)
  12.       Dim NewY As Integer = Me.Top + (e.Y - Y1)
  13.       Dim W As Integer = Me.Width
  14.       Dim H As Integer = Me.Height
  15.  
  16.       If NewY >= WR.Top - 15 And NewY <= WR.Top + 15 Then
  17.          Me.Top = WR.Top
  18.       ElseIf NewY + H > WR.Bottom - 15 And NewY + H < WR.Bottom + 15 Then
  19.          Me.Top = WR.Bottom - H
  20.       Else
  21.          Me.Top = NewY
  22.       End If
  23.       If NewX >= WR.Left - 15 And NewX <= WR.Left + 15 Then
  24.          Me.Left = WR.Left
  25.       ElseIf NewX + W > WR.Right - 15 And NewX + W < WR.Right + 15 Then
  26.          Me.Left = WR.Right - W
  27.       Else
  28.          Me.Left = NewX
  29.       End If
  30.    End Sub
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...


Return to “[.NET] Âm thanh và Đồ họa”

Who is online

Users browsing this forum: No registered users and 0 guests