Vb.net VB窗口窗体的大小不适合应用程序的宽度/高度
我将Visual Basic Windows窗体大小设置为应用程序的宽度/高度,但它不起作用 虽然这对我来说在VBA中完全可以正常工作,但它并没有按照插件的要求工作:Vb.net VB窗口窗体的大小不适合应用程序的宽度/高度,vb.net,visual-studio,windows-forms-designer,Vb.net,Visual Studio,Windows Forms Designer,我将Visual Basic Windows窗体大小设置为应用程序的宽度/高度,但它不起作用 虽然这对我来说在VBA中完全可以正常工作,但它并没有按照插件的要求工作: Dim newForm As New ExportingForm newForm.ShowDialog() Public Class ExportingForm Private Sub ExportingForm_Layout(sender As Object, e As EventArgs) Handles My
Dim newForm As New ExportingForm
newForm.ShowDialog()
Public Class ExportingForm
Private Sub ExportingForm_Layout(sender As Object, e As EventArgs) Handles MyBase.Layout
Dim exclApp As Excel.Application = Globals.ThisAddIn.Application
If exclApp.WindowState = Excel.XlWindowState.xlMaximized Then
Me.WindowState = System.Windows.Forms.FormWindowState.Maximized
Else
Me.Size = New Drawing.Point(exclApp.Width, exclApp.Height)
End If
End Sub
End Class
此外,在设计器模式下,以下是我的Windows窗体设置:
IsMdiContainer False
Location 0,0
MaximumSize 0,0
MinimumSize 0,0
Padding 0,0,0,0
Size 250,250
StartPosition CenterParent
它居中很好,我也可以通过编程方式更改宽度/高度,但是,当将其设置为应用程序的宽度/高度时,它会更改到某个点并停止。我需要做什么来更正此问题
我也试过:
Me.Size = New Drawing.Point(exclApp.ActiveWindow.Width, exclApp.ActiveWindow.Height)
我还尝试在显示表单之前设置大小:
Dim newForm.....
newForm.Size = New Drawing.Point(exclApp.Width, exclApp.Height)
newForm.ShowDialog()
我可以翻译任何语言,只要它与Visual Studio配合使用
校正 从理论上讲,我最初介绍的方法应该是可行的,但是Excel PointsToScreenPixels方法存在一些问题。互联网上对这些功能的搜索表明,结果充其量是不可靠的。因此,我建议使用Win32 API函数GetWindowRect来检索Excel应用程序的位置和大小。从中获取的API函数定义 导入Excel=Microsoft.Office.Interop.Excel 导入System.Runtime.InteropServices 公开课表格1 私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击 测试() 端接头 子测试() Dim meDPI As PointF=GetDPI(Me.Handle) Dim应用程序作为新的Excel.Application app.Visible=True Dim APPWND As IntPtr=新IntPtr(app.Hwnd) '设置Excel的大小和位置--仅用于测试验证目的 SetWindowPos(appHwnd,IntPtr.Zero,10,10,500,300,SetWindowPosFlags.DoNotActivate) Dim rc As RECT GetWindowRect(appHwnd,rc)'将Excel的大小和位置检索到rc中 app.UserControl=True'将控件返回给用户 WriteLine(“Excel位于X:{0},Y:{1},宽度:{2},高度:{3}”,rc.Left,rc.Top,rc.Width,rc.Height) Me.Location=rc.Location Me.Size=rc.Size Me.Activate()'将此表单带到前面 Me.Opacity=0.5'允许通过Excel查看 端接头 公共共享函数GetDPI(hwnd作为IntPtr)作为PointF 变暗ret为点F 使用g作为Graphics=Graphics.FromHwnd(hwnd) ret.X=g.DpiX 回复Y=g.DpiY 终端使用 回程网 端函数 _ 私有共享函数GetWindowRect(ByVal hWnd作为IntPtr,ByRef lpRect作为RECT)作为布尔值 端函数 _ 公共结构 私有(左为整数),(上为整数),(右为整数),(下为整数) 公共子新建(ByVal矩形作为矩形) Me.New(矩形。左,矩形。上,矩形。右,矩形。下) 端接头 Public Sub New(ByVal Left为整数,ByVal Top为整数,ByVal Right为整数,ByVal Bottom为整数) _左=左 _顶部=顶部 _右=右 _底部=底部 端接头 公共属性X作为整数 得到 返回左 结束 设置(ByVal值为整数) _右=_右-_左+值 _左=值 端集 端属性 作为整数的公共属性Y 得到 返回顶部 结束 设置(ByVal值为整数) _底部=\u底部-\u顶部+值 _顶部=值 端集 端属性 保留为整数的公共属性 得到 返回左 结束 设置(ByVal值为整数) _左=值 端集 端属性 公共属性顶部为整数 得到 返回顶部 结束 设置(ByVal值为整数) _顶部=值 端集 端属性 作为整数的公共产权 得到 返回(右) 结束 设置(ByVal值为整数) _右=值 端集 端属性 公共属性底部为整数 得到 返回底部 结束 设置(ByVal值为整数) _底部=值 端集 端属性 公共属性高度()为整数 得到 返回-底部-顶部 结束 设置(ByVal值为整数) _底部=值+顶部 端集 端属性 公共属性宽度()为整数 得到 返回_右-_左 结束 设置(ByVal值为整数) _右=值+左 端集 端属性 公共属性位置()作为点 得到 返回新点(左、上) 结束 设置(ByVal值作为点) _Right=\u Right-\u Left+value.X _底部=\u底部-\u顶部+值.Y _左=值.X _Top=value.Y 端集 端属性 公共属性大小()作为大小 得到 返回新尺寸(宽度、高度) 结束 设置(ByVal值作为大小) _右=值。宽度+左 _底部=值。高度+顶部 端集 端属性 公共共享加宽运算符CType(ByVal矩形作为RECT)作为矩形 返回新矩形(Rectangle.Left、Rectangle.Top、Rectangle.Width、Rectangle.Height) 终端操作员 公共共享加宽运算符CType(ByVal矩形为矩形)为
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
test()
End Sub
Sub test()
Dim meDPI As PointF = GetDPI(Me.Handle)
Dim app As New Excel.Application
app.Visible = True
Dim appHwnd As IntPtr = New IntPtr(app.Hwnd)
' setting Excel's size and position -- just for test verification purposes
SetWindowPos(appHwnd, IntPtr.Zero, 10, 10, 500, 300, SetWindowPosFlags.DoNotActivate)
Dim rc As RECT
GetWindowRect(appHwnd, rc) ' retrieve Excel's size and position into rc
app.UserControl = True ' return control to the user
Console.WriteLine("Excel located at X: {0}, Y: {1}, Width: {2}, Height: {3}", rc.Left, rc.Top, rc.Width, rc.Height)
Me.Location = rc.Location
Me.Size = rc.Size
Me.Activate() ' bring this form to the front
Me.Opacity = 0.5 ' allow to view thru to Excel
End Sub
Public Shared Function GetDPI(hwnd As IntPtr) As PointF
Dim ret As PointF
Using g As Graphics = Graphics.FromHwnd(hwnd)
ret.X = g.DpiX
ret.Y = g.DpiY
End Using
Return ret
End Function
<DllImport("user32.dll")> _
Private Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
End Function
<StructLayout(LayoutKind.Sequential)> _
Public Structure RECT
Private _Left As Integer, _Top As Integer, _Right As Integer, _Bottom As Integer
Public Sub New(ByVal Rectangle As Rectangle)
Me.New(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom)
End Sub
Public Sub New(ByVal Left As Integer, ByVal Top As Integer, ByVal Right As Integer, ByVal Bottom As Integer)
_Left = Left
_Top = Top
_Right = Right
_Bottom = Bottom
End Sub
Public Property X As Integer
Get
Return _Left
End Get
Set(ByVal value As Integer)
_Right = _Right - _Left + value
_Left = value
End Set
End Property
Public Property Y As Integer
Get
Return _Top
End Get
Set(ByVal value As Integer)
_Bottom = _Bottom - _Top + value
_Top = value
End Set
End Property
Public Property Left As Integer
Get
Return _Left
End Get
Set(ByVal value As Integer)
_Left = value
End Set
End Property
Public Property Top As Integer
Get
Return _Top
End Get
Set(ByVal value As Integer)
_Top = value
End Set
End Property
Public Property Right As Integer
Get
Return _Right
End Get
Set(ByVal value As Integer)
_Right = value
End Set
End Property
Public Property Bottom As Integer
Get
Return _Bottom
End Get
Set(ByVal value As Integer)
_Bottom = value
End Set
End Property
Public Property Height() As Integer
Get
Return _Bottom - _Top
End Get
Set(ByVal value As Integer)
_Bottom = value + _Top
End Set
End Property
Public Property Width() As Integer
Get
Return _Right - _Left
End Get
Set(ByVal value As Integer)
_Right = value + _Left
End Set
End Property
Public Property Location() As Point
Get
Return New Point(Left, Top)
End Get
Set(ByVal value As Point)
_Right = _Right - _Left + value.X
_Bottom = _Bottom - _Top + value.Y
_Left = value.X
_Top = value.Y
End Set
End Property
Public Property Size() As Size
Get
Return New Size(Width, Height)
End Get
Set(ByVal value As Size)
_Right = value.Width + _Left
_Bottom = value.Height + _Top
End Set
End Property
Public Shared Widening Operator CType(ByVal Rectangle As RECT) As Rectangle
Return New Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height)
End Operator
Public Shared Widening Operator CType(ByVal Rectangle As Rectangle) As RECT
Return New RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom)
End Operator
Public Shared Operator =(ByVal Rectangle1 As RECT, ByVal Rectangle2 As RECT) As Boolean
Return Rectangle1.Equals(Rectangle2)
End Operator
Public Shared Operator <>(ByVal Rectangle1 As RECT, ByVal Rectangle2 As RECT) As Boolean
Return Not Rectangle1.Equals(Rectangle2)
End Operator
Public Overrides Function ToString() As String
Return "{Left: " & _Left & "; " & "Top: " & _Top & "; Right: " & _Right & "; Bottom: " & _Bottom & "}"
End Function
Public Overloads Function Equals(ByVal Rectangle As RECT) As Boolean
Return Rectangle.Left = _Left AndAlso Rectangle.Top = _Top AndAlso Rectangle.Right = _Right AndAlso Rectangle.Bottom = _Bottom
End Function
Public Overloads Overrides Function Equals(ByVal [Object] As Object) As Boolean
If TypeOf [Object] Is RECT Then
Return Equals(DirectCast([Object], RECT))
ElseIf TypeOf [Object] Is Rectangle Then
Return Equals(New RECT(DirectCast([Object], Rectangle)))
End If
Return False
End Function
End Structure
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As SetWindowPosFlags) As Boolean
End Function
<Flags> _
Private Enum SetWindowPosFlags As UInteger
''' <summary>If the calling thread and the thread that owns the window are attached to different input queues,
''' the system posts the request to the thread that owns the window. This prevents the calling thread from
''' blocking its execution while other threads process the request.</summary>
''' <remarks>SWP_ASYNCWINDOWPOS</remarks>
ASynchronousWindowPosition = &H4000
''' <summary>Prevents generation of the WM_SYNCPAINT message.</summary>
''' <remarks>SWP_DEFERERASE</remarks>
DeferErase = &H2000
''' <summary>Draws a frame (defined in the window's class description) around the window.</summary>
''' <remarks>SWP_DRAWFRAME</remarks>
DrawFrame = &H20
''' <summary>Applies new frame styles set using the SetWindowLong function. Sends a WM_NCCALCSIZE message to
''' the window, even if the window's size is not being changed. If this flag is not specified, WM_NCCALCSIZE
''' is sent only when the window's size is being changed.</summary>
''' <remarks>SWP_FRAMECHANGED</remarks>
FrameChanged = &H20
''' <summary>Hides the window.</summary>
''' <remarks>SWP_HIDEWINDOW</remarks>
HideWindow = &H80
''' <summary>Does not activate the window. If this flag is not set, the window is activated and moved to the
''' top of either the topmost or non-topmost group (depending on the setting of the hWndInsertAfter
''' parameter).</summary>
''' <remarks>SWP_NOACTIVATE</remarks>
DoNotActivate = &H10
''' <summary>Discards the entire contents of the client area. If this flag is not specified, the valid
''' contents of the client area are saved and copied back into the client area after the window is sized or
''' repositioned.</summary>
''' <remarks>SWP_NOCOPYBITS</remarks>
DoNotCopyBits = &H100
''' <summary>Retains the current position (ignores X and Y parameters).</summary>
''' <remarks>SWP_NOMOVE</remarks>
IgnoreMove = &H2
''' <summary>Does not change the owner window's position in the Z order.</summary>
''' <remarks>SWP_NOOWNERZORDER</remarks>
DoNotChangeOwnerZOrder = &H200
''' <summary>Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to
''' the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent
''' window uncovered as a result of the window being moved. When this flag is set, the application must
''' explicitly invalidate or redraw any parts of the window and parent window that need redrawing.</summary>
''' <remarks>SWP_NOREDRAW</remarks>
DoNotRedraw = &H8
''' <summary>Same as the SWP_NOOWNERZORDER flag.</summary>
''' <remarks>SWP_NOREPOSITION</remarks>
DoNotReposition = &H200
''' <summary>Prevents the window from receiving the WM_WINDOWPOSCHANGING message.</summary>
''' <remarks>SWP_NOSENDCHANGING</remarks>
DoNotSendChangingEvent = &H400
''' <summary>Retains the current size (ignores the cx and cy parameters).</summary>
''' <remarks>SWP_NOSIZE</remarks>
IgnoreResize = &H1
''' <summary>Retains the current Z order (ignores the hWndInsertAfter parameter).</summary>
''' <remarks>SWP_NOZORDER</remarks>
IgnoreZOrder = &H4
''' <summary>Displays the window.</summary>
''' <remarks>SWP_SHOWWINDOW</remarks>
ShowWindow = &H40
End Enum
End Class
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>