Skip to content

QRCode 类

QRCode是无窗口轻量级控件,从其Payload——URL、纯文本或原始字节数组——渲染QR码。编码由嵌入的qrcodegen库在进程内执行,结果矩阵在设计时和运行时直接绘制在父级上。每当任何编码属性更改时图片会自动重新生成,因此QR控件可以声明式地连接到数据绑定或其他UI状态,无需额外管道。

Image一样,QRCode没有hWnd且不可聚焦。它是在窗体中嵌入可扫描码(登录、支付、Wi-Fi凭据、联系人卡片、应用深度链接等)而不为重量级PictureBox付出代价的正确选择。

默认属性是Picture(只读生成图像),默认事件是Click

vb
Private Sub Form_Load()
    QRCode1.Payload = "https://www.twinbasic.com"
    QRCode1.EccMode = vbQRCodegenEccHigh    ' 30 % parity
    QRCode1.ForeColor = vbBlue
End Sub

Private Sub QRCode1_Click()
    MsgBox "QR code clicked"
End Sub

无窗口渲染

QRCode没有hWnd。框架在父级的绘制周期中将其直接绘制到父级的绘图表面上。其权衡与任何无窗口控件相同:

  • 无焦点、无键盘输入、无KeyDown / KeyPress / KeyUp / GotFocus / LostFocus / Validate
  • 没有可传递给API函数的hWnd,也没有SetFocus
  • 不能承载子控件。

对于需要这些功能的QR码,将QRCode承载在PictureBoxFrame内,并将可聚焦控件放在旁边。

编码负载

Payload属性是Variant,接受String(文本或URL)或一维Byte()数组(用于二进制数据)。编码器根据字符串内容自动选择最紧凑的段模式——数字、字母数字或字节;对于字节数组,无条件使用字节模式,数据按原样编码。空负载会将Picture清除为Nothing;在设计时,矩形会显示*(无负载文本)*占位符。

每当PayloadForeColorModuleSizeSquareModulesEccModeEccBoostMinVersionMaxVersionMaskType更改时,QR码会重新生成,新图片通过Picture可见。Refresh仅重绘——不会强制重新编码。

纠错

QR码嵌入Reed-Solomon奇偶校验流,允许解码器从矩阵部分损坏中恢复。EccMode选择矩阵专用于奇偶校验的比例:

常量约恢复率
vbQRCodegenEccLow07%
vbQRCodegenEccMedium115%
vbQRCodegenEccQuartile225%
vbQRCodegenEccHigh330%

EccBoostTrue(默认)时,编码器在负载仍适合相同QR版本的情况下将奇偶校验级别提升到超出配置的最低值——自动实现更好的弹性。

版本和掩码

QR码版本(1到40)设置矩阵大小:版本1为21×21模块,版本40为177×177模块。MinVersionMaxVersion约束编码器的搜索;它选择范围内适合所选EccMode下负载的最小版本。默认值(140)跨越完整范围。1..40外的值被钳制,如果MinVersion最终大于MaxVersion,则重置为1

MaskType选择应用于矩阵的八种掩码之一,以打破混淆扫描器的模式。vbQRCodegenMaskAuto(-1,默认)选择具有最佳惩罚分数的掩码;八个命名值vbQRCodegenMask0vbQRCodegenMask7强制使用特定掩码——适用于可重现性。

模块渲染

ModuleSize是生成Picture中一个模块的像素大小。默认120。图片在绘制时按比例缩小到控件矩形,因此ModuleSize的选择仅在图片被保存或提取供其他用途(剪贴板、拖放、SavePicture……)时有影响。

SquareModules选择图片中每个模块的绘制方式:充填正方形(True,默认)或充填圆形(False——大多数扫描器仍可容忍的风格选择)。

Square与此不同,控制图片在控件上的渲染:为True(默认)时图片信箱式居中,无论控件宽高比如何保持正方形;为False时图片拉伸以填充矩形。

边框

BorderStyle选择无边框(默认)和围绕矩形绘制的单凹陷边框。当边框存在时,Appearance选择3-D和平面(单色)版本。

OLE 拖放

QRCode支持OLE拖放操作的两端:

  • OLEDragMode控制源端。使用vbOLEDragAutomatic时,在控件上方按住鼠标并开始拖动会自动将当前Picture复制到结果DataObject中——便于将生成的QR码拖到另一个图片显示或拖到资源管理器中的文件。使用vbOLEDragManual(默认)时,拖动必须通过从MouseDown处理程序调用OLEDrag来发起。
  • OLEDropMode控制目标端。使用vbOLEDropManual时,OLEDragOverOLEDragDrop事件触发,应用程序可以决定如何处理——例如将Payload设置为放置的文本。vbOLEDropAutomaticQRCode上不受支持,赋值它会导致运行时错误5(无效的过程调用或参数)。

数据绑定

设置DataSourceDataField将控件连接到Data控件记录集的字段。绑定是不对称的:

  • 入站(记录集→控件):非空、非空白的字段值被解释为文本并赋值给Payload;QR码随后重新编码并重绘。Null和空值将Picture清除为Nothing
  • 出站(控件→记录集):当前QRPicture被序列化为字节数组并写回绑定字段——适用于存储渲染码的快照,但注意绑定输出的内容与输入不同。

