欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在控制台中绘制图像

程序员文章站 2022-05-14 18:23:07
在控制台中绘制图像是一件非常有趣的事,不知情的人看到了会感觉很惊讶,如果你有GDI+绘制基础,那么继续往下看。 运行效果 代码中用到的素材图片 ......

在控制台中绘制图像是一件非常有趣的事,不知情的人看到了会感觉很惊讶,如果你有gdi+绘制基础,那么继续往下看。

imports system.drawing
imports system.runtime.interopservices

module module1
    '引用win32api,该函数用来获取当前命令行的窗口句柄,以便后面从该句柄创建画布
    <dllimport("kernel32.dll", setlasterror:=true)>
    private function getconsolewindow() as intptr
    end function
    dim h as intptr = getconsolewindow()

    sub main()
        '随便输出一行文本
        console.title = "脚本编译器"
        console.readkey()
        dim s as string = "正在将脚本编译为可执行exe文件..."
        console.write(s)
        console.foregroundcolor = consolecolor.white
        for i as integer = 1 to 100 step 2
            '依次从1到100绘制一个进度条
            drawpersion(i)
            threading.thread.sleep(100)
        next
        '最后再绘制一次100%时的进度条
        drawpersion(100)
        console.writeline()
        console.writeline()
        console.writeline()
        console.writeline("操作完成")
        while true
            console.readkey()
            console.writeline()
        end while
    end sub
    '绘制进度条过程
    private sub drawpersion(i as integer)
        dim t as integer = console.cursortop
        dim s as string = "正在将脚本编译为可执行exe文件..."
        using g as graphics = graphics.fromhwnd(h)
            g.smoothingmode = drawing2d.smoothingmode.highquality
            '设置光标位置,计算出位置应该在文本结尾
            console.setcursorposition(s.length * 2, t)
            '通过当前命令行文本行数计算出最末行的起始位置,用以绘制图像
            dim n as integer = (t + 1) * console.cursorsize - 5
            '绘制一个图片上去
            g.drawimage(my.resources.compile, new rectangle(0, n, 16, 16), new rectangle(0, 0, 16, 16), graphicsunit.pixel)
            '由于图片大小已知,又可计算出进度条左上角的起始位置,以下为绘制一个线性渐变的进度条
            using lg as new drawing2d.lineargradientbrush(new point(0, n), new point(0, n + console.cursorsize), color.steelblue, color.dodgerblue)
                '模拟值范围为0到300,并乘以当前传入的循环i值
                dim l as integer = 300 / 100 * i
                '用线性渐变填充一个矩形,该矩形是上面计算出的从图片右侧和同行y值,长度为当前i比例的矩形
                g.fillrectangle(lg, new rectangle(20, n, l, 16))
                '得到进度文本的左上角,其实就是进度条矩形的左上角
                dim pt as point = new point(20, n)
                '绘制黑色文本模拟投影
                g.drawstring(string.format("{0}%", i), new font("宋体", 12, fontstyle.bold), brushes.black, pt)
                '坐标往左上角偏移1像素绘制白色文本
                pt += new point(-1, -1)
                g.drawstring(string.format("{0}%", i), new font("宋体", 12, fontstyle.bold), brushes.white, pt)
            end using
        end using
    end sub
end module

  运行效果

在控制台中绘制图像

代码中用到的素材图片

在控制台中绘制图像