【发布时间】:2014-09-09 14:29:41
【问题描述】:
我有一个带有大图片的图片框:
在此图片框中,使用ExtFloodFill() API 为各个区域着色
Private Declare Function ExtFloodFill Lib "GDI32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long, ByVal wFillType As Long) As Long
FloodFills 开始的 X 和 Y 坐标位于必须填充的区域中的某个位置,但不在精确的中心,或者所有区域的偏移量相同,并且这些区域的形状或形状也不相同尺寸。 (这就是我们喜欢 FloodFill 的原因)
我现在希望用户通过点击图片并使用与他们点击的区域相对应的特定操作的坐标来与图片进行交互。
为此,我使用_MouseDown() 事件:
Private Sub picfat_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim lngIndex As Long
lngIndex = CheckClick(mobjDet, x, y)
If lngIndex > -1 Then
With mobjDet(lngIndex)
.lngStat = 2 - .lngStat
SendCmd "det swico " & CStr(lngIndex) & "=" & CStr(.lngStat), wskDet
End With 'mobjDet(lngIndex)
End If
End Sub
调用CheckClick() 来确定点击的区域:
Private Function CheckClick(obj() As FC_DET, sngX As Single, sngY As Single) As Long
Dim lngObj As Long
Dim lngIndex As Long
Dim sngWidth As Single, sngHeight As Single
sngWidth = 15
sngHeight = 15
lngIndex = -1
For lngObj = 0 To UBound(obj)
With obj(lngObj)
If sngWidth > 0 Then
If sngX > .sngX Then
If sngX < .sngX + sngWidth Then
If sngY > .sngY Then
If sngY < .sngY + sngHeight Then
lngIndex = .lngIndex
Exit For
End If
End If
End If
End If
End If
End With 'obj(lngObj)
Next lngObj
CheckClick = lngIndex
End Function
此时我在原始 X 和 Y 坐标的右下角使用一个 15x15 像素的正方形,如果用户单击这些坐标,它就可以正常工作。
如果 FloodFill 的 X 和 Y 坐标位于小方块的左上角,则 15x15 方块适用于图片中较小的方块,但情况并非如此,您可以看到还有其他形状以及小方块。
我想做的是:
- 使用来自
_MouseDown()事件的 X 和 Y 坐标 - 从 FloodFill 开始循环遍历我的 X 和 Y 坐标列表
- 确定哪个 FloodFill 开始对应于 MouseDown 事件的 X 和 Y 坐标
[编辑]
例如:
- 我图片中黄色填充的中心是 500,160(在白色正方形和矩形之间的黄色中)。它的坐标是
mobjDet(6).sngX和mobjDet(6).sngY - 用户单击白色矩形上方黄色区域的某处,例如 495,53
- 如何将 _MouseDown() 事件的 X 和 Y 与 FloodFill udt 的索引 (6) 结合起来?
这样我就可以知道用户点击了图片中的哪个区域。
【问题讨论】:
标签: vb6 gdi flood-fill