使用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.  通过反射启用双缓冲,避免画面闪烁。

【效果】

Powershell实现圆缩小放大 (实时刷新窗口)的更多相关文章

  1. websocket实现数据库更新时前端页面实时刷新

    websocket实现数据库更新时前端页面实时刷新 javaweb 目录(?)[+] userjsp ManagerServletjava 如题,实现以上功能,我知道主要有两大种思路: 轮询:轮询的原 ...

  2. 使用SignalR实现比特币价格实时刷新

    ASP.NET SignalR是微软支持的一个运行在 Dot NET 平台上的 HTML Websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重 ...

  3. Sublime Text 3配置LiveReload实现实时刷新

    今天看到一款很强大的插件,LiveReload,实时刷新,也就是说写完html/css/js等不用再到浏览器里按F5啦,在Ctrl+S时浏览器会自动刷新,是不是想想都很爽... Chrome:(据说支 ...

  4. Gulp-livereload:实时刷新编码

    实现功能 监听指定目录下的所有文件,实时动态刷新页面 安装(Install) 功能的实现是借助 gulp-connect 插件完成的;所以,首先通过下面命令完成插件安装: npm install -- ...

  5. tab栏切换,内容为不断实时刷新数据的vue实现方法

    先说一下产品需求,就是有几个tab栏,每个tab栏对应的ajax请求不一样,内容区域一样,内容为实时刷新数据,每3s需要重新请求,返回的数据在内容区域展示,每点击一次tab栏需停止其他tab栏ajax ...

  6. webpack-dev-server 搭建本地服务以及浏览器实时刷新

    一.概述开发项目中为了保证上线,开发项目是都需要使用localhost进行开发,以前的做法就是本地搭建Apache或者Tomcat服务器.有的前端开发人员 对服务器的搭建和配置并不熟悉,这个时候需要后 ...

  7. JAVAFX之tableview界面实时刷新导致的内存溢出(自己挖的坑,爬着也要出来啊0.0)

    这几天遇到了一个问题,不幸开发的一个cs架构的工具,客户端开启后,内存一直在缓慢增长最终导致进程卡死,花了4天时间,终于爬出来了... 客户端通过timer定时器每30秒查询一次数据库以及一些业务逻辑 ...

  8. js获取当前时间并实时刷新

    效果如图: 代码如下: <html> <head> <title>js获取当前时间并实时刷新</title> <script> //页面加载 ...

  9. Vue+WebSocket 实现页面实时刷新长连接

    最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死... 与后台人员讨论过后决定使用h5新增的WebSoc ...

  10. echarts背景分割区域填充不同颜色(x轴为time),实时刷新

    先来看下图片吧,这是实现效果: 思路: 因为要实时刷新,可以使用setInterval(),但是要控制好定时器的起与停,否则容易错乱以及页面卡死: 主要就是利用定时器五秒刷新,重绘echarts图:= ...

随机推荐

  1. 【金TECH频道】企业架构转型组合拳来袭,助力金融机构一臂之力

    当前,数字化转型已经成为时代共性课题在政策和技术的双重指引下金融机构逐渐走向差异化竞争的格局面对转型阵痛以契合.明晰的战略规划及企业架构调整来辅助业务变革成为助力企业数字化转型的有效路径金融机构也纷纷 ...

  2. (已解决)Public Key Retrieval is not allowed异常

    Public Key Retrieval is not allowed解决方法Public Key Retrieval is not allowed解决方法项目场景:问题描述:原因分析:解决方案:Pu ...

  3. 关于Jetson nano (B02)如何部署Yolov8以及一些必要的知识点

    一.前言 记录一个简单的安装和部署过程,尽管笔者也是按照教程来的,但奈何参考了很多教程,虽然写的都非常好,但是却很散,因此笔者这里想把这些教程的精华提炼出来,汇总并且写在正文处.还是老规矩,笔者也在学 ...

  4. Qt/C++音视频开发70-无感切换通道/无缝切换播放视频/多通道流畅切换/不同视频打开无缝切换

    一.前言 之前就写过这个方案,当时做的是ffmpeg内核版本,由于ffmpeg内核解析都是代码实现,所以无缝切换非常完美,看不到丝毫的中间切换过程,看起来就像是在一个通道画面中.其实这种切换只能说是取 ...

  5. Qt/C++中英输入法/嵌入式输入法/小数字面板/简繁切换/特殊字符/支持Qt456

    一.前言 在嵌入式板子上由于没有系统层面的输入法支持,所以都绕不开一个问题,那就是在需要输入的UI软件中,必须提供一个输入法来进行输入,大概从Qt5.7开始官方提供了输入法的源码,作为插件的形式加入到 ...

  6. Qt音视频开发44-实时人脸框

    一.前言 在人脸识别到以后,需要在实时视频上将所有人脸框绘制出来,一把来说识别人脸会有多种选择,一个是识别最大人脸,这种场景主要用于刷脸门禁,还有一种是识别所有人脸,这种场景主要用于人脸识别摄像机,就 ...

  7. Qt开源作品10-代码统计组件

    一.前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行.注释行.代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计.写完这个工具第一件事情就 ...

  8. TensorRT-YOLO:灵活易用的 YOLO 部署工具

    TensorRT YOLO TensorRT-YOLO 是一款专为 NVIDIA 设备设计的易用灵活.极致高效的YOLO系列推理部署工具.项目不仅集成了 TensorRT 插件以增强后处理效果,还使用 ...

  9. IM跨平台技术学习(十一):环信基于Electron打包Web IM桌面端的技术实践

    本文由环信技术黄飞鹏分享,原题"实战|如何利用 Electron 快速开发一个桌面端应用",本文进行了排版和内容优化等. 1.引言 早就听说利用Electron可以非常便捷的将网页 ...

  10. 首次公开,最新手机QQ客户端架构的技术演进实践

    本文由腾讯技术何金源分享,原题"不畏移山,手机QQ技术架构升级变迁史",本文进行了排版和内容优化等. 1.引言 接上篇<总是被低估,从未被超越,揭秘QQ极致丝滑背后的硬核IM ...