• 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

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
Kỳ Nam
Guru
Guru
Bài viết: 510
Ngày tham gia: CN 12/08/2007 8:47 pm
Đến từ: Qui Nhơn
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi Kỳ Nam » T.Sáu 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

Mã: Chọn hết

  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



Hình đại diện của người dùng
Kỳ Nam
Guru
Guru
Bài viết: 510
Ngày tham gia: CN 12/08/2007 8:47 pm
Đến từ: Qui Nhơn
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi Kỳ Nam » T.Bảy 08/11/2008 3:18 pm

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

Mã: Chọn hết

  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

Hình đại diện của người dùng
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 1641
Ngày tham gia: T.Tư 16/04/2008 11:25 am
Đến từ: Chợ Lách - Bến Tre
Been thanked: 31 time
Liên hệ:

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

Gửi bàigửi bởi clarkkent » CN 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...

Hình đại diện của người dùng
Kỳ Nam
Guru
Guru
Bài viết: 510
Ngày tham gia: CN 12/08/2007 8:47 pm
Đến từ: Qui Nhơn
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi Kỳ Nam » CN 14/12/2008 9:27 am

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

Hình đại diện của người dùng
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 1641
Ngày tham gia: T.Tư 16/04/2008 11:25 am
Đến từ: Chợ Lách - Bến Tre
Been thanked: 31 time
Liên hệ:

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

Gửi bàigửi bởi clarkkent » T.Sáu 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

Mã: Chọn hết

  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...


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

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách