|
Option Explicit On
Option Strict On
Option Compare Binary
Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Runtime.InteropServices
Public Class ExtendedForm
Inherits System.Windows.Forms.Form
<StructLayout(LayoutKind.Sequential)> _
Private Structure POINTAPI
Public x As Int32
Public y As Int32
End Structure
Private Const WM_GETMINMAXINFO As Int32 = &H24
<StructLayout(LayoutKind.Sequential)> _
Private Structure MINMAXINFO
Public ptReserved As POINTAPI
Public ptMaxSize As POINTAPI
Public ptMaxPosition As POINTAPI
Public ptMinTrackSize As POINTAPI
Public ptMaxTrackSize As POINTAPI
End Structure
Private Declare Sub CopyMemory Lib "kernel32.dll" _
Alias "RtlMoveMemory" ( _
ByVal lpDest As IntPtr, _
ByRef lpSource As MINMAXINFO, _
ByVal cBytes As Int32)
Private Declare Sub CopyMemory Lib _
"kernel32.dll" Alias "RtlMoveMemory" ( _
ByRef lpDest As MINMAXINFO, _
ByVal lpSource As IntPtr, _
ByVal cBytes As Int32)
Private m_ptMaximizedLocation As Point
Private m_sizeMaxTrackSize As Size
Private m_sizeMaximumSize As Size
Private m_sizeMinimumSize As Size
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_GETMINMAXINFO
Dim mmi As MINMAXINFO
Call CopyMemory(mmi, m.LParam, Len(mmi))
With mmi
If Me.MaximumSize.Width <> 0 Then
.ptMaxSize.x = Me.MaximumSize.Width
End If
If Me.MaximumSize.Height <> 0 Then
.ptMaxSize.y = Me.MaximumSize.Height
End If
If Me.MaximumTrackSize.Width <> 0 Then
.ptMaxTrackSize.x = Me.MaximumTrackSize.Width
End If
If Me.MaximumTrackSize.Height <> 0 Then
.ptMaxTrackSize.y = Me.MaximumTrackSize.Height
End If
If Me.MinimumSize.Width <> 0 Then
.ptMinTrackSize.x = Me.MinimumSize.Width
End If
If Me.MinimumSize.Height <> 0 Then
.ptMinTrackSize.y = Me.MinimumSize.Height
End If
.ptMaxPosition.x = Me.MaximizedLocation.X
.ptMaxPosition.y = Me.MaximizedLocation.Y
End With
Call CopyMemory(m.LParam, mmi, Len(mmi))
m.Result = IntPtr.Zero
Return
End Select
MyBase.WndProc(m)
End Sub
Public Shadows Property MinimumSize() As Size
Get
Return m_sizeMinimumSize
End Get
Set(ByVal Value As Size)
m_sizeMinimumSize = Value
End Set
End Property
Public Shadows Property MaximumSize() As Size
Get
Return m_sizeMaximumSize
End Get
Set(ByVal Value As Size)
m_sizeMaximumSize = Value
End Set
End Property
Public Property MaximizedLocation() As Point
Get
Return m_ptMaximizedLocation
End Get
Set(ByVal Value As Point)
m_ptMaximizedLocation = Value
End Set
End Property
Public Property MaximumTrackSize() As Size
Get
Return m_sizeMaxTrackSize
End Get
Set(ByVal Value As Size)
m_sizeMaxTrackSize = Value
End Set
End Property
End Class
Option Explicit On
Option Strict On
Option Compare Binary
Public Class MainForm
Inherits System.Windows.Forms.Form
Private Sub btnLoadChild_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnLoadChild.Click
Dim frm As New MyExtendedForm()
frm.MdiParent = Me
frm.Show()
End Sub
Private Sub btnLoadWindow_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnLoadWindow.Click
Dim frm As New MyExtendedForm()
frm.Show()
End Sub
End Class
Option Explicit On
Option Strict On
Option Compare Binary
Imports System
Imports System.Drawing
Public Class MyExtendedForm
Inherits MinMaxFormSize.ExtendedForm
Private Sub txtMinimumSizeHeight_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles txtMinimumSizeHeight.Validating
Dim d As Double
If Double.TryParse(Me.txtMinimumSizeHeight.Text, _
Globalization.NumberStyles.Integer And Not _
Globalization.NumberStyles.AllowLeadingSign, Nothing, d) Then
Dim s As New Size()
s.Width = Me.MinimumSize.Width
s.Height = CInt(d)
Me.MinimumSize = s
Else
Me.txtMinimumSizeHeight.Text = "0"
End If
End Sub
Private Sub txtMinimumSizeWidth_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles txtMinimumSizeWidth.Validating
Dim d As Double
If Double.TryParse(Me.txtMinimumSizeWidth.Text, _
Globalization.NumberStyles.Integer And Not _
Globalization.NumberStyles.AllowLeadingSign, Nothing, d) Then
Dim s As New Size()
s.Width = CInt(d)
s.Height = Me.MinimumSize.Height
Me.MinimumSize = s
Else
Me.txtMinimumSizeWidth.Text = "0"
End If
End Sub
Private Sub txtMaximumSizeHeight_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles txtMaximumSizeHeight.Validating
Dim d As Double
If Double.TryParse(Me.txtMaximumSizeHeight.Text, _
Globalization.NumberStyles.Integer And Not _
Globalization.NumberStyles.AllowLeadingSign, Nothing, d) Then
Dim s As New Size()
s.Width = Me.MaximumSize.Width
s.Height = CInt(d)
Me.MaximumSize = s
Me.MaximumTrackSize = s
Else
Me.txtMaximumSizeHeight.Text = "0"
End If
End Sub
Private Sub txtMaximumSizeWidth_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles txtMaximumSizeWidth.Validating
Dim d As Double
If Double.TryParse(Me.txtMaximumSizeWidth.Text, _
Globalization.NumberStyles.Integer And Not _
Globalization.NumberStyles.AllowLeadingSign, Nothing, d) Then
Dim s As New Size()
s.Width = CInt(d)
s.Height = Me.MaximumSize.Height
Me.MaximumSize = s
Me.MaximumTrackSize = s
Else
Me.txtMaximumSizeWidth.Text = "0"
End If
End Sub
Private Sub txtMaximizedLocationX_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles txtMaximizedLocationX.Validating
Dim d As Double
If Double.TryParse(Me.txtMaximizedLocationX.Text, _
Globalization.NumberStyles.Integer And Not _
Globalization.NumberStyles.AllowLeadingSign, Nothing, d) Then
Dim pt As New Point()
pt.X = CInt(d)
pt.Y = Me.MaximizedLocation.Y
Me.MaximizedLocation = pt
Else
Me.txtMaximizedLocationX.Text = "0"
End If
End Sub
Private Sub txtMaximizedLocationY_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles txtMaximizedLocationY.Validating
Dim d As Double
If Double.TryParse(Me.txtMaximizedLocationY.Text, _
Globalization.NumberStyles.Integer And Not _
Globalization.NumberStyles.AllowLeadingSign, Nothing, d) Then
Dim pt As New Point()
pt.X = Me.MaximizedLocation.X
pt.Y = CInt(d)
Me.MaximizedLocation = pt
Else
Me.txtMaximizedLocationY.Text = "0"
End If
End Sub
End Class |