我想做一个多格式图片处理控件,外形与picturebox一模一样,差别是picture属性可以输入任何图片格式。
使用时用户可输入任意文件,控件得到文件后进行分类识别,是是jpg、gif、bmp等常规图片就直接显示,不是jpg、gif、bmp等常规图片,则进入另一个处理程序。
问题是这样的:1.自定义控件中用了老鸟提供的代码Public Property Get Picture() As DataObject
    Set Picture = Picture1.Picture
End PropertyPublic Property Set Picture(ByVal RHS As DataObject)
    Set Picture1.Picture = RHS
End Property
可以实现与picturebox接近的效果。但赋值时必须使用set pic.picture=loadpicture("...")的方法,不能像picturebox那样直接pic.picture=loadpicture("...")。这个有没有办法解决?2.当输入非jpg、gif、bmp图片时报错,文件根本不能加载让控件处理。这个问题如何解决呢?是不是我的解决思路不正确呢?

解决方案 »

  1.   

    可以实现与picturebox接近的效果。但赋值时必须使用set pic.picture=loadpicture("...")的方法,不能像picturebox那样直接pic.picture=loadpicture("...")。这个有没有办法解决? 你说的这两个有什么区别么?至少从你给的代码看没什么区别阿你可以先判断文件的扩展名,如果不在你的常规文件里面。那么就进入另一个过程
      

  2.   

    Public Property Let Picture(ByVal RHS As DataObject) 
        Set Picture1.Picture = RHS 
    End Property 
      

  3.   

    关键就是思路问题,代码上加 on error goto a0,加入异常时跳出即可
      

  4.   

    2.当输入非jpg、gif、bmp图片时报错,文件根本不能加载让控件处理。这个问题如何解决呢? 看需求了,难的方法是分析图片的格式简单的方法是on error goto ...进入错误处理...
      

  5.   

    我想大家都没太听明白我的意思,我再说明一下。我做这个控件外观上与picturebox控件是一样的,也可以当picturebox控件使用。不同的是加载图片时必须用set语句,假如这个控件名称叫picc,加载图片就用
    set picc1.picture=loadpicture("c:\1.jpg")
    即可,这与picturebox不同,picturebox的加载语句是
    picture1.picture=loadpicture("c:\1.jpg")
    问题是能做得一样吗?第二个问题更有点意思了,加入异常时跳出并不能解决问题。异常时跳出加在什么地方?我的理解是应该加在控件里,而不是控件外,如果一个控件在使用时必须要求别人加异常时跳出,那是不行的。更何况在控件外也跳不到控件里面的代码去运行。如果加在控件代码中,非常规图片用set picc1.picture的方法根本加不上。
    控件中的异常跳出指令本身根本就不会被执行。再说明白一点,我想让这个控件可以加载非常规图片,但用picture属性不能完成这个要求,错误会产生在控件代码的外部,这不是异常时跳出就可以解决的。期待高手指点迷津
      

  6.   


    格式分析的问题还不急着解决。现在的问题是如何利用picture属性来传递非图片文件给控件,这才是问题的关键点,只要控件能接收到用户传来的文件,其它问题就比较好办了。
      

  7.   


    这个还是比较简单的,你先读取二进制文件进来就是了...Open src For Binary As #1类似于这样的方法你说的非要set的那个,只要你换成了let属性就是了...<script language='vbs'>
    class test
      dim dic
      public property let A(value)
          set dic=value
      end property  public property get A
        set A=dic
      end property
    end classset dic1=createobject("scripting.dictionary")
    set t=new test
    t.A=dic1
    t.A.add "xxx",123
    </script>
      

  8.   

    整个设计就是错误。
    既然你的控件属性是 Picture,那么说明你的控件需要的就是一个已载入的图片,既然载入过程在控件外进行,控件内怎么可能实现图片识别。既然要识别,载入需要你自己来来控制,因此应该是一个文件名属性 PictureFileName 而不是图片对象。
      

  9.   


    你研究一下我的代码就是了....另外,我比较赞同10楼的说法,你的需求跟picturebox不同,你这样的设计是强耦合...根本没考虑为什么微软要那么设计....你实际的要求是要重写一个类似于loadpicture功能的函数....
      

  10.   


    老兄这句可能是有问题的
      public property let A(value) 
          set dic=value 
      end property 外面是let A的值,里面是将value set给dic对象,好像运行不了。
     
      

  11.   


    <script language='vbs'>
    class test
      dim dic
      public property let A(value)
          set dic=value
      end property  public property get A
        set A=dic
      end property
    end classset dic1=createobject("scripting.dictionary")
    set t=new test
    t.A=dic1
    t.A.add "xxx",123
    msgbox t.A.count
    </script>你不会测试一下啊.....哎,无语了....
      

  12.   

    Private Sub Command1_Click()
    Set dic1 = CreateObject("scripting.dictionary")
    Set t = New Test
    t.A = dic1
    t.A.Add "xxx", 123
    MsgBox t.A.Item("xxx")End Sub把一下代码放到一个classmodule里
      Dim dic
      Public Property Let A(value)
          Set dic = value
      End Property  Public Property Get A()
        Set A = dic
      End Property你看一下效果,正宗的vb6代码....
      

  13.   

    你把 option explicit去掉了,那个是强制声明的
      

  14.   

    这个是语法基础....强制要求显式声明脚本中的所有变量。Option Explicit 这句可以不要.....
      

  15.   

    去掉Option Explicit 确实可以运行了。但不是我要的自定义控件输入图片文件的问题,可能你没有看明白我的问题。
    不过还是谢谢你的耐心解答。
      

  16.   


    我知道你的大方向问的是那个 不过你也说了但赋值时必须使用set pic.picture=loadpicture("...")的方法,不能像picturebox那样直接pic.picture=loadpicture("...")。我解答的也是这个....然后你说我的代码错了,那我肯定不能同意的... 这是你的原话问题,我解答的也是我想这个细节我没理解错吧,不过这个都不扯了,只是希望你以后谦虚一点儿,别浪费大家的时间问问题想清楚了问,vb的语法,先好好看看,别急忙说别人的就是错的
      

  17.   


    哦,原来是这样啊。
    如果你能实现自定义图片控件的picture属性不用加set的问题,我马上给你100分。决不食言。
      

  18.   


    你试过了吗?我试过,不能达到那种效果。而且报错,类型不匹配。
    不能不加set给对象赋值。
      

  19.   

    Private Sub Command1_Click()
    Set t = New Test
    t.A = LoadPicture("D:\picture\20090909\20081002.jpg")
    End SubDim dic
    Public Property Let A(ByVal value)
          Set dic = value
      End Property  Public Property Get A()
          Set A = dic
      End Property搞定了....你试试
      

  20.   


    根本不行,请看图
    建议你新自做一个实际的自定义控件,里面只有picturebox一个内容,编程的时候别人调入你做的自定义控件,就像使用picturebox一样能用picture=load("c:\1.jpg")的方式给你的自定义控件内的picture属性赋值就行了。白猫黄猫抓到老鼠就是好猫,你只要能做出来,别人才能相信你是对的,否则说其它的没用。