Как правильно определить код VBNET или C# для размера неклиентской зоны при активации Aero для COMPILED приложения? (Да, этой проблемы возникает только при запуске скомпилированного приложения, а не при запуске приложения из IDE)Как правильно определить размер области без клиента для Aero?
При изменении размера моей формы или я сделать любую операцию relationed с высотой/шириной вида I никогда не получите ожидаемого результата.
Например, это часть кода простого стыковке двух формах:
VB-NET:
Me.Location = New Point((form1.Location.X + form1.Width), form1.Location.Y)
C#
this.Location = new Point((form1.Location.X + form1.Width), form1.Location.Y);
К дайте пример, я покажу свою программу.
Код выше работает perfectlly когда Aero не активирован:
... Но если Aero активируется, то это результат:
Обратите внимание, как форма права находится под границей Неклиента левой формы.
... Или вот другое изображение, где левая форма находится под Non-Client границы правильной формы:
Мой вопрос Какой способ решить эту проблему?
UPDATE:
Расширение решения кадра не работает.
Form1:
Imports System.Runtime.InteropServices
Public Class Form1
Public Moving_From_Secondary_Form As Boolean = False
<DllImport("dwmapi.dll")> _
Private Shared Function DwmExtendFrameIntoClientArea(ByVal hwnd As IntPtr, ByRef margins As MARGINS) As Integer
End Function
<StructLayout(LayoutKind.Sequential)> _
Public Structure MARGINS
Public leftWidth As Integer
Public rightWidth As Integer
Public topHeight As Integer
Public bottomHeight As Integer
End Structure
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim margins As New MARGINS()
margins.leftWidth = -1
margins.rightWidth = -1
margins.topHeight = -1
margins.bottomHeight = -1
DwmExtendFrameIntoClientArea(Me.Handle, margins)
Form2.Show()
End Sub
Private Sub Form1_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Move
If Not Moving_From_Secondary_Form Then Form2.Location = New Point(Me.Right, Me.Top)
End Sub
End Class
Form2:
Public Class Form2
Private Sub Form2_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Move
Form1.Moving_From_Secondary_Form = True
Form1.Location = New Point(Me.Left - Form1.Width, Me.Top)
Form1.Moving_From_Secondary_Form = False
End Sub
End Class
Результат:
http://img824.imageshack.us/img824/3176/prtscrcapture2q.jpg
Также я хочу помнить: эта проблема возникает только при Runnin га компилируется приложение, а не при запуске приложения из IDE
**
UPDATE:
**
Испытано решение GetWindowRect и всегда возвращают 0, не работает для меня, может быть, я что-то делаю неправильно:
Imports System.Runtime.InteropServices
Public Class Form1
Private Declare Function GetWindowRect Lib "user32" (ByVal Handle As IntPtr, Rect As RECT) As Long
Private Declare Function CopyRect Lib "user32" (DestRect As RECT, SourceRect As RECT) As Long
<StructLayout(LayoutKind.Sequential)> _
Structure RECT
Public Left As Int32
Public Top As Int32
Public Right As Int32
Public Bottom As Int32
End Structure
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Form2.Show()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim rectWindow As RECT, rectCopy As RECT
'Get the bounding rectangle of this window
GetWindowRect(Me.Handle, rectWindow)
'Copy the rectangle
CopyRect(rectCopy, rectWindow)
MsgBox("This form's width:" & (rectCopy.Right - rectCopy.Left).ToString & " pixels")
Form2.Location = New Point(rectCopy.Right, rectCopy.Top)
End Sub
End Class
**
UPDATE:
**
Другой попробовать с GetWindowRect, на этот раз код правильно написал, но не решают проблему:
Imports System.Runtime.InteropServices
Public Class Form1
<StructLayout(LayoutKind.Sequential)> _
Private Structure RECT
Public Left As Int32
Public Top As Int32
Public Right As Int32
Public Bottom As Int32
End Structure
Private Declare Function GetWindowRect Lib "user32" (ByVal HWND As Integer, ByRef lpRect As RECT) As Integer
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim rc As RECT
GetWindowRect(MyBase.Handle, rc)
Dim width As Integer = rc.Right - rc.Left
Form2.Show()
Form2.Location = New Point(rc.Right, rc.Top)
End Sub
End Class
Я хочу помнить: эта проблема возникает только при запуске скомпилированного приложения на Win7/Vista, а не при запуске приложения из IDE
Спасибо, но это не решило проблему, увидеть мой обновленный вопрос, если вы можете. – ElektroStudios
Похоже, вы только расширили рамку в форме1 - вы сделали это и для form2? – GJKH
См. Обновленный ответ для другого предложения. – GJKH