Q184645: HOWTO: Create Lightweight Controls with Visual Basic 6.0
Article: Q184645
Product(s): Microsoft Visual Basic for Windows
Version(s): WINDOWS:6.0
Operating System(s):
Keyword(s): kbGrpDSVB
Last Modified: 11-JAN-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual Basic Learning Edition for Windows, version 6.0
- Microsoft Visual Basic Professional Edition for Windows, version 6.0
- Microsoft Visual Basic Enterprise Edition 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.
a. On the File menu, click Add Project. The Add Project dialog box appears.
b. In the New Tab, select ActiveX Control.
c. Click Open to add the project to your project group and to close the Add
Project dialog box. UserControl1 is created by default.
d. 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 : kbGrpDSVB
Technology : kbVBSearch kbAudDeveloper kbZNotKeyword6 kbZNotKeyword2 kbVB600Search kbVBA600 kbVB600
Version : WINDOWS:6.0
Issue type : kbhowto
=============================================================================
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1986-2002.