HOWTO: Create Lightweight Controls with Visual Basic 6.0

ID: Q184645


The information in this article applies to:
  • Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, version 6.0


SUMMARY

This article shows you how to create a lightweight control in Visual Basic version 6.0, briefly covers the advantages and limitations of lightweight controls, and contains instructions on how to create a sample project that demonstrates how lightweight controls use less system resources.


MORE INFORMATION

Lightweight, or windowless controls, are controls that are similar to regular controls except that lightweight controls do not have window handles. Because of they lack window handles, lightweight controls require less system resources, making them ideal for Internet applications, distributed applications, or any application where limited system resources may be an issue. Further, lightweight controls can be any shape and have true transparency properties.

When you create a lightweight control, the container can hold only other lightweight controls. If you try to place a regular control in a lightweight user control, you will receive the following error:

Can't have windowed child controls on a windowless control.

Regular controls always appear on top of lightweight controls because lightweight controls use the resources of the parent form. The ZOrder of a regular control changes only with respect to other regular controls.

Because lightweight controls do not have a Hwnd property, you cannot use these controls with Windows API functions that require an HWnd parameter. The HWnd property of the container is used instead, which may result in unpredictable results.

To make a control into a lightweight control, set the Windowless property of the control to True.

Visual Basic ships with intrinsic lightweight controls and other lightweight controls in the ActiveX component file MSWLess.ocx. For a list of these intrinsic controls and instructions on how to use the controls in the ActiveX component file MSWLess.ocx, please see the following article in the Microsoft Knowledge Base:
Q184687 INFO: Lightweight Controls in Visual Basic 6.0
The next section tells you how to create a sample project that contains a lightweight control. The sample project demonstrates that a lightweight control uses less resources than a regular control.

Creating the Sample Project

This section shows you how to create the sample project. The project measures the amount of time to load and unload a lightweight control as compared to a regular control. To create this project, you need to create a Standard EXE project, a lightweight control, and a regular control.

