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

news/2025/2/26 14:52:05/文章来源:https://www.cnblogs.com/sharpeye/p/18738454

使用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 += 1if ($script:radius -ge $maxRadius) {# 达到最大半径,开始缩小$script:isGrowing = $false}} else {# 圆正在缩小$script:radius -= 1if ($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 += 1if ($script:radius -ge $maxRadius) {# 达到最大半径,开始缩小$script:isGrowing = $false}} else {# 圆正在缩小$script:radius -= 1if ($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.  通过反射启用双缓冲,避免画面闪烁。

 

【效果】

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890118.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LGP8125 [BalticOI 2021] The short shank 学习笔记

LGP8125 [BalticOI 2021] The short shank 学习笔记 Luogu Link 题意简述 有一列 \(N\) 个元素,第 \(i\) 个元素初始值 \(t_i\),而后会被更新为 \(\min_{j=lb=1}^{rb=i} t_j+(i-j)\)。现在给你 \(D\) 个隔板,如果在第 \(i\) 个和第 \(i+1\) 个之间放置,则有效果:\(\forall…

PPO和GRPO算法详解(持续更新中)

PPO 众所周知,PPO在LLM应用下, t时刻下,State就变成了query+output(<t) Reference是初始模型,举个例子可以认为是deepseek V3+SFT之后的模型,是不变的,是fozen model 从头开始推导一次: t0时刻:query输入到policy model里面,生成一个token,记为o1Reeference model…

ATR143B Counting Grids 学习笔记

ATR143B Counting Grids 学习笔记 Luogu Link 题意简述 现在需要将 \(1\sim n^2\) 共 \(n^2\) 个整数填进网格 \(S\)。定义一种方案合法当且仅当不存在 \(S_{i,j}\) 满足: \[\max_{k=1}^n S_{i,k}=\min_{k=1}^n S_{k,j}=S_{i,j} \]。问合法方案数,答案对 \(998244353\) 取模。…

win11解决任务栏卡死问题

1、以管理员方式启动 windows PowerShell 2、执行代码 Get-AppXPackage -AllUsers | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"} sfc /scannow出现下面信息重启电脑即可。

轻松搞定电脑文件对比,BeyondCompare

点击上方蓝字关注我 前言 Beyond Compare 是一种文件比较工具。把选中的文件夹或文件并排展示两个窗口,可以使用不同筛选查看文件夹信息。 可以查看所有文件、匹配的文件、不匹配的文件等,根据不同的颜色来区别以便轻松辨识。通过其他功能还包括二进制文件的快速比较、文件和…

BUUCTF-PWN-ciscn_2019_c_1

这道题又是新的题型,研究了以下,要好好记录下来。 首先是看程序开启了哪些保护:发现没开启栈溢出保护,我们继续往下看程序的逻辑:一个简洁的页面,到此为止我们并不能看出可以利用哪些攻击方式,我们跟踪一下函数encrypt和begin发现begin只是一个简单的显示程序,而重点在…

Windows API 学习~

Win32~用api 创建一个Windows 窗口 windows窗口创建过程 Windows API 索引 - Win32 apps | Microsoft Learn 创建项目 ​ 配置属性,系统里面子系统选择窗口 ​ ‍注册窗口类: 首先需要调用RegisterClassEx 函数来注册一个窗口类,该函数会向操作系统注册一个新的窗口类, 并返…

个人开发者神器:5款高效的项目管理工具推荐

作为个人开发者,高效的项目管理是确保工作顺利进行的关键。在众多的项目管理工具中,轻量级的 APP 因其便捷性和实用性备受青睐。本文将为您推荐 5 款个人开发者的神器——轻量级项目管理 APP,帮助您提升工作效率,更好地实现项目目标。 禅道项目管理软件 禅道是一款专业且开…

drawio使用阿里云最新图标

简介 draw.io是一款免费的在线绘图工具,可用于创建各种类型的图表、流程图、组织结构图、网络拓扑图等。它具有易于使用的直观界面和丰富的图形库,支持与Google Drive、OneDrive、Dropbox等云存储服务集成。用户可以直接在浏览器中使用draw.io,也可以将其安装为Chrome应用程…

VulnHub-DC-6靶机-wpscan爆破+命令注入反弹shell+nmap提权

一、环境搭建 选择扫描虚拟机选择靶机路径这里如果出现报错,无法导入,如VMware出现配置文件 .vmx 是由VMware产品创建,但该产品与此版 VMware workstation 不兼容,因此无法使用(VMware版本不兼容问题),可以修改.vmx文件版本和虚拟机一致二、信息收集 扫描ip nmap -sn 19…

浅析Golang的内存管理(中篇): go runtime的内存管理模型与内存分配器

文章目录go runtime的基本内存模型 三级存储体系(MCache,MCentral,Mheap) 对象分配流程 一、go runtime的基本内存模型go runtime 借鉴了C++的内存模型和TCMalloc(Thread-Caching Malloc)内存分配机制,再开始之前,先了解一些go runtime对内存对象抽象的名词概念,它们分…

浅析Golang的内存管理(上篇):操作系统内存管理

文章目录计算机存储体系介绍 虚拟存储器 内存管理单元与页式存储管理 CPU发起一次访存的全过程 一、计算机存储体系介绍从计算机的组成角度来看,计算机的存储分为,寄存器-高速缓存-主存储器(泛指内存)-本地存储(磁盘)-外部存储(光盘、云盘等),由下到上,运行速度越来…