VB的image控件的问题
用一个image和7个command控件控制7个不同的图片在iamge中显示,就是连续点同一个command,它就控制它所控制的那个图片在image显示或消失,如果点不同...
用一个image和7个command控件控制7个不同的图片在iamge中显示,就是连续点同一个command,它就控制它所控制的那个图片在image显示或消失,如果点不同的按钮,每点一个按钮,就消失前一个按钮所显示的图片,显示该按钮所控制的图片.也就是说每个按钮第一次点时显示它所控制的图片,第二次点时消失该图片.
要求通过控制image.picture的属性来现实这个效果,如果是用Image4.Visible来实现的话我会.
满意回答50分以上!谢谢各位! 展开
要求通过控制image.picture的属性来现实这个效果,如果是用Image4.Visible来实现的话我会.
满意回答50分以上!谢谢各位! 展开
2个回答
展开全部
这个问题我遇过类似的,不过现在没有VB可以试验,自己也还没搞得很明白,所以提供一点思路:
用picture属性来实现这个效果,需要解决“控制图片有、无”和“知道图片有、无”共四个方面的问题。
控制图片的“有”最简单了,就是Loadpictuer函数。Loadpictuer返回的是一个图片句柄,也可以说是个IPictureDisp对象(这就是我还没搞明白的地方)。
所以,可以猜想Picture属性是个long类型数据或是一个对象引用。所以,可以通过判断picture属性是否等于0或是否等于nothing来知道是否有图片,也可以用赋值为0或nothing来清除图片。这是我猜想的,但实际用“等于0或nothing”来判断是否有图似乎不稳定,有时可以,有时不可以(这也是我没搞明白的地方,不过对于image这个控件就没试过)。
另外,用image.picture=0 或 set image.picture = nothing 来清除图片,可能还有一个刷新问题。如果image控件有autoRedraw属性,设为true试试能否避免这个问题。
还有,Loadpictuer返回一个long类型数值,这个数值可以指代一张图片,你可以先定义7个变量,如a(0)、a(1)、a(2)……,先把7张图片Loadpictuer给这7个变量,以后就不用频繁的从硬盘读取数据了。因此也可以设想令“图片消失”的另一个方法,就是用第八张图,赋值给第8个变量,通过交换图片实现图片消失的效果。
说了那么多,归纳一下代码。按第一个思路,代码大概是:
---------------------------------------------------------
通用部分声明一个数组存放7张图片:
dim a(0 to 6) as long
窗口的load事件中,载入图片,把图片句柄保存起来:
a(0)=loadpicture(“图片1”)
a(1)=loadpicture(“图片2”)
……
按钮做成控件数组(相信楼主会用控件数组吧?注意控件下标和数组一一对应即可):
private sub command1_click(index as integer)
image4.picture = iif(image4.picture = 0,a(index),0)
'这里用到iif函数,这句话的意思就是,如果picture属性等于0就载入对应的图片a(index),否则令其等于0。
end sub
----------------------------------------------------------------------
这就OK了!
如果“等于0”不能令其清除图片,那就用第二个思路,增加第八张图片
a(7)=loadpicture(“表示没有图片的图片”)
然后,那句image4.picture = iif(image4.picture = 0,a(index),0)
改为
image4.picture = iif(image4.picture = a(7),a(index),a(7))
估计第二个方案是绝对可行的!
*****************************************************************
经试验,两种方案都完全可行,不过long类型的猜测是错误的,应该是对象类型(这个问题还是没明白)。以下是单幅图片测试的完整代码。一个窗口,一个image控件和两个按钮,贴上代码就能运行了
'通用部分声明两个图片对象:
Dim a As IPictureDisp
Dim b As IPictureDisp
'点击按钮切换两个图片:
Private Sub Command1_Click()
Set Me.Image1.Picture = IIf(Me.Image1.Picture Is a, b, a)
End Sub
'点击这个按钮清除图片
Private Sub Command2_Click()
Set Image1.Picture = Nothing
End Sub
'窗口load时载入两幅图片
Private Sub Form_Load()
Set a = LoadPicture("1.jpg")
Set b = LoadPicture("2.jpg")
End Sub
用picture属性来实现这个效果,需要解决“控制图片有、无”和“知道图片有、无”共四个方面的问题。
控制图片的“有”最简单了,就是Loadpictuer函数。Loadpictuer返回的是一个图片句柄,也可以说是个IPictureDisp对象(这就是我还没搞明白的地方)。
所以,可以猜想Picture属性是个long类型数据或是一个对象引用。所以,可以通过判断picture属性是否等于0或是否等于nothing来知道是否有图片,也可以用赋值为0或nothing来清除图片。这是我猜想的,但实际用“等于0或nothing”来判断是否有图似乎不稳定,有时可以,有时不可以(这也是我没搞明白的地方,不过对于image这个控件就没试过)。
另外,用image.picture=0 或 set image.picture = nothing 来清除图片,可能还有一个刷新问题。如果image控件有autoRedraw属性,设为true试试能否避免这个问题。
还有,Loadpictuer返回一个long类型数值,这个数值可以指代一张图片,你可以先定义7个变量,如a(0)、a(1)、a(2)……,先把7张图片Loadpictuer给这7个变量,以后就不用频繁的从硬盘读取数据了。因此也可以设想令“图片消失”的另一个方法,就是用第八张图,赋值给第8个变量,通过交换图片实现图片消失的效果。
说了那么多,归纳一下代码。按第一个思路,代码大概是:
---------------------------------------------------------
通用部分声明一个数组存放7张图片:
dim a(0 to 6) as long
窗口的load事件中,载入图片,把图片句柄保存起来:
a(0)=loadpicture(“图片1”)
a(1)=loadpicture(“图片2”)
……
按钮做成控件数组(相信楼主会用控件数组吧?注意控件下标和数组一一对应即可):
private sub command1_click(index as integer)
image4.picture = iif(image4.picture = 0,a(index),0)
'这里用到iif函数,这句话的意思就是,如果picture属性等于0就载入对应的图片a(index),否则令其等于0。
end sub
----------------------------------------------------------------------
这就OK了!
如果“等于0”不能令其清除图片,那就用第二个思路,增加第八张图片
a(7)=loadpicture(“表示没有图片的图片”)
然后,那句image4.picture = iif(image4.picture = 0,a(index),0)
改为
image4.picture = iif(image4.picture = a(7),a(index),a(7))
估计第二个方案是绝对可行的!
*****************************************************************
经试验,两种方案都完全可行,不过long类型的猜测是错误的,应该是对象类型(这个问题还是没明白)。以下是单幅图片测试的完整代码。一个窗口,一个image控件和两个按钮,贴上代码就能运行了
'通用部分声明两个图片对象:
Dim a As IPictureDisp
Dim b As IPictureDisp
'点击按钮切换两个图片:
Private Sub Command1_Click()
Set Me.Image1.Picture = IIf(Me.Image1.Picture Is a, b, a)
End Sub
'点击这个按钮清除图片
Private Sub Command2_Click()
Set Image1.Picture = Nothing
End Sub
'窗口load时载入两幅图片
Private Sub Form_Load()
Set a = LoadPicture("1.jpg")
Set b = LoadPicture("2.jpg")
End Sub
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询