属性

Anchors

决定控件的哪些边随父级对应边调整的边集合。只读——通过返回的Anchors对象设置各个.Left.Top.Right.Bottom标志。

Appearance

边框的样式,作为AppearanceConstants的成员:vbAppearFlatvbAppear3d(默认)。仅在BorderStylevbFixedSingleBorder时有意义。

BorderStyle

绘制在矩形周围的边框样式。ControlBorderStyleConstants的成员:vbNoBorder(0,默认)或vbFixedSingleBorder(1)。

Container

承载此QRCode的控件——通常是窗体、FramePictureBoxUserControl。用Get读取,用Set更改。

ControlType

标识底层控件类型的只读ControlTypeConstants值。始终为vbImage——QRCode与Image共享其控件类型标签。

DataChanged

绑定的Picture自上次从DataSource保存或刷新以来是否已被写入。Boolean。设置DataChanged = True也会将绑定记录集标记为脏。

DataField

绑定的DataSource记录集中设置Payload的字段名称。String

DataFormat

当应用程序需要自定义处理时,在原始记录集值和显示的负载之间转换的StdDataFormat。用Set设置。

DataMember

DataSource公开多个记录集时,要绑定的成员名称。String

DataSource

Data控件(或其他DataSource提供者)的引用,其记录集为DataField提供值。用Set设置。

Dock

控件在其容器中的停靠位置。DockModeConstants的成员:vbDockNone(默认)、vbDockLeftvbDockTopvbDockRightvbDockBottomvbDockFill。停靠的控件忽略Anchors

DragIcon

在控件被拖放时用作鼠标光标的StdPicture(参见DragDragMode)。

DragMode

控件是否应在用户按住鼠标时自行拖动(手动VB拖动形式,与OLE拖动不同)。DragModeConstants的成员:vbManual(0,默认——从代码调用Drag)或vbAutomatic(1)。

EccBoost

True(默认)时,编码器被允许在负载仍适合相同QR版本时将实际奇偶校验级别提升到EccMode之上。Boolean。设为False以获得对不同长度负载可重现的输出。

EccMode

编码时使用的最低纠错级别。QRCodegenEccConstants(在VB包中定义)的成员:

常量约恢复率
vbQRCodegenEccLow07%
vbQRCodegenEccMedium115%
vbQRCodegenEccQuartile225%
vbQRCodegenEccHigh330%

默认vbQRCodegenEccLow。超出范围的值被钳制。

Enabled

决定控件是否接受鼠标输入。禁用的QRCode仍正常绘制但不引发鼠标事件。Boolean,默认True

ForeColor

生成QR码中深色模块的颜色,作为OLE_COLOR。默认vbBlack。浅色模块始终透明——控件的父级透过它们显示,因此将QRCode放置在对比色背景上。

Height

控件的高度,默认以缇为单位(或以容器的ScaleMode单位)。Double

Index

当控件是控件数组的一部分时,此实例在数组中的Long零基索引。在非数组实例上读取Index会引发运行时错误343(对象不是数组)。运行时只读。

Left

从容器左边缘到控件左边缘的水平距离。Double

MaskType

应用于编码矩阵的掩码,以打破混淆扫描器的模式。QRCodegenMaskConstants(在VB包中定义)的成员:vbQRCodegenMaskAuto(-1,默认——选择具有最低惩罚分数的掩码)或vbQRCodegenMask0……vbQRCodegenMask7之一(强制使用对应编号的掩码)。超出范围的值回退到vbQRCodegenMaskAuto

MaxVersion

编码器允许选择的最大QR版本。Long,默认40。钳制到1..40。如果MinVersion在编码时超过MaxVersionMinVersion被重置为1

MinVersion

编码器允许选择的最小QR版本。Long,默认1。编码器选择MinVersion..MaxVersion范围内在请求的EccMode下适合负载的最小版本。钳制到1..40

ModuleSize

生成Picture中一个QR模块的像素大小。Long,默认120。图片在绘制时按比例缩放到控件矩形,因此较大的ModuleSize仅在图片以其原生分辨率捕获或保存时有影响。

MouseIcon

MousePointervbCustom且指针在控件上方时用作鼠标光标的StdPicture

MousePointer

指针在控件上方时显示的鼠标光标。MousePointerConstants的成员。

Name

控件在其父窗体上的唯一设计时名称。运行时只读。

OLEDragMode

当用户开始拖动控件时是否自动启动OLE拖动。OLEDragConstants的成员:vbOLEDragManual(0,默认——应用程序调用OLEDrag)或vbOLEDragAutomatic(1——框架自动将当前Picture复制到结果DataObject中)。

OLEDropMode

控件如何响应到达其上的OLE放置。OLEDropConstants的受限成员:vbOLEDropNone(0,默认)或vbOLEDropManual(1)。QRCode不支持自动放置;赋值vbOLEDropAutomatic会引发运行时错误5(无效的过程调用或参数)。

Parent

