Form1.vb
上传用户:ysf151
上传日期:2022-07-25
资源大小:14k
文件大小:5k
源码类别:

绘图程序

开发平台:

Visual Basic

  1. Imports System
  2. Imports System.IO
  3. Imports System.Threading
  4. Imports System.Drawing
  5. Public Class Form1
  6.     ' 局部变量声明
  7.     Private tDrawImag As Thread         ' 绘画线程序
  8.     Private DefaultPath As String       ' 默认图片路径
  9.     Private DefaultExName As String     ' 默认图片文件扩展名
  10.     Private G As Graphics               ' 主画笔
  11.     Private IsAbortThread As Boolean    ' 是否关闭线程
  12.     ' 委托声明
  13.     Private Delegate Sub DeleDrawImage(ByVal Filename As String)    ' 绘画
  14.     Private Delegate Sub DeleCloseWindow()                          ' 关闭窗口
  15.     ' 事件: 窗体第一次显示时发生
  16.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  17.         ' 初始化局部变量
  18.         Me.DefaultPath = Environment.CurrentDirectory & "images"
  19.         Me.DefaultExName = "GIF,JPG"
  20.     End Sub
  21.     ' 事件: 按扭被点击后发生
  22.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  23.         ' 线程不存在或则不在运行的情况
  24.         If tDrawImag Is Nothing OrElse Not tDrawImag.ThreadState = ThreadState.Running Then
  25.             tDrawImag = New Thread(AddressOf Me.ThreadDraw)
  26.             tDrawImag.Start()
  27.             Return
  28.         End If
  29.         MessageBox.Show("正在绘制,请稍候。。。")
  30.     End Sub
  31.     ' 事件: 窗口准备关闭时发生
  32.     Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  33.         ' 线程存在且在运行的情况
  34.         If Not tDrawImag Is Nothing AndAlso Me.tDrawImag.ThreadState = ThreadState.Running Then
  35.             ' 标记需要关闭线程
  36.             Me.IsAbortThread = True
  37.             ' 取消此此关闭窗口
  38.             e.Cancel = True
  39.             ' 窗口隐藏
  40.             Me.Hide()
  41.             ' 启动关闭窗体线程序
  42.             Dim tClose As New Thread(AddressOf Me.ThreadCloseWindow)
  43.             tClose.Start()
  44.         End If
  45.     End Sub
  46.     ''' <summary>
  47.     ''' 绘制指定目录中的所有指定类型的文件
  48.     ''' </summary>
  49.     ''' <param name="Path">目录</param>
  50.     ''' <param name="ExFilename">文件扩展名</param>
  51.     ''' <remarks></remarks>
  52.     Private Sub DrawImages(ByVal Path As String, ByVal ExFilename As String)
  53.         ' 变量声明
  54.         Dim ExName As String                    ' 用于保存扩展名
  55.         Dim DrawImageDelegate As DeleDrawImage  ' 绘画委托
  56.         ' 修正扩展名类型
  57.         ExFilename = "," & ExFilename.ToUpper() & ","
  58.         ' 获得目录信息
  59.         Dim infoDir As New DirectoryInfo(DefaultPath)
  60.         If Not infoDir.Exists Then : Return : End If
  61.         ' 变量赋值
  62.         Me.G = Me.PictureBox1.CreateGraphics()  ' 获得画笔
  63.         DrawImageDelegate = New DeleDrawImage(AddressOf DrawImage)
  64.         ' 循环目录获得所有文件
  65.         For Each infoFile As FileInfo In infoDir.GetFiles()
  66.             ' 需要关闭线程的情况
  67.             If Me.IsAbortThread Then
  68.                 Exit For
  69.             End If
  70.             ' 获得小数点后的扩展名字符串
  71.             ExName = "," & infoFile.Extension.Substring(1).ToUpper() & ","
  72.             If Not ExFilename.IndexOf(ExName) = -1 Then
  73.                 ' 绘制文件
  74.                 Me.Invoke(DrawImageDelegate, New Object() {infoFile.FullName})
  75.                 ' 绘制后停留1秒
  76.                 'Thread.Sleep(1000)
  77.             End If
  78.         Next
  79.         ' 释放画笔
  80.         Me.G.Dispose()
  81.     End Sub
  82.     ''' <summary>
  83.     ''' 绘制文件到窗口
  84.     ''' </summary>
  85.     ''' <param name="Filename"></param>
  86.     ''' <remarks></remarks>
  87.     Private Sub DrawImage(ByVal Filename As String)
  88.         ' 获得图象
  89.         Dim myBitmap As New Bitmap(Filename)
  90.         ' 修正图象尺寸
  91.         Dim iX As Double                         ' 缩放比例
  92.         Dim iWidth As Integer = myBitmap.Width   ' 宽度
  93.         Dim iHeight As Integer = myBitmap.Height ' 高度
  94.         ' 图象宽度超过450的情况, 按比例改变图象尺寸
  95.         If iWidth > Me.PictureBox1.Width Then
  96.             iX = Me.PictureBox1.Width / iWidth
  97.             iWidth *= iX
  98.             iHeight *= iX
  99.         End If
  100.         ' 图象高度超过200的情况
  101.         If iHeight > Me.PictureBox1.Height Then
  102.             iX = Me.PictureBox1.Height / iHeight
  103.             iWidth *= iX
  104.             iHeight *= iX
  105.         End If
  106.         ' 绘制
  107.         G.Clear(Me.BackColor)
  108.         G.DrawImage(myBitmap, 0, 0, iWidth, iHeight)
  109.         ' 释放
  110.         myBitmap.Dispose()
  111.     End Sub
  112.     ''' <summary>
  113.     ''' 线程用,开始按默认路径绘画
  114.     ''' </summary>
  115.     ''' <remarks></remarks>
  116.     Private Sub ThreadDraw()
  117.         Console.WriteLine("绘画线程开始")
  118.         Me.DrawImages(Me.DefaultPath, Me.DefaultExName)
  119.         Console.WriteLine("绘画线程退出")
  120.     End Sub
  121.     ''' <summary>
  122.     ''' 线程用,关闭窗口
  123.     ''' </summary>
  124.     ''' <remarks></remarks>
  125.     Private Sub ThreadCloseWindow()
  126.         While Me.tDrawImag.ThreadState = ThreadState.Running
  127.             Thread.Sleep(100)
  128.         End While
  129.         Me.Invoke(New DeleCloseWindow(AddressOf Me.Close))
  130.     End Sub
  131. End Class