VB的image控件的问题

这个问题我遇过类似的,不过现在没有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
按住SHIFT就可以拉