卿搞笔 发表于 7 天前

Powershell实现圆缩小放大 (实时刷新窗口)

使用Powershell,创建实时刷新的窗口,绘制图形,这里以圆作为例子,做缩小放大动画。
 
【分析】
Powershell是windows内置的自动部署平台,功能强大在于可以调取.net框架,因此,即使没有Opengl加持,也可以创建实时刷新的窗口。可以调用windows.Form程序集创建窗口,然后调用System.Drawing程序集来绘制。graphics.FillEllipse可以绘制实心圆,graphics.DrawEllipse可以绘制空心圆。对于实时刷新画面,可以设置一个定时器,例如每过16.7毫秒触发一次绘制,即每秒60帧画面刷新率。每次刷新绘制,圆的大小参数修改并重新绘制。
 
【实现】
1. 绘制空心圆动画
# 加载 System.Drawing 和 System.Windows.Forms 程序集
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms

# 创建一个新的窗体
$form = New-Object System.Windows.Forms.Form
$form.Text = "圆放大缩小循环动画"
# 设置窗体大小为 1000x800
$form.Size = New-Object System.Drawing.Size(1000, 800)
$form.StartPosition = "CenterScreen"
# 设置背景颜色为黑色
$form.BackColor = ::Black

# 启用双缓冲以减少闪烁
$doubleBufferProperty = $form.GetType().GetProperty("DoubleBuffered", ::NonPublic -bor ::Instance)
$doubleBufferProperty.SetValue($form, $true, $null)

# 定义圆的初始半径
$radius = 10

# 定义最大半径和最小半径
$maxRadius = (::Min($form.ClientSize.Width, $form.ClientSize.Height) / 2)
$minRadius = 10

# 定义一个标志,用于判断圆是在放大还是缩小
$isGrowing = $true

# 定义一个定时器
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 16.7# 每 16.7 毫秒触发一次

# 定时器的 Tick 事件处理程序
$timer.Add_Tick({
    param($sender, $e)
    if ($isGrowing) {
      # 圆正在放大
      $script:radius += 1
      if ($script:radius -ge $maxRadius) {
            # 达到最大半径,开始缩小
            $script:isGrowing = $false
      }
    } else {
      # 圆正在缩小
      $script:radius -= 1
      if ($script:radius -le $minRadius) {
            # 达到最小半径,开始放大
            $script:isGrowing = $true
      }
    }
    # 使窗体无效,触发重绘事件
    $form.Invalidate()
})

# 窗体大小改变事件处理程序,确保圆心始终在窗口中心
$form.Add_SizeChanged({
    $script:maxRadius = (::Min($form.ClientSize.Width, $form.ClientSize.Height) / 2)
    $form.Invalidate()
})

# 窗体的 Paint 事件处理程序
$form.Add_Paint({
    param($sender, $e)
    $graphics = $e.Graphics
    # 设置画笔颜色和宽度,将边框设置更粗
    $pen = New-Object System.Drawing.Pen(::Red, 5)
    # 计算窗口中心位置作为圆心
    $centerX = ($form.ClientSize.Width / 2)
    $centerY = ($form.ClientSize.Height / 2)
    # 计算圆的矩形边界
    $x = $centerX - $radius
    $y = $centerY - $radius
    $width = $radius * 2
    $height = $radius * 2
    # 绘制圆
    $graphics.DrawEllipse($pen, $x, $y, $width, $height)
    # 释放画笔资源
    $pen.Dispose()
})

# 启动定时器
$timer.Start()

# 显示窗体
$form.ShowDialog() 
2.绘制实心圆动画
# 加载 System.Drawing 和 System.Windows.Forms 程序集
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms

# 创建一个新的窗体
$form = New-Object System.Windows.Forms.Form
$form.Text = "圆放大缩小循环动画"
# 设置窗体大小为 1000x800
$form.Size = New-Object System.Drawing.Size(1000, 800)
$form.StartPosition = "CenterScreen"
# 设置背景颜色为黑色
$form.BackColor = ::Black

# 通过反射启用双缓冲
$doubleBufferProperty = $form.GetType().GetProperty("DoubleBuffered", ::NonPublic -bor ::Instance)
$doubleBufferProperty.SetValue($form, $true, $null)

# 定义圆的初始半径和圆心
$centerX = ($form.ClientSize.Width / 2)
$centerY = ($form.ClientSize.Height / 2)
$radius = 10

# 定义最大半径和最小半径
$maxRadius = (::Min($form.ClientSize.Width, $form.ClientSize.Height) / 2)
$minRadius = 10

# 定义一个标志,用于判断圆是在放大还是缩小
$isGrowing = $true

# 定义一个定时器
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 20# 每 20 毫秒触发一次

# 定时器的 Tick 事件处理程序
$timer.Add_Tick({
    param($sender, $e)
    if ($isGrowing) {
      # 圆正在放大
      $script:radius += 1
      if ($script:radius -ge $maxRadius) {
            # 达到最大半径,开始缩小
            $script:isGrowing = $false
      }
    } else {
      # 圆正在缩小
      $script:radius -= 1
      if ($script:radius -le $minRadius) {
            # 达到最小半径,开始放大
            $script:isGrowing = $true
      }
    }
    # 使窗体无效,触发重绘事件
    $form.Invalidate()
})

# 窗体的 Paint 事件处理程序
$form.Add_Paint({
    param($sender, $e)
    $graphics = $e.Graphics
    # 设置画刷颜色,这里设置为红色
    $brush = New-Object System.Drawing.SolidBrush(::Red)
    # 计算圆的矩形边界
    $x = $centerX - $radius
    $y = $centerY - $radius
    $width = $radius * 2
    $height = $radius * 2
    # 绘制实心圆
    $graphics.FillEllipse($brush, $x, $y, $width, $height)
    # 释放画刷资源
    $brush.Dispose()
})

# 启动定时器
$timer.Start()

# 显示窗体
$form.ShowDialog() 
【补充】
1.  调用 System.Drawing 程序集、 System.Windows.Forms 程序集。
2.  设计定时器,每过多少时间重绘一次画面。
3.  设计圆动画逻辑,设置一个开关,圆缩小放大的状态量。并设定圆大小极值。
4.  通过反射启用双缓冲,避免画面闪烁。
 
【效果】




 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Powershell实现圆缩小放大 (实时刷新窗口)