我想在程序主窗体中实现“水波特效”,我已经从网上找到了封装好的DLL可是使用。
可是,如果实现水波特效的背景图片尺寸稍大时,DLL的初始化将需要一段时间。(在我的调试工程里大概需要10秒)。
于是,我希望建立一个启动窗体,当DLL初始化时,在前台做一些类似滚动条的动画,不至于让用于觉得程序停止响应了。
该DLL初始化具体是这样的:Dim Pic As StdPicture
Set Pic = LoadPicture(App.Path & "\BackMain.jpg")
WaterInit Pic.handle
Set Pic = Nothing当执行到WaterInit Pic.handle这一句时,原来启动窗体类似滚动条的动画同样会出现“假死”。可能我的表述有点复杂,大家运行一下我的调试工程就能看到效果了。调试工程下载地址:http://dl.vmall.com/c0fom2kkbk所以,我希望在执行WaterInit Pic.handle时,启动窗体可以正常显示动画。我曾经尝试过多线程,可是可能由于小弟我水平有限,都失败了还望各位大神不吝赐教!

解决方案 »

  1.   

    ...
    Me.Show
    DoEvents
    虽然不能避免假死,但是可以把界面给刷出来。事实上,如果你找一个很破很破的计算机(PII 266或者以下),启动VB6.0,VB6.0自己都会假死。
      

  2.   

    关键在于这个WaterInit, 也不知道你处理了什么, 处理时间太长, 然后就造成界面假死.你可以尝试将这个过程分拆开成多个小的过程, 然后用一个进度条来显示, 就不会造成假死的现象了.
      

  3.   


    关键是WaterInit是调用别人封装的DLL,我不知道他内部怎么实现的,如果我知道WaterInit的内部实现就不存在类似假死的问题了。
      

  4.   


    关键是WaterInit是调用别人封装的DLL,我不知道他内部怎么实现的,如果我知道WaterInit的内部实现就不存在类似假死的问题了。那唯一的办法就是你代码实现一个一样功能的替代掉这个函数了
      

  5.   

    试试用ActiveX EXE:
    新建一个ActiveX EXE工程,里边放置一个启动窗口.
    然后再在你的主程序中调用那个函数之前调用ActiveX EXE显示启动窗口.
    然后调用那个函数.
    函数返回后,调用ActiveX EXE退出启动窗口.
      

  6.   


    这个我倒没试过。
    但是如果我添加一个ActiveX EXE工程,在该工程里无法引用原工程呀,也就是说,我无法调用原工程的任一窗口过程,那我怎么显示原来的主窗体啊……
      

  7.   

    可以用 ActiveX EXE 创建一个类。
    比如Class1,里边定义两个方法:
    show/hide
    具体实现就是在show里显示窗口,hide里边关闭窗口。
    修改工程描述(比如改成Project2),然后编译成Exe文件。
    打开你现在的工程,引用Project2,然后在适当的位置执行以下语句:
    dim cls as new class1
    call cls.show
    ' ...
    call cls.hide
      

  8.   

    还有一种方法是在ActiveX Exe中使用Timer和事件,这样可以直接显示主工程中的窗体,不过这种方式我没试过,不知道是否仍然会假死。
    我只试过上边一种方法:
    Project2 (ActiveX EXE)
      +-启动窗体
      +-Class1MainProject:
    引用Project2
    调用Class1的Show过程。
    执行WaterInit Pic.handle
    调用Class1的Hide过程。
      

  9.   

    弄了半天也没弄好,算了,看来以我的水平实现VB多线程还不够,继续努力罢。不过我还是把测试代码发上来吧:http://dl.vmall.com/c0hyqvn39l
    注意,我希望Debug.Print "click"在Debug.Print "done"之前执行!