QRCode 类
QRCode是无窗口轻量级控件,从其Payload——URL、纯文本或原始字节数组——渲染QR码。编码由嵌入的qrcodegen库在进程内执行,结果矩阵在设计时和运行时直接绘制在父级上。每当任何编码属性更改时图片会自动重新生成,因此QR控件可以声明式地连接到数据绑定或其他UI状态,无需额外管道。
与Image一样,QRCode没有hWnd且不可聚焦。它是在窗体中嵌入可扫描码(登录、支付、Wi-Fi凭据、联系人卡片、应用深度链接等)而不为重量级PictureBox付出代价的正确选择。
默认属性是Picture(只读生成图像),默认事件是Click。
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承载在PictureBox或Frame内,并将可聚焦控件放在旁边。
编码负载
Payload属性是Variant,接受String(文本或URL)或一维Byte()数组(用于二进制数据)。编码器根据字符串内容自动选择最紧凑的段模式——数字、字母数字或字节;对于字节数组,无条件使用字节模式,数据按原样编码。空负载会将Picture清除为Nothing;在设计时,矩形会显示*(无负载文本)*占位符。
每当Payload、ForeColor、ModuleSize、SquareModules、EccMode、EccBoost、MinVersion、MaxVersion或MaskType更改时,QR码会重新生成,新图片通过Picture可见。Refresh仅重绘——不会强制重新编码。
纠错
QR码嵌入Reed-Solomon奇偶校验流,允许解码器从矩阵部分损坏中恢复。EccMode选择矩阵专用于奇偶校验的比例:
| 常量 | 值 | 约恢复率 |
|---|---|---|
| vbQRCodegenEccLow | 0 | 7% |
| vbQRCodegenEccMedium | 1 | 15% |
| vbQRCodegenEccQuartile | 2 | 25% |
| vbQRCodegenEccHigh | 3 | 30% |
当EccBoost为True(默认)时,编码器在负载仍适合相同QR版本的情况下将奇偶校验级别提升到超出配置的最低值——自动实现更好的弹性。
版本和掩码
QR码版本(1到40)设置矩阵大小:版本1为21×21模块,版本40为177×177模块。MinVersion和MaxVersion约束编码器的搜索;它选择范围内适合所选EccMode下负载的最小版本。默认值(1和40)跨越完整范围。1..40外的值被钳制,如果MinVersion最终大于MaxVersion,则重置为1。
MaskType选择应用于矩阵的八种掩码之一,以打破混淆扫描器的模式。vbQRCodegenMaskAuto(-1,默认)选择具有最佳惩罚分数的掩码;八个命名值vbQRCodegenMask0到vbQRCodegenMask7强制使用特定掩码——适用于可重现性。
模块渲染
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时,OLEDragOver和OLEDragDrop事件触发,应用程序可以决定如何处理——例如将Payload设置为放置的文本。vbOLEDropAutomatic在QRCode上不受支持,赋值它会导致运行时错误5(无效的过程调用或参数)。
数据绑定
设置DataSource和DataField将控件连接到Data控件记录集的字段。绑定是不对称的:
- 入站(记录集→控件):非空、非空白的字段值被解释为文本并赋值给Payload;QR码随后重新编码并重绘。Null和空值将Picture清除为Nothing。
- 出站(控件→记录集):当前QRPicture被序列化为字节数组并写回绑定字段——适用于存储渲染码的快照,但注意绑定输出的内容与输入不同。
属性
Anchors
决定控件的哪些边随父级对应边调整的边集合。只读——通过返回的Anchors对象设置各个.Left、.Top、.Right、.Bottom标志。
Appearance
边框的样式,作为AppearanceConstants的成员:vbAppearFlat或vbAppear3d(默认)。仅在BorderStyle为vbFixedSingleBorder时有意义。
BorderStyle
绘制在矩形周围的边框样式。ControlBorderStyleConstants的成员:vbNoBorder(0,默认)或vbFixedSingleBorder(1)。
Container
承载此QRCode的控件——通常是窗体、Frame、PictureBox或UserControl。用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(默认)、vbDockLeft、vbDockTop、vbDockRight、vbDockBottom或vbDockFill。停靠的控件忽略Anchors。
DragIcon
在控件被拖放时用作鼠标光标的StdPicture(参见Drag和DragMode)。
DragMode
控件是否应在用户按住鼠标时自行拖动(手动VB拖动形式,与OLE拖动不同)。DragModeConstants的成员:vbManual(0,默认——从代码调用Drag)或vbAutomatic(1)。
EccBoost
当True(默认)时,编码器被允许在负载仍适合相同QR版本时将实际奇偶校验级别提升到EccMode之上。Boolean。设为False以获得对不同长度负载可重现的输出。
EccMode
编码时使用的最低纠错级别。QRCodegenEccConstants(在VB包中定义)的成员:
| 常量 | 值 | 约恢复率 |
|---|---|---|
| vbQRCodegenEccLow | 0 | 7% |
| vbQRCodegenEccMedium | 1 | 15% |
| vbQRCodegenEccQuartile | 2 | 25% |
| vbQRCodegenEccHigh | 3 | 30% |
默认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在编码时超过MaxVersion,MinVersion被重置为1。
MinVersion
编码器允许选择的最小QR版本。Long,默认1。编码器选择MinVersion..MaxVersion范围内在请求的EccMode下适合负载的最小版本。钳制到1..40。
ModuleSize
生成Picture中一个QR模块的像素大小。Long,默认120。图片在绘制时按比例缩放到控件矩形,因此较大的ModuleSize仅在图片以其原生分辨率捕获或保存时有影响。
MouseIcon
当MousePointer为vbCustom且指针在控件上方时用作鼠标光标的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。
- Top、Width、Height
- 可选 对应属性的新值。省略的值保持不变。
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并选择允许的效果。当OLEDragMode为vbOLEDragAutomatic且用户开始拖动时也会自动引发。
语法:object_OLEStartDrag( Data As DataObject, AllowedEffects As Long )