对最终包含控件的Form(或UserControl)的引用。只读。

Payload

QR码中编码的数据。Variant,默认"https://www.twinbasic.com"

语法:object.Payload [ = value ]

接受用于文本或URL负载的String,或用于任意二进制数据的一维Byte()数组。编码器根据字符串内容自动选择最紧凑的段模式——数字、字母数字或字节。赋值空值会将Picture清除为Nothing

Picture

生成的QR码,作为StdPicture默认属性。只读——由编码器从Payload和其他编码属性生成。当Payload为空时返回Nothing

Square

生成的图片是否在控件矩形内以1:1宽高比渲染(True,默认——图片居中信箱式显示)或拉伸以填充(False)。Boolean

SquareModules

编码矩阵的每个模块在图片中是否绘制为充填正方形(True,默认)或充填圆形(False)。Boolean

Tag

应用程序可用于将自定义数据与控件关联的自由格式String。框架忽略此属性。

ToolTipText

用户悬停在控件上方时作为工具提示显示的多行String

Top

从容器顶部到控件顶部的垂直距离。Double

Visible

控件是否显示。Boolean,默认True。隐藏的QRCode在运行时完全跳过绘制传递,除了在IDE设计器中它们始终渲染以便开发者定位。

WhatsThisHelpID

标识应用程序帮助文件中"这是什么?"帮助弹出主题的Long。参见ShowWhatsThis

Width

控件的宽度,默认以缇为单位(或以容器的ScaleMode单位)。Double

方法

Drag

开始、完成或取消手动VB样式拖动操作。与OLE拖动不同——参见OLEDrag

语法:object.Drag [ Action ]

Action
可选 DragConstants的成员:vbCancel(0)、vbBeginDrag(1,默认)或vbEndDrag(2)。

Move

在单次调用中重新定位并可选地调整控件的尺寸。

语法:object.Move Left [, Top [, Width [, Height ] ] ]

Left
必需 给出新水平位置的Single
TopWidthHeight
可选 对应属性的新值。省略的值保持不变。

OLEDrag

从控件发起OLE拖动操作,引发OLEStartDrag事件以便应用程序填充DataObject(或者,如果源已被预填充,则立即开始拖动)。

语法:object.OLEDrag

Refresh

强制立即重绘控件在父级绘图表面上的矩形。不会重新编码QR——为此需重新赋值Payload(或任何编码属性),这会自动触发重新生成。

语法:object.Refresh

ShowWhatsThis

以"这是什么?"弹窗形式显示由WhatsThisHelpID标识的主题。

语法:object.ShowWhatsThis

ZOrder

QRCode带到容器内无窗口同级堆栈的前面或后面。

语法:object.ZOrder [ Position ]

Position
可选 ZOrderConstants的成员:vbBringToFront(0,默认)或vbSendToBack(1)。

事件

Click

当用户单击控件矩形时引发。默认事件。

语法:object_Click( )

DblClick

当用户双击控件矩形时引发。

语法:object_DblClick( )

DragDrop

当手动VB样式拖动操作在目标控件上结束时在目标控件上引发。

语法:object_DragDrop( Source As Control, X As Single, Y As Single )

DragOver

当手动VB样式拖动操作进行中时在光标下方的控件上引发。

语法:object_DragOver( Source As Control, X As Single, Y As Single, State As Integer )

Initialize

在控件已连接到其容器的绘制周期但首次绘制之前引发一次。适用于依赖容器状态的最后一刻设置。

语法:object_Initialize( )

MouseDown

当用户在控件上方按下任意鼠标按钮时引发。

语法:object_MouseDown( Button As Integer, Shift As Integer, X As Single, Y As Single )

MouseMove

当光标在控件上方移动时引发。

语法:object_MouseMove( Button As Integer, Shift As Integer, X As Single, Y As Single )

MouseUp

当用户在控件上方释放鼠标按钮时引发。

语法:object_MouseUp( Button As Integer, Shift As Integer, X As Single, Y As Single )

OLECompleteDrag

当OLE拖动操作完成时在源控件上引发,指示目标接受了哪种效果(复制、移动、无)。

语法:object_OLECompleteDrag( Effect As Long )

OLEDragDrop

当用户在目标控件上放置数据时在目标控件上引发。

语法:object_OLEDragDrop( Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single )

OLEDragOver

当OLE拖动经过目标控件时在目标控件上引发。

语法:object_OLEDragOver( Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer )

OLEGiveFeedback

在拖动期间在源控件上引发,以便应用程序调整光标或其他视觉反馈。

语法:object_OLEGiveFeedback( Effect As Long, DefaultCursors As Boolean )

OLESetData

当目标请求已注册但尚未提供的格式的数据时在源控件上引发。

语法:object_OLESetData( Data As DataObject, DataFormat As Integer )

OLEStartDrag

在OLE拖动开始时在源控件上引发,以便应用程序填充DataObject并选择允许的效果。当OLEDragModevbOLEDragAutomatic且用户开始拖动时也会自动引发。

语法:object_OLEStartDrag( Data As DataObject, AllowedEffects As Long )

twinBASIC及其LOGO版权为作者"韦恩"所有