DOCUMENT:Q184645 11-JAN-2001 [vbwin] TITLE :HOWTO: Create Lightweight Controls with Visual Basic 6.0 PRODUCT :Microsoft Visual Basic for Windows PROD/VER:WINDOWS:6.0 OPER/SYS: KEYWORDS:kbGrpDSVB ====================================================================== ------------------------------------------------------------------------------- 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 2001.