To Create the Standard EXE Program

  1. Start a new Standard EXE project in Visual Basic. Form1 is created by default.


  2. Add the following controls to the Form1 form and set the following properties to the appropriate controls:
    
          Control           Default Name     Property               Setting
          ---------------------------------------------------------------------
          Command Button    Command1         Name                    cmdWndLess
                                             Height                         375
                                             Left                           120
                                             Top                            840
                                             Width                         2535
    
          Command Button    Command2         Name                        cmdWnd
                                             Height                         375
                                             Left                          3000
                                             Top                            840
                                             Width                         2535
    
          TextBox           Text1            Name              txtNumofControls
                                             Height                         285
                                             Left                          1680
                                             Top                            120
                                             Width                          375
    
          Label             Label1           Name                lblWndLessLoad
                                             AutoSize                      True
                                             Height                         195
                                             Left                           120
                                             Top                           1320
    
          Label             Label2           Name              lblWndLessUnload
                                             AutoSize                      True
                                             Height                         195
                                             Left                           120
                                             Top                           1680
    
          Label             Label3           Name                    lblWndLoad
                                             AutoSize                      True
                                             Height                         195
                                             Left                          3000
                                             Top                           1320
    
          Label             Label4           Name                  lblWndUnload
                                             AutoSize                      True
                                             Height                         195
                                             Left                          3000
                                             Top                           1680
                                             Width                          480
    
          Label             Label5           Name                 lblStartTicks
                                             Alignment            Right Justify
                                             AutoSize                      True
                                             Caption               Start Ticker
                                             Height                         195
                                             Left                          4680
                                             Top                            480
                                             Width                          810
    
          Label             Label6           Name                   lblEndTicks
                                             Alignment            Right Justify
                                             AutoSize                      True
                                             Caption                 End Ticks:
                                             Height                         195
                                             Left                          4680
                                             Top                            120
     


  3. Copy the following code to the Code window of the Form1 form:
    
          Option Explicit
          Private Declare Function GetTickCount Lib "kernel32" () As Long
          Dim bLoadWnd As Boolean
          Dim bLoadWndLess As Boolean
          Dim lTickStart As Long
          Dim lTickEnd As Long
          Dim lResult As Long
          Dim colCtrlWnd As Collection
          Dim colCtrlWndLess As Collection
    
          Private Sub cmdWnd_Click()
          'This event loads and unloads regular controls.
             Dim tmpCtrlWnd As Control
             Dim lCounter As Long
    
             If bLoadWnd = True Then
                'Load Regular controls.
                lblWndLoad.Caption = "Loading Regular Controls"
                lTickStart = GetTickCount
                lblStartTicks.Caption = "Start: " & CStr(lTickStart) & " ms"
    
                For lCounter = 1 To Val(txtNumofControls.Text)
                   Set tmpCtrlWnd = Controls.Add("TestControls.ctrlWnd", _
                                                 "ctrlWnd" & lCounter)
                   colCtrlWnd.Add tmpCtrlWnd
                   Set tmpCtrlWnd = Nothing
                   DoEvents
                Next
    
                lTickEnd = GetTickCount
                lblEndTicks.Caption = "End: " & CStr(lTickEnd) & " ms"
                lblWndLoad.Caption = "Load Time: " & _
                                     CStr(lTickEnd - lTickStart) & " ms"
                bLoadWnd = False
                cmdWnd.Caption = "Unload Regular Controls"
    
             Else
                'Unload regular controls.
                lblWndUnload.Caption = "Unloading Regular Controls"
                lTickStart = GetTickCount
                lblStartTicks.Caption = "Start: " & CStr(lTickStart) & " ms"
                '  UnLoad controls.
                For lCounter = colCtrlWnd.Count To 1 Step -1
                   Controls.Remove colCtrlWnd.Item(lCounter).Name
                   colCtrlWnd.Remove (lCounter)
                Next
                lTickEnd = GetTickCount
                lblEndTicks.Caption = "End: " & CStr(lTickEnd) & " ms"
                lblWndUnload.Caption = "Unload Time: " & _
                                        CStr(lTickEnd - lTickStart) & " ms"
                bLoadWnd = True
                cmdWnd.Caption = "Load Regular Controls"
    
             End If
    
          End Sub
    
          Private Sub cmdWndless_Click()
          'This command button loads and unloads the lightweight controls.
    
             Dim tmpCtrlWndLess As Control
             Dim lCounter As Long
             If bLoadWndLess = True Then
                lblWndLessLoad.Caption = "Loading Lightweight Controls"
                lTickStart = GetTickCount
                lblStartTicks.Caption = "Start: " & CStr(lTickStart) & " ms"
    
                '  Load controls.
                For lCounter = 1 To Val(txtNumofControls.Text)
                   Set tmpCtrlWndLess = _
                                    Controls.Add("TestControls.ctrlWndLess", _
                                    "ctrlWndLess" & lCounter)
                   colCtrlWndLess.Add tmpCtrlWndLess
                   Set tmpCtrlWndLess = Nothing
                   DoEvents
                Next
    
                lTickEnd = GetTickCount
                lblEndTicks.Caption = "End: " & CStr(lTickEnd) & " ms"
                lblWndLessLoad.Caption = "Load Time: " & _
                                         CStr(lTickEnd - lTickStart) & " ms"
                bLoadWndLess = False
                cmdWndless.Caption = "Unload Windowless Controls"
             Else
                lblWndLessUnload.Caption = "Unloading Lightweight Controls"
                lTickStart = GetTickCount
                lblStartTicks.Caption = "Start: " & CStr(lTickStart) & " ms"
    
                '  UnLoad controls.
                For lCounter = colCtrlWndLess.Count To 1 Step -1
                   Controls.Remove colCtrlWndLess.Item(lCounter).Name
                   colCtrlWndLess.Remove (lCounter)
                Next
    
                lTickEnd = GetTickCount
                lblEndTicks.Caption = "End: " & CStr(lTickEnd) & " ms"
                lblWndLessUnload.Caption = "Unload Time: " & _
                                         CStr(lTickEnd - lTickStart) & " ms"
                bLoadWndLess = True
                cmdWndless.Caption = "Load Windowless Controls"
             End If
          End Sub
    
          Private Sub Form_Load()
             Set colCtrlWnd = New Collection
             Set colCtrlWndLess = New Collection
             cmdWndless.Caption = "Load Lightweight Controls"
             bLoadWndLess = True
             cmdWnd.Caption = "Load Regular Controls"
             bLoadWnd = True
             txtNumofControls.Text = "20"
          End Sub
     


  4. On the Run menu, click Start or press the F5 key to start the program. If the form successfully launches, then you have completed creating the standard executable program in this project.


The next section shows you how to create the regular and lightweight controls that the standard executable program uses.

To Create the Regular and Lightweight Controls

  1. Add an ActiveX Control project to your project group.

    1. On the File menu, click Add Project. The Add Project dialog box appears.


    2. In the New Tab, select ActiveX Control.


    3. Click Open to add the project to your project group and to close the Add Project dialog box. UserControl1 is created by default.


    4. Change the name of UserControl1 to ctrlWnd. This will be your regular control.




  2. Add a combo box to the ctrlWnd control. Save the control.


  3. Add another UserControl by completing the following steps. This will be your lightweight control:

    1. On the Project Menu, click Add User Control. The Add User Control dialog box appears with User Control highlighted.


    2. Click Open to add the User Control to the project and close the Add User Control dialog box. UserControl1 is created by default.


    3. Change the name of UserControl1 to ctrlWndLess.


    4. Set the Windowless property to True.




  4. Save the control.


  5. Rename the Project to TestControls. Save the project.


You have completed creating the ActiveX controls required by this project. To run the project, press F5 or from the Run menu, click Start. You can set the number of controls and compare the load and unload times.

Additional query words: kbCtrl kbCtrlCreate kbVBp kbVBp600 kbVBp kbdsd kbDSupport

Keywords : kbGrpVB
Version : WINDOWS:6.0
Platform : WINDOWS
Issue type : kbhowto


Last Reviewed: January 5, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.