刚才结贴过快,请再过来说一下好吗?
原贴:
http://community.csdn.net/Expert/topic/4318/4318320.xml?temp=.5628473
主  题:  怎样将EXE文件变小? 
hoho,我现在做的项目有600多个界面了,根据业务分类封装成五十多个ocx并由主程序动态调入,公用过程封装成DLL供各个ocx调用。这样做的好处是开发的时候没有必要把所有工程全部打开,只需要打开主框架和相关的ocx工程,程序运行时因为不需要把所有的东西加载到内存所以省内存启动也比较快。坏处嘛,编译的时候比较累,而且兼容性一旦弄错挺麻烦,所以我们专门写了一个程序来进行产品的编译工作
编译后主框架程序1.6兆,ocx和dll总共40多兆。
-------------------------------------------------
疑问: 你一般把哪些东东封装成ocx(我只做了Button,TextBox等的封装)?    整个Form也可以吗?如果可以,还有那种MDI子窗体的效果吗?   DLL中我只做了一些公用过程,加密信息等。

解决方案 »

  1.   

    我不是chewinggum(口香糖·把减肥列入下一个五年计划)
      

  2.   

    我是chewinggum(口香糖·把减肥列入下一个五年计划)
      

  3.   

    整个form封装成为ocx。我们并不需要mdiform的形式。怎么说呢?就好像资源管理器吧,左边是功能树,由每个操作员的权限动态生成,上面是工具条,右边是功能区,其实就是一个picturebox作为容器。每个ocx加载以后就自动将功能区填充满(当然每个ocx根据外功能区的大小界面上所有元素也相应等比例变化)每次打开一个新的模块就把前一个模块卸载。因为我们的客户每次操作可能依次打开好几个功能,所以如果用mdi操作人员还必须关闭一大堆窗口,他们也不愿意。还有就是我们的这个程序一般一开就是一整个工作日,如果大量子窗体不关闭也可能占用不少内存。
      

  4.   

    MDI这种东西已经过时了吧,使用并不方便;以前Office用,现在都不用了
      

  5.   

    其实就是一个picturebox作为容器。每个ocx加载以后就自动将功能区填充满(当然每个ocx根据外功能区的大小界面上所有元素也相应等比例变化)每次打开一个新的模块就把前一个模块卸载
    ----------------------
    这一块有没有一个粗略的代码?参考一下。
      

  6.   

    那么我们就一步一步来首先,先打开VB新建一个标准EXE工程。form1上放置一个picturebox和两个command button。再打开菜单-文件-添加工程,添加一个新的ocx工程,这时候新的工程默认命名为"工程2",并且已经有一个"UserControl1"的用户控件,然后我们在工程2中添加一个新的用户控件,VB会自动命名为"UserControl2"。我们将用这两个用户控件演示加载和卸载。为了区分这两个用户控件,在两个用户控件上面摆放一些基础控件画画线写写字什么的。现在将焦点移到工程1,在工程1中打开"部件"对话框列表中可以找到“工程2”,钩选起来。然后再到工程1的工程属性对话框中,在“生成”标签把“删除有关未使用的ActiveX控件的信息”前面的钩去掉。因为我们在工程1中并没有建立用户控件的人和实例而是在代码中创建,如果不把这个钩去掉,那么在编译或者调试执行前,我们刚才引用的工程2的信息将被忽略掉,导致无法建立实例。现在我们在form1的代码区写下面的代码
    Private Sub Command1_Click()
        Call ClearUC
        addUC "工程2.UserControl1"  '这里模仿功能菜单点击后的操作,
                                    '具体控件的名称可以保存在和权限相关的数据库表中
                                    '根据不同的权限显示不同的功能菜单并将不同的界面控件加载到主窗体中
    End Sub
    Private Sub Command2_Click()
        Call ClearUC
        addUC "工程2.UserControl2"
    End Sub
    '清除已经存在的用户控件
    Private Sub ClearUC()
        On Error GoTo errhandle
        Dim objCtl As Object
        Set objCtl = Form1.Controls("TestCtl")
        Form1.Controls.Remove ("TestCtl")
    errhandle:
    End Sub
    '根据控件名加载控件到容器中
    Private Sub addUC(ctl As String)
        Dim objTest As Object
        Set objTest = Form1.Controls.Add(ctl, "TestCtl", Picture1)
        objTest.Visible = True
        '根据容器大小用控件充满容器
        objTest.Width = Picture1.Width
        objTest.Height = Picture1.Height
    End Sub
      

  7.   

    在用户控件代码区粘铁下面的代码,控件中的元素就能够等比例伸缩,这个特别适合于应用在客户的显示器分辨率不确定的情况下要求应用程序全屏显示。把代码中的usercontrol 该成form或者me就能应用于普通窗体。
    Option Explicit
    Private ObjOldWidth As Long  '保存控件的原始宽度
    Private ObjOldHeight As Long '保存控件的原始高度
    Private ObjOldFont As Single '保存控件的原始字体比Private Sub UserControl_Initialize()
      Dim Obj As Control
      
      ObjOldWidth = UserControl.ScaleWidth
      ObjOldHeight = UserControl.ScaleHeight
      ObjOldFont = UserControl.Font.Size / ObjOldHeight
      On Error Resume Next
      For Each Obj In UserControl
        Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "
      Next ObjEnd SubPrivate Sub UserControl_Resize()
      Dim Pos(4) As Double
      Dim i As Long, TempPos As Long, StartPos As Long
      Dim Obj As Control
      Dim ScaleX As Double, ScaleY As Double
      
      ScaleX = UserControl.ScaleWidth / ObjOldWidth
      '保存窗体宽度缩放比例
      ScaleY = UserControl.ScaleHeight / ObjOldHeight
      '保存窗体高度缩放比例
      On Error Resume Next
      
      For Each Obj In UserControl
        StartPos = 1
        For i = 0 To 4
          '读取控件的原始位置与大小
          TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)
          If TempPos > 0 Then
            Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos)
            StartPos = TempPos + 1
          Else
            Pos(i) = 0
          End If
          
          '根据控件的原始位置及窗体改变大
          '小的比例对控件重新定位与改变大小
          Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
          Obj.Font.Size = ObjOldFont * UserControl.ScaleHeight
        Next i
      
      Next Obj
      
    End Sub