Shape 类
Shape是无窗口轻量级控件,直接在其容器上绘制一组固定几何图元中的一种——矩形、正方形、椭圆、圆形、圆角矩形、圆角正方形、五角星或指向四个基本方向的箭头。它纯粹用于视觉呈现:背景、装饰图、面板分隔线、高亮以及任何使用重量级PictureBox显得过重的地方。
Shape没有交互元素——无焦点、无标题、无鼠标/键盘/拖动事件。形状类型及其外观完全通过属性选择;控件唯一引发的事件是Initialize。默认属性是Shape,默认事件是Initialize。
Private Sub Form_Load()
shpPanel.Shape = vbShapeRoundedRectangle
shpPanel.BorderColor = vbBlack
shpPanel.BorderWidth = 2
shpPanel.FillStyle = vbFSSolid
shpPanel.FillColor = RGB(240, 240, 240)
shpPanel.BackStyle = vbBFOpaque
End Sub无窗口渲染
Shape没有hWnd。框架在父级的绘制周期中将其绘制到父级的绘图表面上,因此控件开销很小——不会为其创建Win32窗口,除了一小块状态外没有每实例开销。其权衡与任何无窗口控件相同:
- 无焦点、无键盘输入、无
KeyDown/KeyPress/KeyUp/GotFocus/LostFocus/Validate。 - 无任何鼠标事件——要使区域可点击,在其上方放置透明的Label。
- 没有可传递给API函数的
hWnd,也没有SetFocus。 - 不能承载子控件。
对于需要这些功能的场景,请改用PictureBox或自定义UserControl。
形状类型
Shape选择绘制哪种图元,作为ShapeConstants的成员:
| 常量 | 值 | 绘制为 |
|---|---|---|
| vbShapeRectangle | 0 | 填充控件边界的矩形。 |
| vbShapeSquare | 1 | 内接于边界的正方形——较短边决定尺寸,较长边居中。 |
| vbShapeOval | 2 | 填充边界的椭圆。 |
| vbShapeCircle | 3 | 内接于边界的圆——较短边决定直径。 |
| vbShapeRoundedRectangle | 4 | 圆角矩形;圆角半径来自RoundedCornerSize。 |
| vbShapeRoundedSquare | 5 | 内接于边界的圆角正方形。 |
| vbShapeStar | 6 | 正星形多边形;通过VariationA、VariationB和VariationC配置。 |
| vbShapeArrowLeft | 7 | 向左的箭头。 |
| vbShapeArrowRight | 8 | 向右的箭头。 |
| vbShapeArrowUp | 9 | 向上的箭头。 |
| vbShapeArrowDown | 10 | 向下的箭头。 |
对于vbShapeCircle、vbShapeSquare和vbShapeRoundedSquare,绘制的图元是正方形的:使用控件宽度和高度中的较短者,图元沿较长轴居中。控件的边界矩形不变。
星形和箭头
星形和箭头通过三个Variation属性参数化,均为Long,默认值为哨兵值-1,选择内置默认几何:
对于vbShapeStar:
- VariationA — 点数,钳制到包含范围
2--30。默认5。 - VariationB — 内半径因子,控制星形臂的"粗细"。值越大臂越细。默认选择使内半径为外半径一半的值。
- VariationC — 顶点展开除数,
1到12的整数。值越低产生越密集的点;值越高产生越常规的星形。默认12(有效除数为2)。
对于vbShapeArrowLeft、vbShapeArrowRight、vbShapeArrowUp、vbShapeArrowDown:
- VariationA — 箭头沿横轴方向的"高度",作为控件横轴尺寸的百分比(
0--100)。默认30(即0.30)。 - VariationB — 箭头沿纵轴方向的"深度",作为控件纵轴尺寸的百分比(
0--100)。默认50(即0.50)。
VariationC在箭头中未使用。
背景、填充和渐变
Shape按三个逻辑层绘制:
- 控件的背景,由BackStyle和BackColor控制。当BackStyle为vbBFTransparent(默认)时,绘制形状之外但在控件边界矩形之内的像素显示父级在下面绘制的内容。当vbBFOpaque时,这些像素用BackColor填充。
- 形状的内部,由FillStyle、FillColor和(渐变的)FillColorAlt控制。
- 形状的轮廓,由BorderStyle、BorderColor和BorderWidth控制。
FillStyle是FillStyleConstantsEx的成员:
| 常量 | 值 | 内部 |
|---|---|---|
| vbFSSolid | 0 | 用FillColor填充。 |
| vbFSTransparent | 1 | 无填充(默认——形状内部透出)。 |
| vbHorizontalLine | 2 | FillColor的水平阴影线。 |
| vbVerticalLine | 3 | FillColor的垂直阴影线。 |
| vbUpwardDiagonal | 4 | /方向对角阴影线。 |
| vbDownwardDiagonal | 5 | \方向对角阴影线。 |
| vbCross | 6 | 正交交叉阴影线。 |
| vbDiagonalCross | 7 | 对角交叉阴影线。 |
| vbGradientNS | 8 | 从FillColor(顶部)到FillColorAlt(底部)的垂直渐变。 |
| vbGradientWE | 9 | 从FillColor(左侧)到FillColorAlt(右侧)的水平渐变。 |
渐变样式(vbGradientNS、vbGradientWE)使用Win32 GradientFill GDI原语,该原语不支持为旋转应用的世界变换:当Angle非零时,渐变样式回退为FillColor的纯色填充。阴影线和渐变样式使用匹配形状类型的GDI区域裁剪到形状轮廓。
边框
轮廓使用Win32 GDI画笔绘制:
- BorderColor — 画笔颜色(默认为系统窗口文本颜色)。
- BorderWidth — 画笔宽度(像素,默认
1)。 - BorderStyle — 画笔图案,作为BorderStyleConstants的成员:vbTransparent(0——无轮廓)、vbBSSolid(1,默认)、vbBSDash(2)、vbBSDot(3)、vbBSDashDot(4)、vbBSDashDotDot(5)或vbBSInsideSolid(6)。
与Line一样,当BorderWidth大于1时,GDI强制使用实线画笔——虚线和点线图案仅在宽度1时有效。
旋转
Angle围绕控件左上角以度为单位逆时针旋转渲染形状。0(默认)为自然方向;90为逆时针旋转四分之一圈;0到360之间的值给出任意旋转。控件在父级上的边界矩形不变——因此大旋转角度可能将可见形状推出矩形。渲染的像素仅受父级裁剪区域约束,不受Shape自身矩形约束。
渐变填充样式不支持旋转——参见背景、填充和渐变。
绘制模式
DrawMode选择将绘制像素与目标组合的光栅操作。DrawModeConstants的成员:vbCopyPen(默认——不透明绘制)或XOR/AND/NOT/合并变体之一。非默认模式主要用于在现有背景上绘制的"橡皮筋"反馈——同一XOR应用两次可相互抵消,恢复原始像素。
属性
Anchors
决定控件的哪些边随父级对应边调整的边集合。只读——通过返回的Anchors对象设置各个.Left、.Top、.Right、.Bottom标志。
Angle
渲染形状的旋转角度,以度为单位,围绕控件左上角逆时针旋转。Double,默认0。详见旋转及渐变填充注意事项。
BackColor
当BackStyle为vbBFOpaque时绘制到Shape边界矩形(形状自身轮廓之外)的颜色。OLE_COLOR,默认为系统窗口背景颜色。当BackStyle为vbBFTransparent时无效。
BackStyle
形状周围的边界矩形是否用BackColor填充或保持透明。BackFillStyleConstants的成员:vbBFTransparent(0,默认)或vbBFOpaque(1)。
BorderColor
形状轮廓的颜色,作为OLE_COLOR。默认为系统窗口文本颜色。
BorderStyle
用于轮廓的画笔图案。BorderStyleConstants的成员:vbTransparent(0)、vbBSSolid(1,默认)、vbBSDash(2)、vbBSDot(3)、vbBSDashDot(4)、vbBSDashDotDot(5)或vbBSInsideSolid(6)。当BorderWidth大于1时Win32强制为vbBSSolid。
BorderWidth
轮廓画笔宽度,以像素为单位。Long,默认1。大于1的宽度忽略BorderStyle并始终绘制实线。
Container
承载此Shape的控件——通常是窗体、Frame或UserControl。用Get读取,用Set更改。
ControlType
标识此控件的只读ControlTypeConstants值。始终为vbShape。此常量与Line控件共享——两者都是无窗口几何图元。
Dock
Shape在其容器中的停靠位置。DockModeConstants的成员:vbDockNone(默认)、vbDockLeft、vbDockTop、vbDockRight、vbDockBottom或vbDockFill。停靠的形状忽略Anchors。
DrawMode
形状绘制在将像素与目标组合时应用的光栅操作。DrawModeConstants的成员:vbCopyPen(默认)为普通不透明绘制;其他值产生XOR、AND、NOT和其他像素混合效果。
FillColor
用于填充形状内部的主要颜色。OLE_COLOR,默认为系统滚动条颜色。用于纯色和阴影线填充的唯一颜色,以及渐变填充的起始颜色。当FillStyle为vbFSTransparent时无效。
FillColorAlt
用作渐变填充终点的次要颜色。OLE_COLOR,默认为vbWhite。仅在FillStyle为vbGradientNS或vbGradientWE时使用。
FillStyle
用于填充形状内部的图案,作为FillStyleConstantsEx的成员。默认vbFSTransparent(1)——内部不绘制,透出底层父级像素。完整表格及渐变与旋转组合的注意事项见背景、填充和渐变。
Height
控件的高度,默认以缇为单位(或以容器的ScaleMode单位)。Double。
Index
当Shape是控件数组的一部分时,此实例在数组中的Long零基索引。在非数组实例上读取Index会引发运行时错误343(对象不是数组)。运行时只读。
Left
从容器左边缘到控件左边缘的水平距离。Double。
Name
Shape在其父窗体上的唯一设计时名称。运行时只读。
Parent
对最终包含Shape的Form(或UserControl)的引用。只读。
RoundedCornerSize
当Shape为vbShapeRoundedRectangle或vbShapeRoundedSquare时绘制的圆角弧半径,以容器的ScaleMode单位。Long,默认20。对其他形状类型忽略。
Shape
控件绘制的几何图元。默认属性。
语法:object.Shape [ = value ]
- value
- ShapeConstants的成员。完整表格见形状类型。
通过默认属性路径访问时(如Shape1 = vbShapeOval),值作为匹配底层枚举的Long读写。
TabIndex
INFO
继承自无窗口控件基类但无效果:Shape不接受焦点,无论此值如何都会被TAB键导航跳过。
TabStop
INFO
继承自无窗口控件基类但无效果:Shape不接受焦点,无法通过TAB键到达。
Tag
应用程序可用于将自定义数据与Shape关联的自由格式String。框架忽略此属性。
Top
从容器顶部到控件顶部的垂直距离。Double。
VariationA
星形和箭头形状类型的第一几何参数。Long,默认-1(选择当前形状的内置默认值)。每种形状的含义见星形和箭头。
VariationB
星形和箭头形状类型的第二几何参数。Long,默认-1。见星形和箭头。
VariationC
第三几何参数,仅vbShapeStar使用。Long,默认-1。见星形和箭头。
Visible
Shape是否绘制。Boolean,默认True。
Width
控件的宽度,默认以缇为单位(或以容器的ScaleMode单位)。Double。
方法
Move
在单次调用中重新定位并可选地调整Shape的尺寸。
语法:object.Move Left [, Top [, Width [, Height ] ] ]
- Left
- 必需 给出新水平位置的Single。
- Top、Width、Height
- 可选 对应属性的新值。省略的值保持不变。
Refresh
强制立即重绘Shape在父级绘图表面上的边界矩形。
语法:object.Refresh
ZOrder
将Shape带到容器内无窗口同级堆栈的前面或后面。
语法:object.ZOrder [ Position ]
- Position
- 可选 ZOrderConstants的成员:vbBringToFront(0,默认)或vbSendToBack(1)。
事件
Initialize
在Shape已连接到其容器的绘制周期但首次绘制之前引发一次。适用于依赖容器状态的最后一刻设置。默认事件。
语法:object_Initialize( )