继续填坑!又一个c#教程变为vb!
这是我翻译的Win2D教程,链接保留了微软原版的。
如果文档有问题,可以在 https://github.com/Nukepayload2/Win2dDocVB发 Issue,也可以直接回复。
原文地址 http://microsoft.github.io/Win2D/html/QuickStart.htm
快速开始 |
本快速入门教程介绍了一些 Win2D 的基本功能。您将学习如何:
选择Win2D.uwp.
最后,单击安装。如果系统提示您若要查看更改,单击确定。如果你介绍与 Win2D 许可条款,请单击我接受.
Win2D 现在已安装在您的项目。
Win2D 在 c++ 中实现,因此使用 Win2D 的项目需要指向一个特定的 CPU 体系结构。
<Page ... xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:canvas="using:Xaml" mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <canvas:CanvasControl x:Name="canvas"/> </Grid> <canvas:CanvasControl x:Name="canvas" Draw="canvas_Draw" />
一旦您输入了在绘制 =",Visual Studio 应该弹出一个框提示您让它自动填写正确的定义事件处理程序。按TAB可接受 Visual Studio 默认事件处理程序。这将也自动格式正确的事件处理程序方法在代码中添加背后 (MainPage.xaml.vb)。不要担心,如果你没有使用自动完成在下一步中,您可以手动添加事件处理程序方法。
Imports Microsoft.Graphics.Canvas Imports Microsoft.Graphics.Canvas.Effects Imports Microsoft.Graphics.Canvas.UI Imports Microsoft.Graphics.Canvas.UI.Xaml Imports Windows.UI
如果你的项目大量使用Win2D,可以在项目级别的Imports中设定这些命名空间。
接下来,您应该看到下面的空事件处理程序被自动完成:
Private Sub canvas_Draw(sender As CanvasControl, args As CanvasDrawEventArgs) End Sub
将下面的代码添加到canvas_Draw方法:
args.DrawingSession.DrawText("Hello, World!", 100, 100, Colors.Black)
第一个参数,"你好,世界!",是你想要 Win2D 要显示的字符串。两个"100"s 告诉 Win2D 来抵消此文本由 100 蘸 (独立于设备的像素) 向右和向下。最后,"Colors.Black"定义了文本的颜色。
有关详细信息,请参阅避免内存泄漏.
<Page ... xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:canvas="using:Xaml" mc:Ignorable="d" Unloaded="Page_Unloaded">
Sub Page_Unloaded(sender As Object, e As RoutedEventArgs) Me.canvas.RemoveFromVisualTree() Me.canvas = Nothing End Sub
args.DrawingSession.DrawCircle(125, 125, 100, Colors.Green) args.DrawingSession.DrawLine(0, 0, 50, 200, Colors.Red)
这两种方法的参数是类似于DrawText。一圈是由中心点 (125、 125),半径 (100) 和一种颜色 (绿色) 定义的。一条线是由 (0,0) 的开始、 结束 (50、 200) 和一种颜色 (红色定义的。).
你可能想知道如何控制更先进的绘图选项,如线条的粗细和短划线,或更复杂的填充选项,如使用画笔。Win2D 提供的所有这些选项和更多,和容易地使用它们的时候你想要。所有的画 [......]的方法提供许多重载方法可以接受额外的参数,如CanvasTextFormat (字体、 大小等) 和CanvasStrokeStyle (短划线、 圆点、 末端等)。感到自由探索 API 表面,以了解有关这些选项的详细信息。
将下面的代码添加到您的主页类的顶部。这是生成的随机值,绘制时将使用的帮助器功能:
Dim rnd As New Random Private Function RndPosition() As Vector2 Dim x = rnd.NextDouble() * 500.0F Dim y = rnd.NextDouble() * 500.0F Return New Vector2(x, y) End Function Private Function RndRadius() As Single Return rnd.NextDouble() * 150.0F End Function Private Function RndByte() As Byte Return rnd.Next(256) End Function
Private Sub canvas_Draw(sender As CanvasControl, args As CanvasDrawEventArgs) args.DrawingSession.DrawText("Hello, World!", RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) args.DrawingSession.DrawCircle(RndPosition(), RndRadius(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) args.DrawingSession.DrawLine(RndPosition(), RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) End Sub
让我们打破DrawText有怎样的变化。"你好,世界!"仍然和以前一样。X 和 y 偏移量的参数已经被取代单一的System.Numerics.Vector2是由RndPosition产生。最后,而不是使用预定义的颜色, Color.FromArgb允许您定义一种颜色使用 A、 R、 G 和 B 值。A 是 alpha 通道或不透明度级别在这种情况下,你总是想要完全不透明 (255).
画圆和DrawLine同样经营往返DrawText.
For i = 0 To 99 args.DrawingSession.DrawText("Hello, World!", RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) args.DrawingSession.DrawCircle(RndPosition(), RndRadius(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) args.DrawingSession.DrawLine(RndPosition(), RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) Next
再次运行该应用程序。您应该看到一大堆的文本、 线条和圆圈与随机位置和大小。
通过提供一个源图像 (你开始使用的内容)、 创建效果如GaussianBlurEffect,设置属性,如BlurAmount,然后绘制效果的输出与DrawImage使用图像效果.
要应用到您的文本和形状的图像效果,您需要首先将该内容呈现到CanvasCommandList。此对象是用作输入到你的效果。
Dim cl As New CanvasCommandList(sender) Using clds = cl.CreateDrawingSession() For i = 0 To 99 clds.DrawText("Hello, World!", RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) clds.DrawCircle(RndPosition(), RndRadius(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) clds.DrawLine(RndPosition(), RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) Next End Using
就像如何从CanvasDrawEventArgs您可以绘制与获得的CanvasDrawingSession,你可以从CanvasCommandList创建的CanvasDrawingSession。唯一的区别是,当你画到命令列表绘图会话 (clds),你不直接渲染到CanvasControl。相反,命令列表是渲染的一个中间对象来存储供以后使用的结果。
你可能已经注意到包装命令列表绘图会话使用的块。绘图会话实现IDisposable 可以根据和必须释放时,你做的渲染 (Using块这样做)。对你,但你必须处置您显式创建的任何绘图会话被闭合的你自动获取从CanvasDrawEventArgs CanvasDrawingSession.
Dim blur As New GaussianBlurEffect blur.Source = cl blur.BlurAmount = 10.0F args.DrawingSession.DrawImage(blur)
此代码创建一个高斯模糊,设置其源,你只是提请, CanvasCommandList将其模糊半径设置为10,以及最后呈现的输出到原始绘图会话模糊 (参数。DrawingSession).
CanvasControl是最适合主要是静态图形内容 — — 它只绘制时引发事件您的内容需要更新或重新绘制。如果你有不断变化的内容然后你应该考虑改用CanvasAnimatedControl。这两个控件操作非常类似,除了CanvasAnimatedControl引发绘制事件定期默认情况下,它被称为每秒 60 次。
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <canvas:CanvasAnimatedControl x:Name="canvas" Draw="canvas_DrawAnimated" CreateResources="canvas_CreateResources"/> </Grid>
就像CanvasControl,让自动完成创建为你绘制事件处理程序。默认情况下,Visual Studio 将名称此处理程序canvas_Draw_1因为canvas_Draw已存在在这里,我们已经重命名方法canvas_AnimatedDraw要弄清楚,这是一个不同的事件。
此外,您也正在处理一个新的事件, CreateResources。再次,让自动完成创建处理程序。
现在,您的应用程序将在每秒 60 帧重绘,是更有效地创建您的 Win2D 视觉资源一次并重新使用它们的每一帧。它是低效创建的CanvasCommandList和 300 元素引入 60 次每秒当内容仍然是静态的。CreateResources是只有 Win2D 确定您需要重新创建您视觉资源,例如当加载页面时,将触发一个事件。
Private Sub canvas_Draw(sender As CanvasControl, args As CanvasDrawEventArgs) Dim cl = New CanvasCommandList(sender) Using clds = cl.CreateDrawingSession() For i = 0 To 99 clds.DrawText("Hello, World!", RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) clds.DrawCircle(RndPosition(), RndRadius(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) clds.DrawLine(RndPosition(), RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) Next End Using Dim blur = New GaussianBlurEffect() blur.Source = cl blur.BlurAmount = 10.0F args.DrawingSession.DrawImage(blur) End Sub
绝大多数的此现有的绘制代码不需要执行与每一帧: 包含文本、 线条和圆圈的命令列表保持不变,每一帧,和唯一的变化是模糊半径。因此,你可以将这个"静态"的代码移动到CreateResources.
做到这一点,首先剪切 (CTRL + X) canvas_Draw,除了最后一行的全部内容 (参数。DrawingSession.DrawImage(blur))。你现在可以删除剩余的canvas_Draw,因为它不再需要: 记得CanvasAnimatedControl有其自己独特绘制事件。
Private Sub canvas_CreateResources(sender As CanvasAnimatedControl, args As CanvasCreateResourcesEventArgs) End Sub
Dim blur As GaussianBlurEffect Private Sub canvas_CreateResources(sender As CanvasAnimatedControl, args As CanvasCreateResourcesEventArgs) Dim cl = New CanvasCommandList(sender) Using clds = cl.CreateDrawingSession() For i = 0 To 99 clds.DrawText("Hello, World!", RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) clds.DrawCircle(RndPosition(), RndRadius(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) clds.DrawLine(RndPosition(), RndPosition(), Color.FromArgb(255, RndByte(), RndByte(), RndByte())) Next End Using Dim blur = New GaussianBlurEffect() With {.Source = cl, .BlurAmount = 10.0F} End Sub
Private Sub canvas_AnimatedDraw(sender As ICanvasAnimatedControl, args As CanvasAnimatedDrawEventArgs) Dim radius = (1 + Math.Sin(args.Timing.TotalTime.TotalSeconds)) * 10.0F blur.BlurAmount = radius args.DrawingSession.DrawImage(blur) End Sub
这读取由CanvasAnimatedDrawEventArgs提供的总运行时间并使用这来计算所需的模糊程度正弦函数提供了有趣的变化,随着时间的推移。最后, GaussianBlurEffect被呈现。
祝贺您完成这个快速开始教程