Getting Header Items' Images in Desktop Windows Applications

Applies to TestComplete 15.47, last modified on January 20, 2023

While testing header controls, you can use specific properties and methods of the corresponding program object to perform certain actions and obtain data stored in controls. You can call these methods and properties from your keyword tests, as well as from scripts. This topic describes how to work with the needed properties and methods from your scripts. However, when testing a control from your keyword test, you can use the same methods and properties calling them from keyword test operations. For more information, see Keyword Tests Basic Operations.

When working with header controls, you may need to obtain images that are displayed within header items. You can use a set of specific properties and methods of the Win32Header object for this purpose. Each header item can display either a string or a bitmap. You can obtain an item's bitmap via the wBitmap property. Header items can also display an additional image, which is taken from the image list along with the string or bitmap. You can obtain the additional image of a header item using the wImage property.

Both properties return the Picture object that corresponds to the specified images. If the specified item does not have an image, wBitmap (or wImage) returns an empty object (null in JavaScript, JScript, C#Script and C++Script, None in Python, Nothing in VBScript, nil in DelphiScript).

TestComplete provides a set of specific methods that allow you to process images. For example, you can use the Log.Picture method to post images to the test log, save them to a file using the Picture.SaveToFile method, determine the size of an image via the Picture.Size property, and so on. See the Picture object description to get information on the available actions. The following sample code obtains the images that are associated with header items and posts them to the test log.

JavaScript

function Main()
{
  var p, w, Header, ItemNumber;

  // Obtain the Explorer process, window and the header control
  WshShell.Run("explorer.exe c:", SW_NORMAL);
  p = Sys.Process("Explorer")
  w = p.Window("CabinetWClass", "SYSTEM (C:)", 1).Window("SHELLDLL_DefView", "", 1).Window("DUIViewWndClassName", "", 1).Window("DirectUIHWND", "", 1).Window("CtrlNotifySink", "", 1).Window("SysListView32", "FolderView", 1);
  w.Keys("[Apps]");
  w.PopupMenu.Click("View|Details");
  Header = w.Window("SysHeader32", "", 1);
  
  // Post images to the test log
  ItemNumber = Header.wItemCount
  for (let i = 0; i<ItemNumber; i++)
  {
  if (!strictEqual(Header.wBitmap(i), null))
    Log.Picture(Header.wBitmap(i), "Current image");
  else
    Log.Message(Header.wItem(i) + " item does not have a bitmap image");
  if (!strictEqual(Header.wImage(i), null))
    Log.Picture(Header.wImage(i), "Additional image");
  else
    Log.Message(Header.wItem(i) + " item does not have an additional image");
  }
}

JScript

function Main()
{
  var p, w, i, Header, ItemNumber;

  // Obtain the Explorer process, window and the header control
  WshShell.Run("explorer.exe c:", SW_NORMAL);
  p = Sys.Process("Explorer")
  w = p.Window("CabinetWClass", "SYSTEM (C:)", 1).Window("SHELLDLL_DefView", "", 1).Window("DUIViewWndClassName", "", 1).Window("DirectUIHWND", "", 1).Window("CtrlNotifySink", "", 1).Window("SysListView32", "FolderView", 1);
  w.Keys("[Apps]");
  w.PopupMenu.Click("View|Details");
  Header = w.Window("SysHeader32", "", 1);
  
  // Post images to the test log
  ItemNumber = Header.wItemCount
  for (i = 0; i<ItemNumber; i++)
  {
  if (Header.wBitmap(i)!= null)
    Log.Picture(Header.wBitmap(i), "Current image");
  else
    Log.Message(Header.wItem(i) + " item does not have a bitmap image");
  if (Header.wImage(i) != null)
    Log.Picture(Header.wImage(i), "Additional image");
  else
    Log.Message(Header.wItem(i) + " item does not have an additional image");
  }
}

Python

def Main():
  # Obtain the Explorer process, window and the header control
  WshShell.Run("explorer.exe c:", SW_NORMAL)
  p = Sys.Process("Explorer")
  w = p.Window("CabinetWClass", "SYSTEM (C:)", 1).Window("SHELLDLL_DefView", "", 1).Window("DUIViewWndClassName", "", 1).Window("DirectUIHWND", "", 1).Window("CtrlNotifySink", "", 1).Window("SysListView32", "FolderView", 1)
  w.Keys("[Apps]")
  w.PopupMenu.Click("View|Details")
  Header = w.Window("SysHeader32", "", 1)
  
  # Post images to the test log
  ItemNumber = Header.wItemCount 
  for i in range(0, ItemNumber-1):
    if (Header.wBitmap[i] != None):
      Log.Picture(Header.wBitmap[i], "Current image")
    else:
      Log.Message(Header.wItem[i] + " item does not have a bitmap image")
    if (Header.wImage[i] != None):
      Log.Picture(Header.wImage[i], "Additional image")
    else:
      Log.Message(Header.wItem[i] + " item does not have an additional image")

VBScript

Sub Main
  Dim p, w, i, Header, ItemNumber

  ' Obtain the Explorer process, window and the header control
  Call WshShell.Run("explorer.exe c:", SW_NORMAL)
  Set p = Sys.Process("Explorer")
  Set w = p.Window("CabinetWClass", "SYSTEM (C:)", 1).Window("SHELLDLL_DefView", "", 1).Window("DUIViewWndClassName", "", 1).Window("DirectUIHWND", "", 1).Window("CtrlNotifySink", "", 1).Window("SysListView32", "FolderView", 1)
  w.Keys "[Apps]"
  w.PopupMenu.Click("View|Details")
  Set Header = w.Window("SysHeader32", "", 1)
  
  ' Post images to the test log
  ItemNumber = Header.wItemCount
  For i = 0 To ItemNumber-1
    If Not (Header.wBitmap(i) Is Nothing) Then
      Call Log.Picture(Header.wBitmap(i), "Current image")
    Else
      Log.Message(Header.wItem(i) + " item does not have a bitmap image")
    End If
    If Not (Header.wImage(i) Is Nothing) Then
      Call Log.Picture(Header.wImage(i), "Additional image")
    Else
      Log.Message(Header.wItem(i) + " item does not have an additional image")
    End If
  Next 
End Sub

DelphiScript

procedure Main();
var 
  p, w, i, Header, ItemNumber: OleVariant;
begin
  // Obtain the Explorer process, window and the header control
  WshShell.Run('explorer.exe c:', SW_NORMAL);
  p := Sys.Process('Explorer');
  w := p.Window('CabinetWClass', 'SYSTEM (C:)', 1).Window('SHELLDLL_DefView', '', 1).Window('DUIViewWndClassName', '', 1).Window('DirectUIHWND', '', 1).Window('CtrlNotifySink', '', 1).Window('SysListView32', 'FolderView', 1);
  w.Keys('[Apps]');
  w.PopupMenu.Click('View|Details');
  Header := w.Window('SysHeader32', '', 1);
  
   // Post images to the test log
  ItemNumber := Header.wItemCount;
  for i := 0 to ItemNumber-1 do
  begin
  if (Header.wBitmap(i) <> nil)
  then
    Log.Picture(Header.wBitmap(i), 'Current image')
  else
    Log.Message(Header.wItem(i) + ' item does not have a bitmap image');
  if (Header.wImage(i) <> nil)
  then
    Log.Picture(Header.wImage(i), 'Additional image')
  else
    Log.Message(Header.wItem(i) + ' item does not have an additional image');
  end;
end;

C++Script, C#Script

function Main()
{
  var p, w, i, Header, ItemCount;

  // Obtain the Explorer process, window and the header control
  WshShell.Run("explorer.exe c:", SW_NORMAL);
  p = Sys["Process"]("Explorer");
  w = p["Window"]("CabinetWClass", "SYSTEM (C:)", 1)["Window"]("SHELLDLL_DefView", "", 1)["Window"]("DUIViewWndClassName", "", 1)["Window"]("DirectUIHWND", "", 1)["Window"]("CtrlNotifySink", "", 1)["Window"]("SysListView32", "FolderView", 1);
  w["Keys"]("[Apps]");
  w["PopupMenu"]["Click"]("View|Details");
  Header = w["Window"]("SysHeader32", "", 1);
  
  // Post images to the test log
  ItemNumber = Header.wItemCount
  for (i = 0; i<ItemNumber; i++)
  {
  if (Header["wBitmap"](i)!= null)
    Log["Picture"](Header["wBitmap"](i), "Current image");
  else
    Log["Message"](Header["wItem"](i) + " item does not have a bitmap image");
  if (Header["wImage"](i) != null)
    Log["Picture"](Header["wImage"](i), "Additional image");
  else
    Log["Message"](Header["wItem"](i) + " item does not have an additional image");
  }
}

When working with header items, you may need to check whether the specified item has an image or a bitmap. You can perform this check as it is described in the example above, but there is one more approach that is based on using the Win32HeaderItemFormat object. You can obtain this object via the wFormat property of the Win32Header object. Win32HeaderItemFormat provides the following properties to work with header items’ images:

  • HasImage - Returns True if the specified item has an additional image.
  • IsBitmap - Returns True if the specified item displays a bitmap.
  • IsBitmapOnRight - Returns True if the bitmap is displayed to the right of the header item's text.

The following sample code demonstrates how you can use the above-mentioned properties of the Win32HeaderItemFormat object. It checks whether the second item has images and posts informative messages to the test log:

JavaScript, JScript

function Main()
{
  var p, w, Header, ItemFormat;

  // Obtain the Explorer process, window and the header control
  WshShell.Run("explorer.exe c:", SW_NORMAL);
  p = Sys.Process("Explorer")
  w = p.Window("CabinetWClass", "SYSTEM (C:)", 1).Window("SHELLDLL_DefView", "", 1).Window("DUIViewWndClassName", "", 1).Window("DirectUIHWND", "", 1).Window("CtrlNotifySink", "", 1).Window("SysListView32", "FolderView", 1);
  w.Keys("[Apps]");
  w.PopupMenu.Click("View|Details");
  Header = w.Window("SysHeader32", "", 1);
  
  // Check whether the second item has assigned images
  ItemFormat = Header.wFormat(1);
  if (ItemFormat.HasImage == false)
      Log.Message("There is no additional image")
    else Log.Message("The " + Header.wItem(1) + "item has an image")
  if (ItemFormat.IsBitmap == true)
  {
    if (ItemFormat.IsBitmapOnRight == true)
        Log.Message("The bitmap is to the right of the text")
     else 
        Log.Message("The bitmap is to the left of the text")
  }
    else Log.Message("There is no bitmap")
}

Python

def Main():

  # Obtain the Explorer process, window and the header control
  WshShell.Run("explorer.exe c:", SW_NORMAL) 
  p = Sys.Process("Explorer")
  w = p.Window("CabinetWClass", "SYSTEM (C:)", 1).Window("SHELLDLL_DefView", "", 1).Window("DUIViewWndClassName", "", 1).Window("DirectUIHWND", "", 1).Window("CtrlNotifySink", "", 1).Window("SysListView32", "FolderView", 1)
  w.Keys("[Apps]")
  w.PopupMenu.Click("View|Details")
  Header = w.Window("SysHeader32", "", 1)
  
  # Check whether the second item has assigned images
  ItemFormat = Header.wFormat(1)
  if (ItemFormat.HasImage == False):
    Log.Message("There is no additional image")
  else:
    Log.Message("The " + Header.wItem[1] + "item has an image")
  if (ItemFormat.IsBitmap == True):
    if (ItemFormat.IsBitmapOnRight == True) :
      Log.Message("The bitmap is to the right of the text")
    else:
      Log.Message("The bitmap is to the left of the text")
  else:
   Log.Message("There is no bitmap")

VBScript

Sub Main
  Dim p, w, Header, ItemFormat

  ' Obtain the Explorer process, window and the header control
  Call WshShell.Run("explorer.exe c:", SW_NORMAL)
  Set p = Sys.Process("Explorer")
  Set w = p.Window("CabinetWClass", "SYSTEM (C:)", 1).Window("SHELLDLL_DefView", "", 1).Window("DUIViewWndClassName", "", 1).Window("DirectUIHWND", "", 1).Window("CtrlNotifySink", "", 1).Window("SysListView32", "FolderView", 1)
  w.Keys "[Apps]"
  w.PopupMenu.Click("View|Details")
  Set Header = w.Window("SysHeader32", "", 1)

  ' Check whether the second item has assigned images
  Set ItemFormat = Header.wFormat(1)
  If ItemFormat.HasImage = False Then 
      Log.Message("There is no additional image")
    Else Log.Message("The " & Header.wItem(1) & "item has an image")
  End If
  If ItemFormat.IsBitmap = True Then
    If ItemFormat.IsBitmapOnRight = True Then 
        Log.Message("The bitmap is to the right of the text")
      Else 
        Log.Message("The bitmap is to the left of the text")
    End If
    Else Log.Message("There is no bitmap")
  End If
End Sub

DelphiScript

procedure Main();
var 
  p, w, Header, ItemFormat: OleVariant;
begin
  // Obtain the Explorer process, window and the header control
  WshShell.Run('explorer.exe c:', SW_NORMAL);
  p := Sys.Process('Explorer');
  w := p.Window('CabinetWClass', 'SYSTEM (C:)', 1).Window('SHELLDLL_DefView', '', 1).Window('DUIViewWndClassName', '', 1).Window('DirectUIHWND', '', 1).Window('CtrlNotifySink', '', 1).Window('SysListView32', 'FolderView', 1);
  w.Keys('[Apps]');
  w.PopupMenu.Click('View|Details');
  Header := w.Window('SysHeader32', '', 1);
  
  // Check whether the second item has assigned images
  ItemFormat := Header.wFormat(1);
  if ItemFormat.HasImage = false
  then
    Log.Message('There is no additional image')
  else 
  Log.Message('The ' + aqConvert.VarToStr(Header.wItem(1)) + 'item has an image');
   
  if ItemFormat.IsBitmap = true then
  begin
    if ItemFormat.IsBitmapOnRight = true then
       Log.Message('The bitmap is to the right of the text')
    else
       Log.Message('The bitmap is to the left of the text')
  end
  else
  begin
    Log.Message('There is no bitmap')
  end
end;

C++Script, C#Script

function Main()
{
  var p, w, Header, ItemFormat;

  // Obtain the Explorer process, window and the header control
  WshShell.Run("explorer.exe c:", SW_NORMAL);
  p = Sys["Process"]("Explorer");
  w = p["Window"]("CabinetWClass", "SYSTEM (C:)", 1)["Window"]("SHELLDLL_DefView", "", 1)["Window"]("DUIViewWndClassName", "", 1)["Window"]("DirectUIHWND", "", 1)["Window"]("CtrlNotifySink", "", 1)["Window"]("SysListView32", "FolderView", 1);
  w["Keys"]("[Apps]");
  w["PopupMenu"]["Click"]("View|Details");
  Header = w["Window"]("SysHeader32", "", 1);
   
  // Check whether the second item has assigned images
  ItemFormat = Header["wFormat"](1);
  if (ItemFormat["HasImage"] == false)
      Log["Message"]("There is no additional image")
    else Log["Message"]("The " + Header["wItem"](1) + "item has an image")
  if (ItemFormat["IsBitmap"] == true)
  {
    if (ItemFormat["IsBitmapOnRight"] == true)
        Log["Message"]("The bitmap is to the right of the text")
      else 
        Log["Message"]("The bitmap is to the left of the text")
  }
    else Log["Message"]("There is no bitmap")
}

See Also

Working With Header Controls in Desktop Windows Applications
wBitmap Property (Header Controls)
wImage Property (Header Controls)
Picture Object

Highlight search results