在 PowerShell Windows Forms 脚本中自定义调整无边框大小 window
Custom resize of borderless window in a PowerShell Windows Forms script
我的 PowerShell 脚本中有一个无边框 Windows 表单 window:
- 我希望用户能够调整它的大小,但它只能向左水平增长。
- window 的右边框需要始终保持在原来的位置。
调整大小本身有效,但 window 在调整大小时水平移动。此外,每次我开始调整大小时,window 会向左或向右跳一次。
由于原脚本比较大,我做了一个例子来说明问题:
# Custom resize example
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$Form1 = New-Object System.Windows.Forms.Form
$Form1.size = "500,500"
$Form1.FormBorderStyle = "None"
$Form1.TopMost = $true
$Form1.StartPosition = "CenterScreen"
$Form1.add_MouseClick({
if ($_.Button -eq "Right") {
$form1.close()
}
})
$resizeBar = New-Object System.Windows.Forms.Label
$resizeBar.BackColor = "150,150,150"
$resizeBar.Size = "8,500"
$resizeBar.Cursor = "SizeWE"
$Form1.controls.add($resizeBar)
$resizeBar.add_MouseDown({ $ResizeTimer.start()})
$resizeBar.add_MouseUp({ $ResizeTimer.stop()})
$comp = new-object System.ComponentModel.Container
$ResizeTimer = New-Object System.Windows.Forms.Timer($comp)
$ResizeTimer.Interval = 10
$ResizeTimer.add_Tick({
$MousePosX = ([System.Windows.Forms.Cursor]::Position).x
$Form1_LeftPos = $Form1.Left
if ($lastmx -eq 0) {
$script:lastmx = $MousePosX
}
$diffX = $MousePosX - $lastmx
$Form1.width = ($Form1.width - $diffX)
$Form1.Left = $Form1_LeftPos - $diffX
$script:lastmx = $MousePosX
})
$Form1.showdialog()
几个小问题:
将您的 $script:lastmx
变量初始化为 0。
始终将其称为 $script:lastmx
,而不是 $lastmx
。
行 $Form1.Left = $Form1_LeftPos - $diffX
实际上应该读作 $Form1.Left = $Form1_LeftPos + $diffX
这对我有用:
$script:lastmx = 0
$ResizeTimer.add_Tick({
$MousePosX = ([System.Windows.Forms.Cursor]::Position).x
$Form1_LeftPos = $Form1.Left
if ($Script:lastmx -eq 0) {
$script:lastmx = $MousePosX
}
$diffX = $MousePosX - $Script:lastmx
$Form1.width = ($Form1.width - $diffX)
$Form1.Left = $Form1_LeftPos + $diffX
$script:lastmx = $MousePosX
})
我的 PowerShell 脚本中有一个无边框 Windows 表单 window:
- 我希望用户能够调整它的大小,但它只能向左水平增长。
- window 的右边框需要始终保持在原来的位置。
调整大小本身有效,但 window 在调整大小时水平移动。此外,每次我开始调整大小时,window 会向左或向右跳一次。
由于原脚本比较大,我做了一个例子来说明问题:
# Custom resize example
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$Form1 = New-Object System.Windows.Forms.Form
$Form1.size = "500,500"
$Form1.FormBorderStyle = "None"
$Form1.TopMost = $true
$Form1.StartPosition = "CenterScreen"
$Form1.add_MouseClick({
if ($_.Button -eq "Right") {
$form1.close()
}
})
$resizeBar = New-Object System.Windows.Forms.Label
$resizeBar.BackColor = "150,150,150"
$resizeBar.Size = "8,500"
$resizeBar.Cursor = "SizeWE"
$Form1.controls.add($resizeBar)
$resizeBar.add_MouseDown({ $ResizeTimer.start()})
$resizeBar.add_MouseUp({ $ResizeTimer.stop()})
$comp = new-object System.ComponentModel.Container
$ResizeTimer = New-Object System.Windows.Forms.Timer($comp)
$ResizeTimer.Interval = 10
$ResizeTimer.add_Tick({
$MousePosX = ([System.Windows.Forms.Cursor]::Position).x
$Form1_LeftPos = $Form1.Left
if ($lastmx -eq 0) {
$script:lastmx = $MousePosX
}
$diffX = $MousePosX - $lastmx
$Form1.width = ($Form1.width - $diffX)
$Form1.Left = $Form1_LeftPos - $diffX
$script:lastmx = $MousePosX
})
$Form1.showdialog()
几个小问题:
将您的
$script:lastmx
变量初始化为 0。始终将其称为
$script:lastmx
,而不是$lastmx
。行
$Form1.Left = $Form1_LeftPos - $diffX
实际上应该读作$Form1.Left = $Form1_LeftPos + $diffX
这对我有用:
$script:lastmx = 0
$ResizeTimer.add_Tick({
$MousePosX = ([System.Windows.Forms.Cursor]::Position).x
$Form1_LeftPos = $Form1.Left
if ($Script:lastmx -eq 0) {
$script:lastmx = $MousePosX
}
$diffX = $MousePosX - $Script:lastmx
$Form1.width = ($Form1.width - $diffX)
$Form1.Left = $Form1_LeftPos + $diffX
$script:lastmx = $MousePosX
})