CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 4 of 4
  1. #1
    Join Date
    Mar 1999
    Posts
    4

    ListView Problem...( ful row selection )



    Hi Everybody,


    The VisualBasic version is 5.0

    My application has a ListView control.

    I am doing a full row select by using SendMessage and the style as

    LVS_EX_FULLROWSELECT, for which you need Comctl32.dll's new version

    which comes with I.E 4.0. ( I have this new version ).

    Now the problem is when I do F5 in VB, it runs properly i.e.

    the full row is selected in the Listiew. But if I make an EXE

    of that application, the full row selection doesn't take place.

    Does anybody knows, why this happens.


    Thanks

    Abhijit




  2. #2
    Join Date
    May 1999
    Location
    Oxford UK
    Posts
    1,459

    Re: ListView Problem...( ful row selection )



    Hi


    You need to call either the :


    InitCommonControls


    or


    InitCommonControlsEx


    API inside ComCtl32.dll.


    Although this shouldn't matter (it should be initialised already), I've known it to cause problems on some PC's when InitCommonControlsXX has not been called.


    Take a look at Randy Birch's example at :


    http://www.mvps.org/vbnet/code/comctl/initcomctls.htm


    Failing that - post your code here and I'll see if I can spot anything wrong.


    Regards


    Chris Eastwood


    CodeGuru - the website for developers

    http://www.codeguru.com/vb



  3. #3
    Join Date
    Mar 1999
    Posts
    4

    Re: ListView Problem...( ful row selection )



    Thanks for the Help, but it doesn't work.


    Here's my code.

    Module1 General - Declaration section


    Option Explicit


    Global itemHeight As Integer

    Public Const ICC_LISTVIEW_CLASSES = &H1 'listview, header

    Public Const LVM_FIRST = &H1000

    Public Const LVM_SETEXTENDEDLISTVIEWSTYLE As Long = LVM_FIRST + 54

    Public Const LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55

    Public Const LVS_EX_FULLROWSELECT As Long = &H20

    'For flat scrollbars

    Public Const LVS_EX_FLATSB As Long = &H100


    Type tagINITCOMMONCONTROLSEX ' icc

    dwSize As Long ' size of this structure

    dwICC As Long ' flags indicating which classes to be initialized.

    End Type


    '==========================================================

    'Initializes the entire common control dynamic-link library.

    'Exported by all versions of Comctl32.dll.

    Declare Sub InitCommonControls Lib "comctl32.dll" ()


    'Initializes specific common controls classes from the common

    'control dynamic-link library.

    'Returns TRUE (non-zero) if successful, or FALSE otherwise.

    'Began being exported with Comctl32.dll version 4.7 (IE3.0 & later).

    Declare Function InitCommonControlsEx Lib "comctl32.dll" _

    (lpInitCtrls As tagINITCOMMONCONTROLSEX) As Boolean


    'Declarations and constants to highlight a full row

    'in the ListView control

    Declare Function SendMessageAny Lib "user32" Alias "SendMessageA" _

    (ByVal hwnd As Long, _

    ByVal wMsg As Long, _

    ByVal wParam As Long, _

    lParam As Any) As Long


    Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _

    (ByVal hwnd As Long, _

    ByVal wMsg As Long, _

    ByVal wParam As Long, _

    lParam As Long) As Long


    Public Type LVBKIMAGE

    ulFlags As Long ' Tiled or normal etc

    hBitmap As Long ' Handle to the bitmap

    pszImage As String 'File Name of bitmap

    cchImageMax As Long ' Size of bitmap

    xOffsetPercent As Long ' X Offset to display (if not tiled)

    yOffsetPercent As Long ' Y Offset to display (if not tiled)

    End Type


    Public Const LVSIL_STATE As Long = 2

    Public Const LVIF_STATE = &H8

    Public Const LVIS_STATEIMAGEMASK As Long = &HF000

    Public Const LVM_SETITEMSTATE = (LVM_FIRST + 43)

    Public Const GWL_STYLE = (-16)

    Public Const LVM_GETITEM = (LVM_FIRST + 5)

    Public Const LVM_SETITEM = (LVM_FIRST + 6)

    Public Const LVIF_INDENT = &H10&

    Public Const LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38)

    Public Const LVM_SETBKIMAGE = (LVM_FIRST + 68)

    Public Const LVBKIF_SOURCE_URL = &H2

    Public Const LVBKIF_SOURCE_HBITMAP = &H1

    Public Const LVBKIF_STYLE_TILE = &H10

    Public Const CLR_NONE = &HFFFFFFFF


    Module1 General - InitComCtl32


    'Common control Initializing routine.

    'Returns True if the current working version of

    'Comctl32.dll is available on the system and the

    'new IE3 styles and messages can be used. Returns

    'False either if the old version is present or

    'Comctl32.dll isn't available at all. Also ensures

    'that the library is loaded for use.

    'We can get away with this hack rather than checking

    'the file's version because VB resolves declared API

    'function names only when they're called, not when 'it compiles the code...


    Public 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 newer

    'version isn't installed and the function's name

    'can't be located in the library. The error is

    'trapped and the generic API below is called instead.

    InitComctl32 = InitCommonControlsEx(icc)

    Exit Function

    Err_OldVersion:

    InitCommonControls

    End Function

    '=========================================================


    Code in Form Load section

    ASAP is my form name


    Private Sub Form_Load()

    Dim lStyle As Long

    Dim tLVBKImage As LVBKIMAGE

    Dim r As Boolean


    'initialize the listview classes of the

    'comctl32 dll by calling InitCommonControlsEx.

    'If the dll does not support the class passed,

    'the InitComctl32 routine's error is fired,

    'and the InitCommonControls API is called.

    r = InitComctl32(ICC_LISTVIEW_CLASSES)



    ASAP.WindowState = vbMaximized



    ' Create an object variable for the ColumnHeader object.

    Dim clmX As ColumnHeader

    ' Add ColumnHeaders. The width of the columns is the width

    ' of the control divided by the number of ColumnHeader objects.



    Set clmX = ListView1.ColumnHeaders. _

    Add(, , "xxxxxxxxxxx", ListView1.Width / 3)


    Dim longStr, clmnHdrStr As String

    Dim itemWidth, clmnHdrWidth As Integer



    longStr = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"

    itemWidth = TextWidth(longStr)

    Set clmX = ListView1.ColumnHeaders. _

    Add(, , "zzzzzzzzzzzzzzzzzzz", itemWidth)



    longStr = "aaaaa"

    itemWidth = TextWidth(longStr)

    clmnHdrStr = "bbbbbbbbbb"

    clmnHdrWidth = TextWidth(clmnHdrStr)

    If itemWidth < clmnHdrWidth Then

    itemWidth = clmnHdrWidth

    End If



    Set clmX = ListView1.ColumnHeaders. _

    Add(, , "bbbbbbbbbb", itemWidth)



    ListView1.View = lvwReport ' Set View property to Report.



    itemHeight = TextHeight(longStr)



    Dim listItem As listItem

    '1.

    Set listItem = ListView1.ListItems.Add(1, "a", "aaaaaaaaa")

    listItem.SubItems(1) = "bbbbbbbbbbbbbbbbbb"

    listItem.SubItems(2) = longStr

    '2.

    Set listItem = ListView1.ListItems.Add(2, "b", "cccccccccccccc")

    listItem.SubItems(1) = "dddddddddddddddddddddddddddddddddd"

    listItem.SubItems(2) = longStr

    '3.

    Set listItem = ListView1.ListItems.Add(3, "c", "eeeeeeeeeeeeeee")

    listItem.SubItems(1) = "ffffffffffffffffffffffffffffffffffffffff"

    listItem.SubItems(2) = longStr





    With tLVBKImage

    .ulFlags = LVBKIF_SOURCE_URL Or LVBKIF_STYLE_TILE

    .pszImage = "D:\\TrialApplications\\Asap\\AAPISPLSHold.bmp"

    .cchImageMax = Len(.pszImage)

    End With


    '

    ' Set the bitmap in the listview

    '

    SendMessageLong ListView1.hwnd, LVM_SETTEXTBKCOLOR, 0, ByVal CLR_NONE

    SendMessageAny ListView1.hwnd, LVM_SETBKIMAGE, 0, tLVBKImage



    '

    ' Set the full row selection

    '

    lStyle = SendMessageLong(ListView1.hwnd, _

    LVM_GETEXTENDEDLISTVIEWSTYLE, _

    0, 0)

    lStyle = lStyle Or LVS_EX_FULLROWSELECT

    'set the new listview style

    SendMessageAny ListView1.hwnd, _

    LVM_SETEXTENDEDLISTVIEWSTYLE, _

    lStyle, 1



    'The first item should be selected

    ListView1.ListItems(1).Selected = True



    End Sub


    Thanks,

    Abhijit




  4. #4
    Join Date
    May 1999
    Location
    Oxford UK
    Posts
    1,459

    Re: ListView Problem...( ful row selection )



    Hi


    I haven't had a chance to check your code yet (will do later). For the time

    being try the following code in a standalone exe:


    1. Setup a Form with a listview in report view with a couple of column headings


    2. In the Declarations Section :


    Private Const LVM_FIRST As Long = &H1000

    Private Const LVM_SETEXTENDEDLISTVIEWSTYLE As Long = LVM_FIRST + 54

    Private Const LVS_EX_FULLROWSELECT As Long = &H20


    Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


    3. In your Form_Load event, add some items to the listview, then :


    SendMessageLong ListView1.hwnd, _

    LVM_SETEXTENDEDLISTVIEWSTYLE, _

    LVS_EX_FULLROWSELECT, True


    This is the new way of updating the Extended Styles in a listview in ComCtl version 4.71 or later.


    Regards


    Chris Eastwood


    CodeGuru - the website for developers

    http://www.codeguru.com/vb




Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured