惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
V
Vulnerabilities – Threatpost
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
Latest news
Latest news
博客园 - 三生石上(FineUI控件)
美团技术团队
aimingoo的专栏
aimingoo的专栏
Google Online Security Blog
Google Online Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
Y
Y Combinator Blog
T
Tailwind CSS Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
小众软件
小众软件
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tenable Blog
W
WeLiveSecurity
L
LINUX DO - 热门话题
D
Docker
Cyberwarzone
Cyberwarzone
量子位
A
About on SuperTechFans
The Last Watchdog
The Last Watchdog
雷峰网
雷峰网
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
The Hacker News
The Hacker News
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Full Disclosure
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
O
OpenAI News
Hacker News - Newest:
Hacker News - Newest: "LLM"
Scott Helme
Scott Helme
IT之家
IT之家
S
Secure Thoughts
MongoDB | Blog
MongoDB | Blog
L
Lohrmann on Cybersecurity
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News

博客园 - SHARP-EYE

Processing在P2D模式下使用 tint() 方法的注意事项 · 只对 image() 和纹理有效 Processing 的 sketch.properties 机制以及主程序与文件夹解耦的具体细节 Processing P2D 模式鼠标约束 · 限制在窗口内 · 技术报告 Kimi Code CLI 系统指令的摸索 以及 开发实战经验分享 开源重置 沙丘2 游戏 · Dune Legacy 中文本地化与渲染技术说明 基于 Irrlicht 和 WASAPI 的 Simple Audio Visualization 技术开发报告 AI Coding越来越强,我们还有必要学Processing吗? · 创意编程 嵌入式脚本语言全解析:从Lua到Wren,游戏与IoT开发的未来选型指南 PixelMentor:一个开源网站 · 调用AI视觉能力分析图片 · 提供影视后期修改意见 基于 Vanilla JS 构建高性能可视化节点创意展示编辑器 (CNE) 的技术实践与深度解析 · Creative Node Editor 关于OpenClaw部署在Ubuntu上的经验小结 P3DE (Processing 3D Editor) 三维场景编辑器 · 软件白皮书 · 基于 v0.4.8 Windows 批量文件操作风险指南 · 不完整小结 [深度复盘] 构建高性能实时弹幕系统:Node.js + Socket.io 架构设计与生产环境部署实战 如何调用CMD实现多个同类文件合并的研究 · 二进制 · 依次 · 文本图像视频音频 Processing (Java) 中实现2D任意图形的鼠标悬停检测 · 2D射线检测 · 模拟按钮 · 点击事件 PowerShell实现全屏七彩渐变 · 呼吸 · 屏保 浅谈processing-java.exe应用程序的使用(与PowerShell的联合) 使用Windows任务计划程序实现每天更换一张Processing创意桌面壁纸 PowerShell开发小工具 · 四张照片拼成一张 CMD批处理脚本+VBScript脚本+Potplayer 实现文件夹内所有视频的截图任务(指定时间点) 批处理脚本(.bat)实现实时监测文件夹并执行命令 [假设有新文件则拷贝到远程文件夹内] PowerShell开发游戏 · 打蜜蜂
Powershell实现圆缩小放大 (实时刷新窗口)
SHARP-EYE · 2025-02-26 · via 博客园 - SHARP-EYE

使用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 = [System.Drawing.Color]::Black

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

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

# 定义最大半径和最小半径
$maxRadius = [int]([Math]::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 = [int]([Math]::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([System.Drawing.Color]::Red, 5)
    # 计算窗口中心位置作为圆心
    $centerX = [int]($form.ClientSize.Width / 2)
    $centerY = [int]($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 = [System.Drawing.Color]::Black

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

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

# 定义最大半径和最小半径
$maxRadius = [int]([Math]::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([System.Drawing.Color]::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.  通过反射启用双缓冲,避免画面闪烁。

【效果】