版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章多媒体编程,本章要点: 什么是GDI+ GDI+的基本使用 用GDI+显示文本和图形 用GDI+操纵图像,9.1接触GDI+,GDI+是微软公司为程序员提供的针对Windows平台的新一代二维图形系统,利用它,程序员可以在窗体上绘制出各种各样的图形,或者显示图像。比起上一代的GDI,GDI+具有完全面向对象的特征,它的优良设计在保证高效率的同时,还提供了非常容易使用的接口,而且有很多新的功能是传统GDI望尘莫及的。这些新功能包括: 对所有图形基元的Alpha混合支持; 消除锯齿; 渐变填充和纹理填充; 宽线; 基数样条; 可缩放区域; 浮点坐标; 复合线; 嵌入钢笔; 高质量的筛选和缩放
2、; 大量的线型和笔尖选项。,9.1.1建立自定义控件 9.1.2测试自定义的控件 下面的任务是编写一个测试程序来查看效果。新建一个Windows窗体程序,起名为Case9_1。我们需要把刚刚生成的MyButton.dll的引用加入到现在的项目中,方法如下: 用鼠标指向工具箱图标,让工具箱出现,可以在任何一个选项卡上单击鼠标右键(但最好还是在“Windows窗体”上,因为要添加的控件也可以算是一个Windows窗体控件),在弹出菜单中选择【自定义工具箱】。 在弹出的“自定义工具箱”对话框中,选择【 .NET框架组件】页,然后单击【浏览】按钮找到MyButton.dll文件,选择【打开】,然后单击
3、【确定】按钮关闭对话框,这时在选项卡末尾发现新添加的GradientButton控件。可以像使用普通控件一样把它放到窗体上,这时窗体上就出现了带有渐变色的按钮GradientButton1。,由于在代码中已编写了处理文字的部分,现在就可以改变控件的Text属性了(譬如改为“你好”),还可以改变控件的Font属性,你会发现这些都被正确地处理了,字的颜色是由ForeColor属性控制的,这也工作得很好。 如果查看“属性”窗体的“杂项”,会发现两个在Button控件中不存在的属性:StartColor和EndColor,这是我们自定义的,它可以很好地集成到IDE中。 改变这两个属性,也会改变按钮的外
4、观。双击控件,一样会弹出代码窗口,可以输入下面的代码: Static iCounter As Integer = 0 Static sText As String = GradientButton1.Text iCounter += 1 GradientButton1.Text = sText & iCounter 按F5键运行程序,在窗体中单击几次控件,可以看到,虽然按钮上的文字如我们所愿地发生着变化,但是按钮的颜色却在发生无法捉摸的改变,这是因为在设计时设定了按钮的颜色是随机变化的。,9.1.3点评:Graphics对象 这是一个比较复杂的案例,尽管它仅仅只是揭示了GDI+强大功能的冰山一
5、角。 对于继承、自定义属性这些内容,在第3章中讲过,你应该不会陌生,现在就把精力集中到使用GDI+的部分,也就是OnPaint事件处理程序上。 从OnPaint过程的PaintEvent参数中,可以得到几个重要的对象,其中之一就是Graphics对象: Dim g As Graphics = pe.Graphics Graphics对象是GDI+的基础对象,如果把GDI+理解成一套绘图的工具,例如笔、刷子和颜料等,那么Graphics就是画布,一切绘图都是发生在Graphics对象之上的。 创建 Graphics 对象后,可以使用它绘制线、填充形状和绘制文本等。与 Graphics 对象一起使
6、用的主要对象如表9.1所示。,接下来要取得需要画的区域,这样才会知道画的范围有多大,一般来说,这就是控件所占的屏幕矩形的大小。不仅如此,本例中还用Inflate语句把这个矩形缩小了一点,这是因为如果画的区域与Button大小一样大,就看不出Button的凸起效果了,你可以试着把这一句去掉,看看会发生什么现象。 再接着构造一个Brush对象,也就是画刷: Dim bgBrush As Brush = New Drawing2D.LinearGradientBrush( _ New Point(clientRect.X, clientRect.Y), _ New Point(clientRect.
7、Width, clientRect.Height), _ StartColor, EndColor) 它很像真的画刷,可以在画布上画出各种颜色,而且使用的这个LinearGradientBrush还可以刷出渐变色。,g.FillRectangle(bgBrush, clientRect) 它调用Graphics类的FillRectange方法,让bgBrush对象在clientRect的矩形中画上它想画的东西,我们知道,它会画出渐变色来。依此推广,所有的GDI+绘图几乎都是这种格式,用Graphics类的某个方法(画圆,画方或者写几个字)调用某个画笔(画刷、字体),画在某个地方(可能还要加上格
8、式什么的)。比如下面的画字符串语句: g.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), clientRectF, m_textFormat) 它调用对象本身的字体,写出对象本身的Text属性字符串,这就是为什么在“属性”窗体中改变这些属性的时候,按钮上的文字也会改变。,前面说过,一切绘图都要发生在Graphics对象上,下面的这一句就是: 可是,在按下按钮的时候,按钮的颜色就会改变,这是怎么实现的呢?就在按钮的OnClick事件中: Protected Overrides Sub OnClick(ByVal e As Ev
9、entArgs) MyBase.OnClick(e) Dim r As New Random() StartColor = Color.FromArgb(r.Next() EndColor = Color.FromArgb(r.Next() End Sub 把两个随机数分别赋给StartColor和EndColor,当按下按钮的时候,OnPaint事件也会被自动触发,从而导致按钮被重新绘制,呈现出新的颜色。,9.2 更多了解GDI+的文本功能,9.2.1简单的艺术字程序 1阴影效果 Dim textSize As SizeF Dim g As Graphics Dim shadowBrush
10、As Brush = Brushes.LightGray Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋体, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在图片框picCanvas上面建立一个新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Tex
11、t, textFont) 得到应该放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 画出阴影 g.DrawString(txtSampleText.Text, textFont, shadowBrush, _ x + 10, y + 10) 画出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),2浮雕效果 Dim textSize As SizeF Dim g As Grap
12、hics Dim backBrush As Brush = Brushes.Black Dim textBrush As Brush = Brushes.White Dim textFont As New Font(宋体, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在图片框picCanvas上面建立一个新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.tx
13、tSampleText.Text, textFont) 得到应该放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 画出浮雕背景 g.DrawString(txtSampleText.Text, textFont, backBrush, x + 1, y + 1) 画出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),3倒影效果 Dim textSize As SizeF Di
14、m g As Graphics Dim backBrush As Brush = Brushes.LightGray Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋体, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single Dim textHeight As Single 在图片框picCanvas上面建立一个新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到
15、示例文字的大小,textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到应该放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 得到文字高度 textHeight = textFont.GetHeight(g) 将全局变换平移(x, y),也就是将坐标原点移至(x, y), 使画布上将要画的所有内容向右边移动x,向下移动y g.TranslateTransform(x, y) g.Dr
16、awString(txtSampleText.Text, textFont, textBrush, 0, -textHeight) 将全局变量的y分量乘以-1,也就是使画布上将要画的所有内容垂直翻转180度 g.ScaleTransform(1, -1.0F) g.DrawString(txtSampleText.Text, textFont, backBrush, 0, -textHeight),4变形效果 在编写这段代码之前,请在窗体类定义的顶端加入一个Imports语句: Imports System.Drawing.Drawing2D 因为在代码中会用到System.Drawing.D
17、rawing2D名称空间中的Matrix类。 接下来还是双击btnTransform按钮,在它的事件处理程序中写下代码: Dim textSize As SizeF Dim g As Graphics Dim textBrush As Brush = Brushes.Black Dim textFont As New Font(宋体, Me.nudFontSize.Value, _ FontStyle.Regular) Dim x, y As Single 在图片框picCanvas上面建立一个新的空白Graphics g = picCanvas.CreateGraphics() g.Clea
18、r(Color.White), 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到应该放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.Height - textSize.Height) / 2 将全局变换平移(x, y),也就是将坐标原点移至(x, y), 使画布上将要画的所有内容向右边移动x,向下移动y g.TranslateTransform(x, y) 做切变,将原始矩形的下边缘水平移动矩形高度的1.0倍 D
19、im textTransform As Matrix = g.Transform textTransform.Shear(1.0, 0) g.Transform = textTransform 画出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, 0, 0),5三维效果 Dim textSize As SizeF Dim g As Graphics Dim backBrush As Brush = Brushes.Gray Dim textBrush As Brush = Brushes.Black Dim textFont As
20、 New Font(宋体, Me.nudFontSize.Value, FontStyle.Regular) Dim x, y As Single 在图片框picCanvas上面建立一个新的空白Graphics g = picCanvas.CreateGraphics() g.Clear(Color.White) 得到示例文字的大小 textSize = g.MeasureString(Me.txtSampleText.Text, textFont) 得到应该放置示例文字的位置 x = (picCanvas.Width - textSize.Width) / 2 y = (picCanvas.
21、Height - textSize.Height) / 2 画出背景的3D部分 Dim i As Integer For i = 10 To 0 Step -1 g.DrawString(txtSampleText.Text, textFont, backBrush, _ x - i, y + i) Next 画出文字 g.DrawString(txtSampleText.Text, textFont, textBrush, x, y),9.2.2程序点评 从本案例几个文字效果的设计中可以看到,GDI+在很大程度上是把文字作为图形来处理的,加上Brush、Font的有机配合,我们就拥有了丰富的
22、手段来制作各种各样的文字效果。,9.3 动画效果飞行的球,9.3.1编写动画 新建一个Windows窗体应用程序Case9_3,在窗体中放置一个定时器(Timer)控件,命名为tmrAnimation,将它的Enable属性设置为True,Interval属性设置为20,表示每20ms触发一个定时器事件。 随后,可以在代码窗口中,找到窗体Form1的类定义,在 Public Class Form1 Inherits System.Windows.Forms.Form 和 End Class 之间,加入代码: 用来“装”球的位图 Dim bitmap As bitmap,x, y记载位图的位置,
23、r代表球的半径 Dim x, y, r As Integer offsetX和offsetY分别表示球每次沿x轴和y轴移动的距离 Dim offsetX, offsetY As Integer 位图的宽和高 Dim bitmapWidth, bitmapHeight As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 初始化变量 r = 20 x = 1 y = 1 offsetX = 5 offsetY = 5 位图必
24、须足够大,不仅能容纳球本身,还能遮住上一个循环中位图留下的痕迹 bitmapWidth = 2 * r + 2 * offsetX bitmapHeight = 2 * r + 2 * offsetY,在位图中间画一个球 bitmap = New Bitmap(bitmapWidth, bitmapHeight) Dim g As Graphics g = Graphics.FromImage(bitmap) With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(offsetX, offsetY, 2 * r, 2 *
25、 r) .Dispose() End With End Sub Private Sub tmrAnimation_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAnimation.Tick Dim g As Graphics = CreateGraphics() 在恰当的位置画出位图(球) g.DrawImage(bitmap, _ x, y, bitmapWidth, bitmapHeight),g.Dispose() 如果球碰到了窗体的边界,则令其反弹 If x + bitmapWid
26、th = ClientSize.Width Or x = ClientSize.Height Or y = 0 Then offsetY = -offsetY End If 改变球的位置,以产生运动 x += offsetX y += offsetY End Sub,9.3.2几个程序设计技巧 产生运动图像本身并不难,事实上,让球“动起来”的代码仅仅只有三句而已。首先是画出球: g.DrawImage(bitmap, _ x, y, bitmapWidth, bitmapHeight) 其次是改变球的坐标,在下一次画出球的时候,球就“动”了: x += offsetX y += offsetY
27、 然而,有许多细节需要考虑,这就是程序中其他代码做的工作。主要需要处理的问题有两个:,1边界问题 当球到达窗体的边界时,应该让它反弹回来。为了达到这种效果,在画出球之后,要检测球是否到达了窗体的边界: If x + bitmapWidth = ClientSize.Width Or x = ClientSize.Height Or y = 0 Then offsetY = -offsetY End If 如果x + bitmapWidth大于窗体的宽度,也就是说,位图的右边已经到窗体的右边界之外了。或者,如果x小于等于0了,也就是说,位图的左边已经到了窗体的左边界之外了。这时就要让球在水平方向
28、上回转,也就是改变offsetX的符号。这样当下一个x += offsetX执行的时候,加变成了减,减变成了加,球也就乖乖地回头了。 在垂直方向的情况也是一样,当位图的下边到达了窗体的下边界之外,或者位图的上边到达了窗体的上边界之外的时候,就需要改变offsetY的符号,让球在垂直方向上回头。,2轨迹问题 由于在程序中我们已经解决了这个问题,所以你可能不知道轨迹问题会带来什么样的结果,那么请将Form1_Load过程中,在位图对象中间画圆的语句从原来的 With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(offset
29、X, offsetY, 2 * r, 2 * r) .Dispose() End With 改成: With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(0, 0, 2 * r, 2 * r) .Dispose() End With 然后再运行程序,就会看到如图9.12所示的画面。,在球走过的地方,留下了轨迹,这是为什么呢?其实,这是很自然的,因为当GDI+在窗体中画了一个球以后,并没有把这个球抹掉,而此后一次一次地画球,图像也都保留了下来,于是就产生了我们看到的现象。 那么,为什么原来的程序中就没有留下轨迹呢?那就要
30、看程序中初始化bitmapWidth 和bitmapHeight的代码了: 位图必须足够大,不仅能容纳球本身,还能遮住上一个循环中位图留下的痕迹 bitmapWidth = 2 * r + 2 * offsetX bitmapHeight = 2 * r + 2 * offsetY bitmap是用来容纳球的,应该说,其宽度和高度只要有球的直径那么大,也就是“2 * r”就够了,为什么要加上一个“2 * offsetX”和“2 * offsetY”呢?请看原来程序中,把球画在bitmap中的语句: With g .Clear(BackColor) .FillEllipse(Brushes.Re
31、d, New Rectangle(offsetX, offsetY, 2 * r, 2 * r) .Dispose() End With,其中FillEllipse语句把球画在bitmap的中间,让球离bitmap的左边界有offsetX的距离,离bitmap的上边界有offsetY的距离。由于bitmap的宽“2 * r + 2 * offsetX”,所以这时球离bitmap的右边界的距离是offsetX,而又因为bitmap的高是“2 * r + 2 * offsetY”,所以球离bitmap的下边界的距离是offsetY。换句话说,在球的左右留出了宽度为offsetX的边,在球的上下留出
32、了宽度为offsetY的边,而这个边的颜色与窗体颜色相同。 由于有这样一道边,当GDI+把bitmap画在窗体上的时候,就刚好可以遮蔽掉上一次留下的痕迹,于是,在球运动的过程中就没有轨迹出现了。但是,当把代码改成 With g .Clear(BackColor) .FillEllipse(Brushes.Red, New Rectangle(0, 0, 2 * r, 2 * r) .Dispose() End With 的时候,bitmap的效果如图9.14所示。,9.4动画效果眨动的眼睛,在上一节中,展示了如何通过连续地在不同的位置画出同一个图像来达到动画效果,这并不是达到动画唯一的途径。通
33、过在同一个位置连续地画不同的图像,也可以产生动画效果,这就是本节所要采用的方法。,9.4.1准备工作 9.4.2编写动画,9.5 操纵图像,GDI+不仅提供了绘图的功能,而且也提供了很多图像操纵功能,例如翻转、缩放和剪切等,这些功能使用起来都很方便。而且Windows Forms把它们包装在PictureBox控件中,让我们使用起来更加方便了。 本节中将要展示如何利用PictureBox以及GDI+来实现图像的翻转、缩放和剪切。完成这一切所需要做的工作非常简单,这也显示了GDI+强大的功能。,9.5.1简单的图像处理窗体 新建一个Windows窗体应用程序Case9_5,在窗体中放置4个按钮控
34、件,属性设置如表9.3所示。这4个按钮将分别完成它们所标示的功能。 接下来放入一个群组(GroupBox)控件,设置它的Text属性为“剪切图像”。在这个控件的区域内,放入4个文本框,属性设置如表9.4所示。它们是给用户来确定剪切区域的,也可以给它们加上标签。现在在GroupBox中放入两个按钮,属性设置如表9.5所示。,窗体布局,1向左旋转 双击“向左旋转”按钮,在它的事件处理程序中写入以下代码: picImage.Image.RotateFlip(RotateFlipType.Rotate270FlipNone) picImage.Refresh() 这一段代码让图像向右旋转270(也就相
35、当于向左旋转90),然后刷新图片框,让新的图像显示出来。在GDI+中提供的图像旋转一律都是向右旋转,所以要实现向左旋转的功能,需要做这样一个小小的替换。这时就可以使用“向左旋转”功能了,按F5键运行程序,然后在窗体上用鼠标单击【向左旋转】按钮,得到的效果如图9.18所示。如果继续单击【向左旋转】按钮,图像也会继续旋转。,2向右旋转 与“向左旋转”几乎相同,只是代码改成向右旋转90: picImage.Image.RotateFlip(RotateFlipType.Rotate90FlipNone) picImage.Refresh() 按F5键运行程序,然后在窗体上用鼠标单击【向右旋转】按钮。
36、,3放大 双击“放大”按钮,在它的事件处理程序中写入以下代码: picImage.SizeMode = PictureBoxSizeMode.StretchImage picImage.Width = CInt(picImage.Width * 1.25) picImage.Height = CInt(picImage.Height * 1.25) 首先把图片框picImage的定位方式设置为StretchImage,也就是拉扯图像,强迫图像与图片框一样大。接下来,把图片框的宽度和高度都放大到原来的1.25倍,这样图像也会被拉扯到原来的1.25倍。按F5键运行程序,用鼠标单击【放大】按钮,效果
37、如图9.20所示。,4缩小 与“放大”几乎相同,只是将图片框的宽度和高度都改成原来的0.8倍: picImage.SizeMode = PictureBoxSizeMode.StretchImage If picImage.Width 3 And picImage.Height 3 Then picImage.Width = CInt(picImage.Width * 0.8) picImage.Height = CInt(picImage.Height * 0.8) End If 按F5键运行程序,然后在窗体上用鼠标单击【缩小】按钮,效果如图9.21所示。,5剪切预览 剪切预览功能可以在用户
38、确定的剪切区域上显示一个红色方框,让用户可以看到剪切区域和剪切以后的效果。 双击“预览”按钮,在它的事件处理程序中写入以下代码: 在剪切区域画一个红色的方框 Dim recCropBox As New Rectangle(CInt(txtX.Text), _ CInt(txtY.Text), CInt(txtW.Text), CInt(txtH.Text) picImage.CreateGraphics.DrawRectangle(Pens.Red, recCropBox) 代码首先取得用户所选定的方框,用用户输入的4个参数来建立一个Rectangle(矩形)对象,然后在这个矩形框边上画上红色
39、。,6剪切 剪切也就是把图像的某一部分剪掉,只保留另外一部分。在这个程序中,用户输入的4个参数就是用来表示应该保留哪一部分的。 双击“剪切”按钮,在它的事件处理程序中写入以下代码: 记录剪切区域 Dim recCrop As New Rectangle(CInt(txtX.Text), _ CInt(txtY.Text), CInt(txtW.Text), CInt(txtH.Text) 生成一个新的Bitmap,将把剪切后的图像画到这里 Dim bmpCropped As New Bitmap(CInt(txtW.Text), CInt(txtH.Text) 得到一个新的Graphics对象
40、 Dim grBitmap As Graphics = Graphics.FromImage(bmpCropped) 把原始图像在recCrop中的部分画到bmpCropped上 grBitmap.DrawImage(picImage.Image, 0, 0, recCrop, GraphicsUnit.Pixel) 把新的bitmap放到picImage中 picImage.Image = bmpCropped 这段代码首先记录下用户选择的方框,用用户输入的4个参数建立一个矩形对象。,然后建立一个新的Bitmap来放置剪切以后的图像;接下来就把原始图像应该保留的部分画到新的Bitmap中,最
41、后把新的Bitmap放回到图片框中。换句话说,程序并没有真的“剪”和“切”图像,而只是新画了一幅而已。 按F5键运行程序,设置剪切参数为X = 0、Y= 0、宽度=100、高度=100,然后在窗体上用鼠标单击【剪切】按钮,效果如图9.23所示。,9.5.2程序点评 在本案例中,我们看到了使用PictureBox控件和GDI+可以轻松地完成许多图像处理工作,尽管这些功能还不足以让你自己编写出Photoshop来,但是完成日常的许多图像工作却已经足够了。,9.6 制作一个屏幕保护程序,在这一节中,我们会用GDI+制作一个屏幕保护程序。 制作Windows下的屏幕保护程序听起来神秘,其实相当简单,因
42、为Windows的屏幕保护程序实际上就是一个普通的应用程序而已,只不过它的扩展名不是.EXE而是.SCR。 Windows以命令行的方式调用这个程序,并且传入一些参数。例如,“/c”参数表示要对此屏幕保护程序进行设置;“/s”参数表示直接调用或预览;而“/p”参数表示选中显示器属性对话框中屏幕保护程序标签时,在对话框上的屏幕中显示预览效果等。,9.6.1目标 本节介绍的屏幕保护程序会在屏幕上画出一些很奇怪的图形,这些图形是由一条贝塞尔曲线和一条直线首尾相连组成的。在这个过程中你还会学到如何使用GDI+的一个很有力的工具GraphicsPath。,9.6.2窗体,9.6.3屏幕保护代码 下面就可
43、以开始编码了,把以下列出的代码写入类Form1的定义中,“Windows 窗体设计器生成的代码”与“End Class”之间。 Dim m_Graphics As Graphics Dim m_ScreenWidth, m_ScreenHeight As Integer Dim randnum As New Random() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 取得窗体的Graphics对象,以供绘画用 m_Graphics
44、= Me.CreateGraphics 取得窗体的宽度和高度,以便决定绘画的位置 m_ScreenWidth = Me.Width m_ScreenHeight = Me.Height End Sub,Private Sub tmrDrawShape_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrDrawShape.Tick 随机颜色 Dim randColor As Color 随机的GraphicsPath开始点和结束点 Dim randStartPoint, randEndPoint
45、 As Point 贝塞尔曲线的两个随机控制点 Dim randCtrlPoint1, randCtrlPoint2 As Point 随机的GraphicsPath Dim randGrphPath As New System.Drawing.Drawing2D.GraphicsPath() 生成随机颜色 randColor = Color.FromArgb(randnum.Next(255), randnum.Next(255), _ randnum.Next(255), randnum.Next(255),生成4个随机点 randStartPoint = New Point(randNum.Next(m_ScreenWidth), _ randNum.Next(m_ScreenHeigh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北恩施州宣恩县园投人力资源服务有限公司招聘外包服务人员10人备考题库附参考答案详解(培优a卷)
- 2026新疆塔城地区检察机关面向社会考试招聘聘用制书记员13人备考题库含答案详解(综合卷)
- 2026广西崇左天等县市场监督管理局招聘编外工作人员1人备考题库及一套答案详解
- 2026春季乐山市商业银行校园招聘100人备考题库含答案详解(考试直接用)
- 2026江苏南京大学BW20260405海外教育学院高等教育教师招聘备考题库及答案详解(有一套)
- 2026年甘肃省酒泉市博物馆招聘工作人员备考题库及参考答案详解(精练)
- 雨课堂学堂在线学堂云《市政道路工程施工(黑龙江建筑职业技术学院)》单元测试考核答案
- 百威英博明智饮酒拒绝酒驾公益活动方案x
- 2025-2026学年度吉林省白山市部分学校高一上学期1月期末历史试题(含答案)
- 2026黎明职业大学招聘编制内博士研究生学历学位教师24人备考题库(福建)附参考答案详解(典型题)
- 2025年及未来5年中国软件外包服务行业市场深度分析及发展前景预测报告
- 2025海康威视安检机用户手册
- 2025年安徽省委党校在职研究生招生考试(政治理论)历年参考题库含答案详解(5套)
- 学生外出写生管理办法
- 热处理电阻炉设计
- 毕业设计(论文)-龙门式建筑3D打印装置设计
- 青岛版(六三制)小学科学四年级下册20课《导体和绝缘体》课件
- 无创辅助呼吸护理要点
- 施工现场环境保护责任清单
- DL∕T 5342-2018 110kV~750kV架空输电线路铁塔组立施工工艺导则
- 《乙烯基聚乙二醇醚(VPEG)、乙烯氧基丁基聚乙二醇醚(VBPEG)》
评论
0/150
提交评论