IC Imaging Control .NET

List VCDProperties

List VCDProperties

This chapter shows you how to retrieve all properties of a video capture device using the new VCD property interface.

All properties that are retrieved from the video capture device are displayed in a TreeView. The TreeView was chosen, because it perfectly matches the organization of the properties, since they establish a tree structure. The root of the tree is the VCDPropertyItems collection. The collection contains all VCDPropertyItems that are provided by the current video capture device. Every VCDPropertyItem has one or more VCDPropertyElements, which have one or more VCDPropertyInterfaces that are used to access the property.

The source code for the VB.NET and C# versions of this sample program can be found in the directories samples\VB *\List VCDProperties and samples\C# *\List VCDProperties in your My Documents/IC Imaging Control 3.4 directory.

Setting up the Project

Create a new project and add IC Imaging Control to the form. Before you run the program, select the video device, input and video format as shown in the First Steps Visual Studio .NET 2003 - 2008 chapter. Alternatively, run the program without selecting a device. In this case, the program shows the device selection dialog provided by IC Imaging Control. If you close this dialog without making a selection, the program displays an error message and terminate.

This sample uses some user controls. They can be found in the directory samples\VB71\common or samples\C#\common. Before you can use them, you have to add them to the project. Select Project from the menu and then choose Add Existing Item.... Now browse to the samples\VB71\common or samples\C#\common folder. Select the files Switch.vb, StringCombo.vb, RangeSlider.vb, PushButton.vb, ICControlBase.vb and AbsValSlider.vb. If you are using C#, the file extension is of course .cs instead of .vb. Now click on the little arrow next to the Open button and select Link File. Now you are ready to use the user controls.

Add 2 buttons to the form, name them btnSelectDevice and btnShowPage and label them Select Device and Show Property Page. They will be used to show the device settings resp. property page dialog provided by IC Imaging Control. Now add one instance of every user control to the form. Name them btnPush, cboMapStrings, chkSwitch, sldAbsVal and sldRange accordingly. Each of the user controls represents a special type of interface derived from VCDPropertyInterface.

