用GDI+绘制图片

本节内容可以参考示例文件"CaseStudy\WebViewer\拦截响应.Table"的窗口"GDI+绘图"。

本节的任务是演示如何拦截图片资源请求,并用GDI+绘制图片,然后直接将绘制好的图片设置为Response显示。

提示:既然是开发Web应用,自然有大量优秀的图表库可以使用,一样都可以实现自动刷新绘制,而且能响应事件,这里只是提供了另一种可能。

设计步骤

1、为方便测试,直接在窗口的AfterLoad事件中生成网页,代码如下:

Dim html As String =<![CDATA[
<!DOCTYPE html>
<html>
<head>
    <title>
动态图片生成测试</title>
    <style>
        body { font-family: Arial; padding: 20px; }
        .chart-container { margin: 20px 0; }
        img { border: 1px solid #ccc; margin: 10px; }
    </style>
</head>
<body>
    <h1>
动态图片生成测试</h1>
    <div class="chart-container">
        <h3>
饼图</h3>
        <img src="custom://chart/pie" alt="
动态饼图" id="pie-chart">
        <button onclick="refreshImage('pie-chart', 'pie')">
刷新</button>
    </div>
    <div class="chart-container">
        <h3>
柱状图</h3>
        <img src="custom://chart/bar" alt="
动态柱状图" id="bar-chart">
        <button onclick="refreshImage('bar-chart', 'bar')">
刷新</button>
    </div>
    <script>
        function refreshImage(imgId, chartType) {
            const img = document.getElementById(imgId);
            img.src = 'custom://chart/' + chartType + '?t=' + Date.now();
        }
        //
自动刷新
        setInterval(() => {
            refreshImage('pie-chart', 'pie');
            refreshImage('bar-chart', 'bar');
        }, 1000);
    </script>
</body>
</html>
]]>
.Value
Dim
wv As WebViewer = e.Form.Controls("WebViewer1").WebViewer
Await
wv.EnsureCoreWebView2Async(Nothing) '初始化浏览器
wv.NavigateToString(html)

网页中插入了两个图片,这两个图片的地址为"custom://chart/pie"和"custom://chart/bar",这是个胡编的图片地址,所以现在你打开窗口,WebViewer并不会显示图片。

2、为了动态生成这两个图片,我们WebResourceRequested事件代码设置为:

Dim wv As WebViewer = e.Sender.WebViewer
Dim
url = e.Request.Uri.ToLower()
If
url.StartsWith("custom://chart/") Then '如果使用的是我们"胡编"的图片地址
   
' 生成图表图片
   
Dim fnt As New Font("微软雅黑", 14)
   
Dim chartType = url.Substring("custom://chart/".Length) '获取图片类型
   
If chartType.Contains("?") Then chartType = chartType.Split("?")(0) '去掉
   
Using bitmap As New Bitmap(400, 300) '图片宽度400像素,高度300像素
       
Using g As Graphics = Graphics.FromImage(bitmap)
            g.Clear(Color.White)
'白底
           
If chartType.StartsWith("pie") Then '饼图
               
Dim angle1 As Integer = Rand.Next(30, 160)
               
Dim angle2 As Integer = Rand.Next(30, 160)
                g.FillPie(Brushes.Red, 50, 50, 200, 200, 0, angle1)
                g.FillPie(Brushes.Blue, 50, 50, 200, 200, angle1, angle2)
                g.FillPie(Brushes.Green, 50, 50, 200, 200, angle1 + angle2, 360 - angle1 - angle2)
                g.DrawString(
"动态饼图", fnt, Brushes.Black, 150, 10)
           
ElseIf chartType.StartsWith("bar") Then '柱状图
               
Dim y1 As Integer = Rand.Next(50, 250)
               
Dim y2 As Integer = Rand.Next(50, 250)
               
Dim y3 As Integer = Rand.Next(50, 250)
                g.FillRectangle(Brushes.Blue, 50, y1, 50, 300 - y1)
                g.FillRectangle(Brushes.Green, 120, y2, 50, 300 - y2)
                g.FillRectangle(Brushes.Red, 190, y3, 50, 300 - y3)
                g.DrawString(
"动态柱状图", fnt, Brushes.Black, 150, 10)
           
Else
               
' 默认图片
                g.DrawString(
"未知图表类型", fnt, Brushes.Red, 100, 100)
           
End If
       
End Using
       
' 转换为PNG内存流
       
Dim ms As New MemoryStream()
        bitmap.Save(ms, ImageFormat.Png)
        ms.Position = 0
        e.Response = wv.CoreWebView2.Environment.CreateWebResourceResponse( ms, 200,
"OK", "Content-Type:image/png")
   
End Using
End
If

现在就能显示图片了,而且每隔1秒刷新一下:


本页地址:http://www.foxtable.com/webhelp/topics/6219.htm