|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Common
Control API Routines SendMessage: Add a Background Image to a ListView |
||
Posted: | Friday June 19, 1998 | |
Updated: | Monday December 26, 2011 | |
Applies to: | VB4-32, VB5, VB6 | |
Developed with: | VB5, Windows 98 | |
OS restrictions: | None | |
Author: | VBnet - Randy Birch | |
Related: |
Pure VB: Create a Ledger-Style Listview Report Background Pure VB: Create a Ledger-Style Listview Report Background with Custom Height Pure VB: Highlight a Listview Report Column WM_NOTIFY: Track Highlighted ListView Column Width Changes via Subclassing |
|
Prerequisites |
This method is intended for Visual Basic 5 or Visual Basic
6 where the Common Control library used is the MSComCtl 5 version (comctl32.ocx). Because the VB6-specific mscomctl.ocx (Common Controls 6)
is a complete implementation of comctl32.dll and not reliant on the version of comctl32.dll installed, this routine may not work when applied
to a listview created from the VB6-specific mscomctl.ocx.
Enhanced Comctl32 functionality is only available to users with comctl32.dll version 4.70 or greater installed. This dll is typically installed with IE3.x or greater. |
|
Once
again, the SendMessage API, in conjunction with the new extended style flags for the
Listview control, provides a means to customize the
appearance of the listview common control in a Visual Basic application.
By combining the new LVBKIMAGE structure (Type), and specifying the LVBKIF_SOURCE_URL Or LVBKIF_STYLE_TILE style flags, you can apply a background image to the control. Obviously, the image applied must be tasteful enough to allow the data to be presented. Too garish a background only detracts from the appearance of the app. In addition, the background scrolls with the listview. This is not of concern when LVBKIF_STYLE_TILE is used (illustration below, left) ... the background always has the image, but without it (the main illustration to the right), the graphic will scroll with the data. One of the added benefits of this feature is you can now add a graphic to the control to indicate that there is no data available (below, right). The LVBKIMAGE is only available on systems that has the comctl32.dll version provided with IE4 and other later MS products installed. |
BAS Module Code |
None. |
|
Form Code |
Create a form like the one shown, with a listview, an imagelist containing a 16x16 icon or bitmap, five command buttons and three text boxes using the control default names. Set the textbox paths to point to the files you want to use for the demo. Set the listview style to report mode, then add the following code to the form: |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Type LVBKIMAGE uFlags As Long hBmp As Long pszImage As String cchImageMax As Long xOffsetPercent As Long yOffsetPercent As Long End Type Private Type tagINITCOMMONCONTROLSEX dwSize As Long dwICC As Long End Type Private Const ICC_LISTVIEW_CLASSES As Long = &H1 Private Const CLR_NONE = &HFFFFFFFF Private Const LVM_FIRST As Long = &H1000 Private Const LVBKIF_SOURCE_NONE = &H0 Private Const LVBKIF_SOURCE_HBITMAP = &H1 Private Const LVBKIF_SOURCE_URL = &H2 Private Const LVBKIF_SOURCE_MASK = &H3 Private Const LVBKIF_STYLE_NORMAL = &H0 Private Const LVBKIF_STYLE_TILE = &H10 Private Const LVBKIF_STYLE_MASK = &H10 Private Const LVM_SETBKIMAGEA = (LVM_FIRST + 68) Private Const LVM_SETBKIMAGEW = (LVM_FIRST + 138) Private Const LVM_GETBKIMAGEA = (LVM_FIRST + 69) Private Const LVM_GETBKIMAGEW = (LVM_FIRST + 139) Private Const LVM_SETBKIMAGE = LVM_SETBKIMAGEA Private Const LVM_GETBKIMAGE = LVM_GETBKIMAGEA Private Const LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38) Private Const LVM_SETEXTENDEDLISTVIEWSTYLE As Long = (LVM_FIRST + 54) Private Const LVS_EX_FULLROWSELECT As Long = &H20 Private Declare Function SendMessage Lib "User32" _ Alias "SendMessageA" _ (ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long Private Declare Sub InitCommonControls Lib "comctl32" () Private Declare Function InitCommonControlsEx Lib "comctl32" _ (lpInitCtrls As tagINITCOMMONCONTROLSEX) As Boolean Private Sub Form_Load() With ListView1 .SortKey = 0 .SmallIcons = ImageList1 .ColumnHeaders(1).Width = .Width - 600 .View = lvwReport End With Call InitComctl32(ICC_LISTVIEW_CLASSES) 'An alternate way to set the extended listview styles! Call SendMessage(ListView1.hWnd, _ LVM_SETEXTENDEDLISTVIEWSTYLE, _ LVS_EX_FULLROWSELECT, ByVal True) DisplayNoDataImage End Sub Private Sub Command1_Click() Dim BKIMG As LVBKIMAGE 'prepare the backimage structure data With BKIMG 'use the file provided in pszImage member .uFlags = LVBKIF_SOURCE_URL 'the imagefile to display .pszImage = (Text3.Text) 'h&v offsets for the pix in percent. A setting 'of 0 aligns the image against the left or top; '100 against the right or bottom. A setting of '50 each centers the image in the control. .xOffsetPercent = 50 .yOffsetPercent = 50 End With 'set the text background to none (transparent) to 'allow image to show through. A RGB() value can 'also be passed to colour the text background '(to the edge of the control) Call SendMessage(ListView1.hWnd, _ LVM_SETTEXTBKCOLOR, _ 0&, ByVal CLR_NONE) 'set the image to the listview Call SendMessage(ListView1.hWnd, _ LVM_SETBKIMAGE, _ 0, BKIMG) End Sub Private Sub Command2_Click() BuildLVdata DisplayNoDataImage End Sub Private Sub Command3_Click() Dim BKIMG As LVBKIMAGE 'prepare the backimage structure data With BKIMG 'use the file provided in pszImage and tile .uFlags = LVBKIF_SOURCE_URL Or LVBKIF_STYLE_TILE 'the imagefile to display .pszImage = (Text2.Text) 'h&v offsets for the pix (only if tiled not specified) '.xOffsetPercent = 0 '.yOffsetPercent = 0 End With 'set the text background to none (transparent) to 'allow image to show through. A RGB() value can 'also be passed to colour the text background '(to the edge of the control) Call SendMessage(ListView1.hWnd, _ LVM_SETTEXTBKCOLOR, _ 0&, ByVal CLR_NONE) 'set the image to the listview Call SendMessage(ListView1.hWnd, _ LVM_SETBKIMAGE, _ 0&, BKIMG) End Sub Private Sub Command4_Click() ListView1.ListItems.Clear DisplayNoDataImage End Sub Private Sub Command5_Click() Unload Me End Sub Private Sub BuildLVdata() Dim itmX As ListItem Dim imgX As ListImage Dim sItem As String Dim c As Integer For c = 1 To 20 sItem = "Listview listitem #" & c Set itmX = ListView1.ListItems.Add(, , Trim$(sItem)) itmX.SmallIcon = ImageList1.ListImages("page").Key Next End Sub Private Sub DisplayNoDataImage() Dim BKIMG As LVBKIMAGE With BKIMG If ListView1.ListItems.Count > 0 Then 'remove the 'no data' image by clearing 'the image flag .uFlags = LVBKIF_SOURCE_NONE Else 'set the image to the 'no data text' image 'Specifying LVBKIF_SOURCE_URL indicates that the 'lParam member in SendMessage contains the 'path/filename of the image. .uFlags = LVBKIF_SOURCE_URL .pszImage = (Text1.Text) .xOffsetPercent = 3 .yOffsetPercent = 3 End If End With Call SendMessage(ListView1.hWnd, _ LVM_SETTEXTBKCOLOR, _ 0&, ByVal CLR_NONE) Call SendMessage(ListView1.hWnd, _ LVM_SETBKIMAGE, _ 0&, BKIMG) End Sub Private Function InitComctl32(dwFlags As Long) As Boolean Dim icc As tagINITCOMMONCONTROLSEX On Error GoTo Err_OldVersion icc.dwSize = Len(icc) icc.dwICC = dwFlags 'VB will generate error 453 "Specified 'DLL function not found" here if the new 'version isn't installed and it can't find 'the function's name. We'll hopefully be 'able to load the old version below. Note 'that the methods here must have comctl32.dll 'v4.72 or greater; this routine only 'initializes the API; it does not 'determine the version. InitComctl32 = InitCommonControlsEx(icc) Exit Function Err_OldVersion: InitCommonControls End Function |
Comments |
I have packaged up the three graphics shown in the illustrations in case you don't have anything handy to test the routines against. |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |