Nevypadá, že to bude někomu k užitku... Získání rectangle jednotlivých tlačítek controlboxu titlebaru pomocí TITLEBARINFOEX structure :
Friend Const WM_GETTITLEBARINFOEX As Integer = &H33F
Friend Const CCHILDREN_TITLEBAR As Integer = 5
<StructLayout(LayoutKind.Sequential)>
Friend Structure TITLEBARINFOEX
Public cbSize As Integer
Public rcTitleBar As RECT
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=CCHILDREN_TITLEBAR + 1)>
Public rgstate As Integer()
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=CCHILDREN_TITLEBAR + 1)>
Public rgrect As RECT()
End Structure
<DllImport("user32.dll", CharSet:=CharSet.Auto)>
Friend Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal uMsg As Integer, ByVal wParam As IntPtr, ByRef lParam As TITLEBARINFOEX) As IntPtr
End Function
Friend Shared Function GetTitleBarInfoEx(ByVal hWnd As IntPtr) As TITLEBARINFOEX
Dim tbi As TITLEBARINFOEX = New TITLEBARINFOEX()
tbi.cbSize = Marshal.SizeOf(GetType(TITLEBARINFOEX))
SendMessage(hWnd, WM_GETTITLEBARINFOEX, IntPtr.Zero, tbi)
Return tbi
End Function
Zprvu se mi nedařilo správně sestavit structuru TITLEBARINFOEX, ale vypadá, že takhle to funguje. Netuším, proč se mi nevrací RECT rcTitleBar správně, ale kupodivu RECT pro jednotlivá tlačítka odpovídá ve Win10 přesně skutečnosti, rgRect(2) pro minimize button, rgRect(3) pro maximize button, rgRect(5) pro close button. Detaily struktury TITLEBARINFOEX : https://msdn.microsoft.com/en-us/library... Máte-li rozšířeno kreslení do neklientské oblasti, pak obrazná kontrola získaného rectangle close buttonu pomocí modrého orámování v události Paint :
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim tbiex As TITLEBARINFOEX = GetTitleBarInfoEx(Me.Handle)
With tbiex.rgrect(5)
Dim r As Rectangle = Rectangle.FromLTRB(.left, .top, .right, .bottom)
Dim rtc As Rectangle = Me.RectangleToClient(r)
e.Graphics.DrawRectangle(Pens.Blue, rtc)
End With
End Sub
... Painting Vista's Aero NonClientArea in VB.NET : https://www.codeproject.com/Articles/442...
|