Now add an image list and a tree view to the form. The image list will contain the graphical elements that are used to visualize the tree. Name the tree view Tree. In order to add graphical elements to the image list, click the ... button in the property window of the image list under Images. Now add the following images in the given order: item.png, value.png, auto.png, button.png, slider.png, switch.png and combo.png. All these bitmap files can be found in the directory of this sample. Change the Modifiers property of the image list to Friend (or internal if you use C#). Now, the image list can be added to the tree view. To do so, set the property ImageList of the tree view to the name of the image list. This will bind the image list to the tree view.

Adding Functionality

Add the Click events for the Select Device and Show Property Page buttons and insert the following code:

[VB.NET]
Private Sub btnSelectDevice_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelectDevice.Click ' The device settings dialog needs the live mode to be stopped. If IcImagingControl1.LiveVideoRunning Then IcImagingControl1.LiveStop() End If ' Show the device settings dialog IcImagingControl1.ShowDeviceSettingsDialog() ' If no device was selected, exit the program. If Not IcImagingControl1.DeviceValid Then MessageBox.Show("No device was selected.") Close() Exit Sub End If ListAllPropertyItems() ' Start live mode IcImagingControl1.LiveStart() ' Query all properties of the video capture device and list ' them in a tree control. QueryVCDProperties() End Sub
[C#]
private void btnSelectDevice_Click(object sender, EventArgs e) { // The device settings dialog needs the live mode to be stopped if (icImagingControl1.LiveVideoRunning) { icImagingControl1.LiveStop(); } // Show the device settings dialog icImagingControl1.ShowDeviceSettingsDialog(); // If no device was selected, exit if (!icImagingControl1.DeviceValid) { MessageBox.Show("No device was selected."); this.Close(); return; } // Start live mode icImagingControl1.LiveStart(); // (re-)initialize the tree view QueryVCDProperties(); }
[VB.NET]
Private Sub btnShowPage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShowPage.Click If IcImagingControl1.DeviceValid Then IcImagingControl1.ShowPropertyDialog() End If End Sub
[C#]
private void btnShowPage_Click(object sender, EventArgs e) { if (icImagingControl1.DeviceValid) { // Show the built-in properties dialog icImagingControl1.ShowPropertyDialog(); } }

Now add a Form_Load event and insert the code below:

[VB.NET]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If IcImagingControl1.DeviceValid = False Then ' Show the device settings dialog. btnSelectDevice_Click(Me, Nothing) End If If IcImagingControl1.DeviceValid = True Then ' Start live mode. IcImagingControl1.LiveStart() ' Query all properties of the video capture device and list ' them in a tree control. QueryVCDProperties() End If End Sub
[C#]
private void Form1_Load(object sender, EventArgs e) { if (!icImagingControl1.DeviceValid) { // Show the device settings dialog. btnSelectDevice_Click(btnSelectDevice, new System.EventArgs()); } if (icImagingControl1.DeviceValid) { ListAllPropertyItems(); // Start live mode. icImagingControl1.LiveStart(); // Query all properties of the video capture device and list // them in a tree control. QueryVCDProperties(); } }

As you can see in the code above, the btnSelectDevice_Click and the Form_Load event both call the procedures ListAllPropertyItems and QueryVCDProperties. QueryVCDProperties fills the tree view with the properties of the current video capture device. Additionally, ListAllPropertyItems prints the tree structure of those properties to the debug output window. The debug output shows you the pure organization of the VCDProperties without taking care of other aspects like controls. Let's have a look at the code for the procedure ListAllPropertyItems:

[VB.NET]
Private Sub ListAllPropertyItems() Dim PropertyItem As TIS.Imaging.VCDPropertyItem Dim PropertyElement As TIS.Imaging.VCDPropertyElement Dim PropertyInterFace As TIS.Imaging.VCDPropertyInterface ' Default interface type. ' Interface types for the different property interfaces. Dim Range As TIS.Imaging.VCDRangeProperty Dim Switch As TIS.Imaging.VCDSwitchProperty Dim AbsoluteValue As TIS.Imaging.VCDAbsoluteValueProperty Dim MapString As TIS.Imaging.VCDMapStringsProperty Dim Button As TIS.Imaging.VCDButtonProperty ' Get all property items For Each PropertyItem In IcImagingControl1.VCDPropertyItems System.Diagnostics.Debug.WriteLine(PropertyItem.Name) ' Get all property elements of the current property item. For Each PropertyElement In PropertyItem.Elements System.Diagnostics.Debug.WriteLine(" Element : " + PropertyElement.Name) ' Get all interfaces of the current property element. For Each PropertyInterFace In PropertyElement System.Diagnostics.Debug.Write(" Interface ") Try ' Cast the current interface into the apropriate type to access ' the special interface properties. Select Case PropertyInterFace.InterfaceID Case VCDIDs.VCDInterface_AbsoluteValue AbsoluteValue = PropertyInterFace System.Diagnostics.Debug.WriteLine("Absolut Value : " + AbsoluteValue.Value.ToString) Case VCDIDs.VCDInterface_MapStrings MapString = PropertyInterFace System.Diagnostics.Debug.WriteLine("Mapstring : " + MapString.String) Case VCDIDs.VCDInterface_Switch Switch = PropertyInterFace System.Diagnostics.Debug.WriteLine("Switch : " + Switch.Switch.ToString) Case VCDIDs.VCDInterface_Button Button = PropertyInterFace System.Diagnostics.Debug.WriteLine("Button") Case VCDIDs.VCDInterface_Range Range = PropertyInterFace System.Diagnostics.Debug.WriteLine("Range : " + Range.Value.ToString) End Select Catch ex As System.Exception System.Diagnostics.Debug.WriteLine("<error>") End Try Next Next Next End Sub
[C#]
private void ListAllPropertyItems() { // Interface types for the different property interfaces. TIS.Imaging.VCDRangeProperty Range; TIS.Imaging.VCDSwitchProperty Switch; TIS.Imaging.VCDAbsoluteValueProperty AbsoluteValue; TIS.Imaging.VCDMapStringsProperty MapString; TIS.Imaging.VCDButtonProperty Button; // Get all property items foreach (TIS.Imaging.VCDPropertyItem PropertyItem in icImagingControl1.VCDPropertyItems) { System.Diagnostics.Debug.WriteLine(PropertyItem.Name); // Get all property elements of the current property item. foreach (TIS.Imaging.VCDPropertyElement PropertyElement in PropertyItem.Elements) { System.Diagnostics.Debug.WriteLine(" Element : " + PropertyElement.Name); // Get all interfaces of the current property element. foreach (TIS.Imaging.VCDPropertyInterface PropertyInterFace in PropertyElement) { System.Diagnostics.Debug.Write(" Interface "); try { // Cast the current interface into the appropriate type to access // the special interface properties. if (PropertyInterFace.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_AbsoluteValue) { AbsoluteValue = (TIS.Imaging.VCDAbsoluteValueProperty)PropertyInterFace; System.Diagnostics.Debug.Write("Absolut Value : "); System.Diagnostics.Debug.WriteLine(AbsoluteValue.Value.ToString()); } else if ( PropertyInterFace.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_MapStrings ) { MapString = (TIS.Imaging.VCDMapStringsProperty)PropertyInterFace; System.Diagnostics.Debug.Write("Mapstring : "); System.Diagnostics.Debug.WriteLine(MapString.String); } else if ( PropertyInterFace.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Switch ) { Switch = (TIS.Imaging.VCDSwitchProperty)PropertyInterFace; System.Diagnostics.Debug.Write("Switch : "); System.Diagnostics.Debug.WriteLine(Switch.Switch.ToString()); } else if (PropertyInterFace.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Button) { Button = (TIS.Imaging.VCDButtonProperty)PropertyInterFace; System.Diagnostics.Debug.WriteLine("Button"); } else if (PropertyInterFace.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Range) { Range = (TIS.Imaging.VCDRangeProperty)PropertyInterFace; System.Diagnostics.Debug.Write("Range : "); System.Diagnostics.Debug.WriteLine(Range.Value.ToString()); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("<error>"); } } } } }

The three nested For Each loops in the code above reflects the tree structure of the VCDProperties. The first loop covers all available VCDPropertyItems and prints their names to the debug output. For each item, the second loop prints out all available VCDPropertyElements. The third loop prints out all types of interfaces that the element provides. Please note that the interfaces are sorted according to their extend of detail. The most detailed one is the "AbsoluteValue" interface, followed by the "MapStrings" interface. "Switch" and "Button" are detailed interfaces providing simple functionality: toggle On/Off, trigger. The "Range" interface is the most generic one, but does not provide a meaning for the values that represents. For example the "Brightness" range may be from 0 to 255. There is no way to tell, whether 0 or 255 is the maximum brightness value.

Now let's have a look at the QueryVCDProperties procedure. This procedure fills the tree view with appropriate values. The code for this procedure looks as follows:

[VB.NET]
Private Sub QueryVCDProperties() ' Erase the complete tree. Tree.Nodes.Clear() ' Create the root node. Dim root As New TreeNode("VCDPropertyItems") root.Tag = Nothing Tree.Nodes.Add(root) ' Query the VCDPropertyItems and fill the tree. QueryVCDPropertyItems(root, IcImagingControl1.VCDPropertyItems) ' Make sure the tree is expanded root.ExpandAll() End Sub
[C#]
private void QueryVCDProperties() { // Erase the complete tree. Tree.Nodes.Clear(); // Fill the tree. TreeNode root = new TreeNode("VCDPropertyItems"); Tree.Nodes.Add(root); QueryVCDPropertyItems(root, icImagingControl1.VCDPropertyItems); root.ExpandAll(); Tree.SelectedNode = root; }

The procedure above clears the tree view and creates a new root node. The root node is labeled VCDPropertyItems. Then the procedure QueryVCDPropertyItems inserts all available property items. This procedure looks as follows:

[VB.NET]
Private Sub QueryVCDPropertyItems(ByVal ParentNode As TreeNode, ByVal PropertyItems As TIS.Imaging.VCDPropertyItems) ' Iterate through all VCDPropertyItems and insert them into the tree control. For Each item As TIS.Imaging.VCDPropertyItem In PropertyItems ' Create a new tree node for the property item. ' The item identifier string is stored in the tag ' property of the tree node. Dim newNode As New TreeNode(item.Name, 0, 0) newNode.Tag = Nothing ParentNode.Nodes.Add(newNode) ' Now query the elements of the property item. QueryVCDPropertyElements(newNode, item) Next End Sub
[C#]
private void QueryVCDPropertyItems(TreeNode pp, TIS.Imaging.VCDPropertyItems props) { // Iterate through all VCDPropertyItems and insert them into the tree foreach (TIS.Imaging.VCDPropertyItem item in props) { // Create a new tree node for the item TreeNode newNode = new TreeNode(item.Name, 0, 0); // newNode.Tag = item.ItemID; newNode.Tag = null; pp.Nodes.Add(newNode); QueryVCDPropertyElements(newNode, item); } }

QueryVCDPropertyItems iterates through all available property items. For every item, it creates a new node. All of these nodes are direct children of the root node. The name of the VCDPropertyItem (e.g. "Brightness", "Gain" or "Exposure") is assigned to the Text property of the node. Nothing (or null if you use C#) is assigned to the tag property of the node. Then, QueryVCDPropertyElements is called for the new node. QueryVCDPropertyElements looks as follows:

[VB.NET]
Private Sub QueryVCDPropertyElements(ByVal ParentNode As TreeNode, ByVal PropertyItem As TIS.Imaging.VCDPropertyItem) ' generate a display name Dim name As String Dim Image As Integer Dim Element As TIS.Imaging.VCDPropertyElement For Each Element In PropertyItem.Elements ' Create a name for the property element. Select Case Element.ElementID Case VCDIDs.VCDElement_Value name = "VCDElement_Value" Image = 1 Case VCDIDs.VCDElement_Auto name = "VCDElement_Auto" Image = 2 Case VCDIDs.VCDElement_OnePush name = "VCDElement_OnePush" Image = 3 Case VCDIDs.VCDElement_WhiteBalanceRed name = "VCDElement_WhiteBalanceRed" Image = 4 Case VCDIDs.VCDElement_WhiteBalanceBlue name = "VCDElement_WhiteBalanceBlue" Image = 4 Case Else name = "Other Element ID" Image = 4 End Select ' Create a tree node for the element and insert it into the tree control. ' The item and element identifier strings are stored in the tag property ' of the tree node. Dim newNode As New TreeNode(name + ": " + Element.Name, Image, Image) newNode.Tag = Nothing ParentNode.Nodes.Add(newNode) ' Now query the interfaces of the property element. QueryVCDPropertyInterface(newNode, Element) Next End Sub
[C#]
private void QueryVCDPropertyElements(TreeNode pp, TIS.Imaging.VCDPropertyItem item) { TreeNode newNode = null; foreach (TIS.Imaging.VCDPropertyElement elem in item.Elements) { newNode = new TreeNode(elem.ElementID+": '" + elem.Name + "'", 1, 1); if ( elem.ElementID == TIS.Imaging.VCDIDs.VCDElement_Value ) newNode = new TreeNode("VCDElement_Value: '" + elem.Name + "'", 1, 1); else if ( elem.ElementID == TIS.Imaging.VCDIDs.VCDElement_Auto ) newNode = new TreeNode("VCDElement_Auto: '" + elem.Name + "'", 2, 2); else if ( elem.ElementID == TIS.Imaging.VCDIDs.VCDElement_OnePush ) newNode = new TreeNode("VCDElement_OnePush: '" + elem.Name + "'", 3, 3); else if ( elem.ElementID == TIS.Imaging.VCDIDs.VCDElement_WhiteBalanceRed ) newNode = new TreeNode("VCDElement_WhiteBalanceRed: '" + elem.Name + "'", 4, 4); else if ( elem.ElementID == TIS.Imaging.VCDIDs.VCDElement_WhiteBalanceBlue ) newNode = new TreeNode("VCDElement_WhiteBalanceBlue: '" + elem.Name + "'", 4, 4); else newNode = new TreeNode("Other Element ID: '" + elem.Name + "'", 4, 4); newNode.Tag = null; pp.Nodes.Add(newNode); // Insert all interfaces QueryVCDPropertyInterface(newNode, elem); } }

QueryVCDPropertyElements iterates through all available elements. For every element, it creates a new node. All of these nodes are children of the node, which represents the VCDPropertyItem to which these VCDPropertyElements belong. The Select block (or switch block in C#) determines the appropriate graphical tree element for the node and sets its base name, depending on the type of the element. The name of the VCDPropertyElement (e.g. "Value", "Auto" or "Enable") is added to the base name and then assigned to the Text property of the node. Nothing (or null, if you use C#) is assigned to the tag property of the node. Then, QueryVCDPropertyInterface is called for the new node. QueryVCDPropertyInterface looks as follows:

[VB.NET]
Private Sub QueryVCDPropertyInterface(ByVal ParentNode As TreeNode, ByVal PropertyElement As TIS.Imaging.VCDPropertyElement) Dim Name As String Dim image As Integer Dim Itf As TIS.Imaging.VCDPropertyInterface ' Iterate through all VCDPropertyInterfaces of the passed VCDPropertyElement ' and insert them into the tree control. For Each Itf In PropertyElement ' Create an appropriate interface name. Select Case Itf.InterfaceID Case VCDIDs.VCDInterface_AbsoluteValue Name = "AbsoluteValue" image = 4 Case VCDIDs.VCDInterface_MapStrings Name = "MapStrings" image = 6 Case VCDIDs.VCDInterface_Range Name = "Range" image = 4 Case VCDIDs.VCDInterface_Switch Name = "Switch" image = 5 Case VCDIDs.VCDInterface_Button Name = "Button" image = 3 End Select ' Insert the node. ' The item, element and interface identifier strings are stored in the tag property ' of the tree node. Dim newNode As New TreeNode(Name, image, image) newNode.Tag = Itf.Parent.Parent.ItemID + ":" + Itf.Parent.ElementID + ":" + Itf.InterfaceID ParentNode.Nodes.Add(newNode) Next End Sub
[C#]
private void QueryVCDPropertyInterface(TreeNode pp, TIS.Imaging.VCDPropertyElement elem) { TreeNode newNode = null; foreach (TIS.Imaging.VCDPropertyInterface itf in elem) { newNode = new TreeNode(itf.InterfaceID, 4, 4); if ( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_AbsoluteValue ) newNode = new TreeNode("AbsoluteValue", 4, 4); else if( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_MapStrings ) newNode = new TreeNode("MapStrings", 6, 6); else if( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Range ) newNode = new TreeNode("Range", 4, 4); else if( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Switch ) newNode = new TreeNode("Switch", 5, 5); else if( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Button ) newNode = new TreeNode("Button", 3, 3); // The Tag property holds the interface at the node. newNode.Tag = itf.Parent.Parent.ItemID + ":" + itf.Parent.ElementID + ":" + itf.InterfaceID; pp.Nodes.Add(newNode); } }

QueryVCDPropertyInterface iterates through all available interfaces of an element. For every interface, it creates a new node. All of these nodes are children of the node which represents the VCDPropertyElement to which these VCDPropertyInterface belong. The Select block (or switch block in C#) determines the appropriate graphical tree element for the node and sets its name, depending on the type of the element. The name is then assigned to the Text property of the node. The interface path that consists of an itemID, an elementID and an interfaceID is assigned to the tag property of the node. The interface node makes up a leaf of the tree.

Accessing and Manipulating a VCDProperty

Now that the tree is built up, we want to access the properties. To do this, add an AfterSelect event for the tree view and insert the following code:

[VB.NET]
Private Sub Tree_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles Tree.AfterSelect ' If the Tag property is empty, no leaf node was selected If Tree.SelectedNode.Tag Is Nothing Then Exit Sub If Not RangeCtrl Is Nothing Then RangeCtrl.Dispose() If Not SwitchCtrl Is Nothing Then SwitchCtrl.Dispose() If Not MapStringsCtrl Is Nothing Then MapStringsCtrl.Dispose() If Not ButtonCtrl Is Nothing Then ButtonCtrl.Dispose() If Not AbsValCtrl Is Nothing Then AbsValCtrl.Dispose() Dim itfPath As String = Tree.SelectedNode.Tag Dim itf As TIS.Imaging.VCDPropertyInterface = IcImagingControl1.VCDPropertyItems.FindInterface(itfPath) If Not itf Is Nothing Then itf.Update() ' Show the control group matching the type of the selected interface ' and initialize it Select Case itf.InterfaceID Case VCDIDs.VCDInterface_AbsoluteValue ShowAbsoluteValueControl(itf) Case VCDIDs.VCDInterface_MapStrings ShowComboBoxControl(itf) Case VCDIDs.VCDInterface_Range ShowRangeControl(itf) Case VCDIDs.VCDInterface_Switch ShowSwitchControl(itf) Case VCDIDs.VCDInterface_Button ShowButtonControl(itf) End Select End If End Sub
[C#]
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { // If the Tag property is empty, no leaf node was selected. if (Tree.SelectedNode.Tag == null) { return; } // Hide all control groups if (RangeCtrl != null) RangeCtrl.Dispose(); if (SwitchCtrl != null) SwitchCtrl.Dispose(); if (MapStringsCtrl != null) MapStringsCtrl.Dispose(); if (ButtonCtrl != null) ButtonCtrl.Dispose(); if (AbsValCtrl != null) AbsValCtrl.Dispose(); string itfPath = Tree.SelectedNode.Tag.ToString(); TIS.Imaging.VCDPropertyInterface itf = icImagingControl1.VCDPropertyItems.FindInterface(itfPath); if (itf != null) { itf.Update(); // Show the control group matching the type of the selected interface // and initialize it. if ( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_AbsoluteValue ) ShowAbsoluteValueControl(itf); else if( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_MapStrings) ShowComboBoxControl(itf); else if( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Range) ShowRangeControl(itf); else if( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Switch) ShowSwitchControl(itf); else if( itf.InterfaceID == TIS.Imaging.VCDIDs.VCDInterface_Button) ShowButtonControl(itf); } }

Now it becomes clear, why the tags of the interface nodes store the interface path. If you click an interface node, the appropriate control should appear on the form, so that you can manipulate the setting of the property. To get the correct interface, the method FindInterface is used. FindInterface needs the interface path (or GUID) as a parameter. The tag of an interface node represents this interface path (or GUID). The Select block (or switch in C#) maps the appropriate user control to the desired interface and calls the respective "Show%%" procedure. These procedures set the "Visible" property of the user control to True, so that it can be used to manipulate the setting of the specified property. The ShowAbsoluteValueControl procedure for example is implemented as follows:

[VB.NET]
Private Sub ShowAbsoluteValueControl(ByVal itf As TIS.Imaging.VCDPropertyInterface) AbsValCtrl = New AbsValSlider() CtrlFrame.Controls.Add(AbsValCtrl) AbsValCtrl.SetBounds(20, 20, 500, 27) AbsValCtrl.AssignItf(itf) CtrlFrame.Text = itf.Parent.Parent.Name + ": " + itf.Parent.Name ' Property item name End Sub
[C#]
private void ShowAbsoluteValueControl(TIS.Imaging.VCDPropertyInterface itf) { TIS.Imaging.VCDAbsoluteValueProperty AbsValItf = (TIS.Imaging.VCDAbsoluteValueProperty)itf; AbsValCtrl = new AbsValSlider(); CtrlFrame.Controls.Add(AbsValCtrl); AbsValCtrl.SetBounds(20, 20, 500, 27); AbsValCtrl.AssignItf(AbsValItf); CtrlFrame.Text = "Absolute Value"; }

The appropriate procedures for the other user controls are implemented in the same way, except the last line of code of the VB.NET sample, which is left out.

<< Programmer's Guide

Get in touch with us


About The Imaging Source

Established in 1990, The Imaging Source is one of the leading manufacturers of industrial cameras, frame grabbers and video converters for production automation, quality assurance, logistics, medicine, science and security.

Our comprehensive range of cameras with USB 3.1, USB 3.0, USB 2.0, GigE interfaces and other innovative machine vision products are renowned for their high quality and ability to meet the performance requirements of demanding applications.

Automated Imaging Association ISO 9001:2015 certified

Contact us