COMPILED アプリケーションに対して Aero がアクティブ化されているときに、VBNET または C# コードを使用して非クライアント領域のサイズを正しく決定する方法は? (はい、この問題は、IDE からアプリを起動するときではなく、コンパイルされたアプリケーションを実行するときにのみ発生します)
フォームのサイズを変更したり、フォームの高さ/幅に関連する操作を行ったりすると、期待した結果が得られません。
たとえば、これは 2 つの形式の単純なドッキングのコードの一部です。
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);
例として、私のプログラムを示します。
上記のコードは、Aero がアクティブ化されていない場合に完全に実行されます。
...しかし、Aero が有効になっている場合は、次のようになります。
右側のフォームが左側のフォームの非クライアント境界線の下にあることに注意してください。
...または、左のフォームが右のフォームの非クライアント境界線の下にある別の画像を次に示します。
私の質問は、これを解決する方法はどれですか?
アップデート:
フレーム ソリューションの拡張が機能していません。
フォーム1:
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
フォーム2:
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
結果:
また、覚えておきたい のは、この問題は、IDE からアプリを起動するときではなく、コンパイルされたアプリケーションを実行するときにのみ発生することです。
**
アップデート:
**
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
**
アップデート:
**
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
注意: この問題は、IDE からアプリを起動するときではなく、win7/Vista でコンパイルされたアプリケーションを実行するときにのみ発生します。