图片类型的变量可以通过读取流的方式进行初始化(就像我们打开本地的一张图片,会有一份本地流的副本)。既然在内存中我们有自己的字节,我们可以声明一个基于数组的MemoryStream,并且使用它作为位图的源。在这一点上,为了实现完美的工作位图,我们可以利用变量 e,其中的OnPaint事件可以访问自己,以此在我们控制的位置[0;0]绘制图像。
编译我们的项目后,QRBox将出现在工具箱里,准备在Form上使用。 
使用它非常简单,只需要设置它的数据和属性,还有控制刷新的回调。
接下来的简单Form例子会展示它是如何工作的。我已经向我的Form中添加了QrBox,一个标准的TextBox和Button。 
当用户按下“制作”按钮时,我们将会读到一段TextBox文本,并将其传送到QrBox Data Property中,并且触发刷新方法。为了开始针对谷歌Charts的远程查询,按按钮产生的代码将会简单如下: 1 2 3 4 | Private Sub Button1_Click(sender As Object , e As EventArgs) Handles Button1.Click
QrBox1.Data = TextBox1.Text
QrBox1.Refresh()
End Sub
|
UserControl的完整代码 QrBox UserControl的完整代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | Imports System.Net
Public Class QRBox
Const _GOOGLE_URL As String = "http://chart.googleapis.com/chart?chs={WIDTH}x{HEIGHT}&cht=qr&chl={DATA}"
Dim _DATA As String = String .Empty
Property Data As String
Get
Return _DATA
End Get
Set (value As String )
_DATA = value
End Set
End Property
Private Function getQRURI() As String
Dim _qrAddr As String = _GOOGLE_URL.Replace( "{WIDTH}" , Me .Width.ToString).Replace( "{HEIGHT}" , Me .Height.ToString)
_qrAddr = _qrAddr.Replace( "{DATA}" , WebUtility.UrlEncode(_DATA))
Return _qrAddr
End Function
Protected Overrides Sub OnPaint(e As PaintEventArgs)
MyBase .OnPaint(e)
If _DATA Is Nothing Then Exit Sub
Dim client As New WebClient()
Dim bytes() As Byte = client.DownloadData(getQRURI())
client.Dispose()
Dim memStream As New IO.MemoryStream(bytes)
Dim bmp As Bitmap = Bitmap.FromStream(memStream)
memStream.Dispose()
e.Graphics.DrawImage(bmp, 0, 0)
End Sub
Public Sub New ()
InitializeComponent()
End Sub
End Class
|
我希望本文对你的项目有用。 祝你编码愉快,工作愉快!
|