递归可以用迭代来等价代替。
网站建设公司,为您提供网站建设,网站制作,网页设计及定制网站建设服务,专注于企业网站制作,高端网页制作,对成都餐厅设计等多个行业拥有丰富的网站建设经验的网站建设公司。专业网站设计,网站优化推广哪家好,专业网站推广优化,H5建站,响应式网站。
Option Explicit
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Const QueueVolume = 1000000
Private QueueX(QueueVolume) As Long
Private QueueY(QueueVolume) As Long
Private SrcColor As Long, DestColor As Long
Private QStart As Long, QEnd As Long
Private Function EnQueue(ByVal X As Long, ByVal Y As Long) As Boolean
If (QEnd + 1) Mod QueueVolume QStart Then
QueueX(QEnd) = X
QueueY(QEnd) = Y
QEnd = QEnd + 1
EnQueue = True
Else
EnQueue = False
End If
End Function
Private Function DeQueue(ByRef X As Long, ByRef Y As Long) As Boolean
If QStart QEnd Then
X = QueueX(QStart)
Y = QueueY(QStart)
QStart = QStart + 1
DeQueue = True
Else
DeQueue = False
End If
End Function
Private Sub Qytc()
Dim X As Long, Y As Long
Dim cr As Long
Do While DeQueue(X, Y)
cr = GetPixel(Picture1.hdc, X, Y)
If cr = SrcColor Then
Picture1.PSet (X, Y), DestColor
EnQueue X, Y - 1
EnQueue X, Y + 1
EnQueue X - 1, Y
EnQueue X + 1, Y
End If
DoEvents
Loop
End Sub
Private Sub Command1_Click()
EnQueue 5, 6
Qytc
End Sub
Private Sub Form_Load()
QStart = 0 '队列左端
QEnd = 0 '队列右端
SrcColor = RGB(255, 0, 0)
DestColor = RGB(0, 0, 255)
End Sub
说明:放一个PictureBox1,ScaleMode设为3-pixel,BackColor改成红色。
放一个按扭Command1。
如果队列长度不够,把Private Const QueueVolume = 1000000 再改大点。
只适用于VB6。
(用VB.net就不用这么麻烦了)
题主用的是 VB6 时代的 Windows API,那里面的 Long 类型相当于 .NET 里的 Int32,声明 API 时要把所有 Long 类型替换成 Int32 才可以正常使用,否则堆栈溢出。
另外操作内存这种函数需要管理员权限来运行,否则程序会报错甚至崩溃。
溢出就是说你设置的变量不合适,数据大于你设置的变量范围了.
比如你设置的是int,,,,而数据超过了256,就会
溢出
题主这个FunctionFindWindow(一堆参数)AsLong,返回值是个Long,而下面wd=FindWindow(),wd却是个Integer类型的,当然会溢出。楼上说都改成Long确实可以,不过题主的API声明是从VB里拷贝过来的吧?VB里的Long到.NET中就是Int32了,所以应该把上面FindWindow的返回类型由Long改为Int32(或者Integer)才是正解。