Announcement

Collapse
No announcement yet.

Listview with ProgressBar

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Jules Marchildon
    replied
    Lance;
    Cute Jules!
    At least my wife thinks so...

    p.s. BTW, can't take the credit, that belongs to Borje!

    Regards,
    Jules

    Leave a comment:


  • Gregery D Engle
    replied
    Thanks Borje, Everything works now. I turned off Column headers
    because if you move the columns around and scroll to the right
    it messes up repainting. The makes sense because we used the
    width of each column. Not the position of each column.

    In any case, I think it looks better without Column headers.

    Thanks again,



    ------------------
    -Greg

    Leave a comment:


  • Borje Hagsten
    replied
    Okay, found that keeping it sub-classed and trapping %WM_NCPAINT
    helps a lot. Can still fail to ensure proper redraw in some cases,
    but mostly works pretty well. Have changed code above too.
    Code:
    CALLBACK FUNCTION LvSubClass
      SELECT CASE CBMSG
         CASE %WM_NCPAINT 'something triggered repaint, allow it to happen
            pbStep = 0
     
         CASE %WM_ERASEBKGND
            IF pbStep THEN   'prevent repaints during progress
               FUNCTION = 1 : EXIT FUNCTION
     
            ELSE             'but sometimes need to ignore and repaint..
               pbStep = 1
            END IF
     
      END SELECT
      FUNCTION = CallWindowProc(OldLvProc, CBHNDL, CBMSG, CBWPARAM, CBLPARAM)
    END FUNCTION

    ------------------

    Leave a comment:


  • Borje Hagsten
    replied
    Hm, added a cw3 variable for third column and after that has been taken
    care of, can do something like:
    Code:
      'COLUMN.. the rest..
      GetClientRect hListView, rc
      rc.nLeft  = cw1 + cw2 + cw3 'add up column widths and see if we have something left to paint
      IF rc.nLeft < rc.nRight THEN FillRect @lpdis.hDC, rc, GetSysColorBrush(%COLOR_WINDOW)
    Have only used ownerdrawn listview once before, in code where I wanted
    columns in different colors, so fumbling in the dark here. Normally, not
    necessary to sub-class and handle WM_ERASEBKGND, but this is a bit special.
    Okay, if process is slow and fast screen update, guess one can live with
    slight flicker and skip sub-class. Definitely better for total repaint..

    Real neat implementation is by also adding %LVS_OWNERDATA style to LV.
    Then, virtual, ownerdrawn listview - must keep items in global array,
    but advantage is one can add a million items to list instantly. See if
    I can extract a sample from other huge code here later on today.

    Nor sure about THREAD CLOSE there. Never had to work with the THREAD
    commands, so don't know if it's correct way to do it.

    ------------------
    Forgot, need to add "DECR rc.nTop" after text is drawn in second column,
    otherwise it will cause "lines" in last columns.


    [This message has been edited by Borje Hagsten (edited October 20, 2001).]

    Leave a comment:


  • Gregery D Engle
    replied
    Borje,

    You are so good! I don't mind the flickering, I tested with
    over 800 threads and it works good. I modified it so Column 3
    validated correctly.

    Do you know how to make it validate correctly for the rest of the ListView
    control after Column 3?

    Thanks


    ------------------
    -Greg

    [This message has been edited by Gregery D Engle (edited October 20, 2001).]

    Leave a comment:


  • Lance Edmonds
    replied
    Cute Jules!

    Unfortunately, preventing the WM_ERASEBKGND stops the flicker, but if the window becomes invalidated (ie, moved partially off the edge of the screen and back, then it does not get repainted...

    Think of it as something for you to work on over the weekend!

    ------------------
    Lance
    PowerBASIC Support
    mailto:[email protected][email protected]</A>

    Leave a comment:


  • Borje Hagsten
    replied
    Think best approach is by using an ownerdrawn ListView, like shown in Edwin's
    code and then paint all in WM_DRAWITEM. Did a quick test here and it looks good,
    but another problem arises - flicker. To remove flicker, one can sub-class the
    ListView and return TRUE in its WM_ERASEBKGND. Then all is well, drawing is smooth
    and sticks to screen since WM_DRAWITEM handles repaint - but now rest of control
    may end up not being repainted properly. Kind a like a Catch22 situation here.
    Don't use the listview much myself, so don't know how to solve it in prefect way.

    BTW, should be a THREAD CLOSE after THREAD CREATE there, and menu must be
    created before using GetClientRect, because client gets changed by menu.
    Test following, and also test by removing sub-class (rem out in WM_CREATE).
    Sub-classed, it looks good, but if covered by another dialog, repaint in
    whole listview isn't ok. Maybe you can find a good middle way..
    Code:
    ' Click in ListView to add items and see action..
    #Compile Exe
    #include "win32api.inc"
    #include "commctrl.inc"
    #Resource "c:\pbdll60\samples\tray\tray.pbr"
    GLOBAL pbStep AS LONG, OldLvProc AS LONG
    GLOBAL hListView AS LONG
     
    %LISTVIEW1 = 100
    %MNU_LOAD_DOWNLOADLIST = 500
    %MNU_OPTIONS = 501
    %MNU_EXIT = 502
    %WM_PRINT = &H317
     
    TYPE UrlStruct
      sURL AS STRING * 512
      nProgress AS LONG
      nSize AS LONG
    END TYPE
    GLOBAL gURL() AS UrlStruct
     
    '------------------------------------------------------------------------------
    Sub LV_AddItem(hListView&, sTitle$, lMask&, lStateMask&, lPos&)
      Local azItemText As Asciiz * %MAX_PATH
      Local lvITEM As LV_ITEM
      azItemText = sTitle$
      lvITEM.iImage = 0
      lvITEM.iItem = ListView_GetItemCount(hListView)
      lvITEM.mask = %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM
      lvITEM.stateMask =  lStateMask&
      lvITEM.pszText = VarPtr(azItemText)
      lStatus& = ListView_InsertItem (hListView, lvITEM)
    End Sub
    '------------------------------------------------------------------------------
    Sub LV_CreateColumn(hListView&, sTitle$, lMask&, lWidth&, lPos&)
      Local azTitle As Asciiz * 25
      Local Column As LV_COLUMN
     
      azTitle = sTitle$
      Column.mask = lMask&
      Column.fmt = %LVCFMT_LEFT
      Column.cx = lWidth&
      Column.pszText = VarPtr(azTitle)
      ListView_InsertColumn hListView, lPos&, Column
    End Sub
    '------------------------------------------------------------------------------
    Function LVW_GetSelected(hListView&) As Long
      ListCount& = ListView_GetItemCount(hListView)
      For a& = 0 To ListCount&
          r& = ListView_GetItemState(hListView,a&,%LVIS_FOCUSED)
          If r& = %LVIS_FOCUSED Then
              Function = a&
              Exit Function
          End If
      Next
     End Function
    '------------------------------------------------------------------------------
    FUNCTION GetURL(BYVAL x AS LONG) AS LONG
      LOCAL I AS LONG, zTxt AS ASCIIZ * 20
      sText$ = TRIM$(gURL(x).sURL) & " " & FORMAT$(x)
      LV_AddItem hListView, BYCOPY sText$, %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
     
      pbStep = 1
      FOR I = 1 TO 100
         zTxt = FORMAT$(I)
         ListView_SetItemText hListView, x, 1, zTxt
         SLEEP 20
      NEXT
      'pbStep = 0   ' ?
    END FUNCTION
    '------------------------------------------------------------------------------
    SUB AddURL(URL$)
      STATIC qID&
      gURL(qID&).sURL = URL$
      THREAD CREATE GetUrl(qID&) TO woot&
      THREAD CLOSE woot& TO woot&
      INCR qID&
    END SUB
    '------------------------------------------------------------------------------
    Function WndProc (ByVal hWnd As Long, ByVal wMsg As Long, _
                      ByVal wParam As Long, ByVal lParam As Long) Export As Long
      Local rect As rect, zTxt AS ASCIIZ * 260
      Local LV_LpLvNm As NM_LISTVIEW Ptr
     
      Select Case wMsg
         Case %WM_NOTIFY
            Select Case LoWrd(wParam)
               Case %LISTVIEW1
                  LV_LPLVNM = lParam
                  Select Case @LV_LPLVNM.HDR.CODE
                     Case %NM_CLICK
                        AddURL "Yoga!"
     
                     Case %NM_RCLICK
                        'debug_print "Right Mouse"
                     Case %LVN_COLUMNCLICK
                        'debug_print "Column Click"
                  End Select
            End Select
     
         Case %WM_CREATE 'Note: must create menu before using GetClientRect..
            Menu New Bar To hMenu0&
            Menu New Popup To hMenu1&
            Menu Add Popup, hMenu0& ,"&File", hMenu1&, %MF_ENABLED
            Menu Add String, hMenu1&, "&Load Download List",  %MNU_LOAD_DOWNLOADLIST, %MF_ENABLED
            Menu Add String, hMenu1&, "-",  0, %MF_ENABLED
            Menu Add String, hMenu1&, "Options",  %MNU_OPTIONS, %MF_ENABLED
            Menu Add String, hMenu1&, "E&xit",  %MNU_EXIT, %MF_ENABLED
            Menu Attach hMenu0&, hWnd
     
            GETCLIENTRECT hWnd, rect
            hListView = CREATEWINDOW ( "SysListView32", _
                        "", _
                        %WS_border Or %WS_Child Or %WS_visible Or _
                        %LVS_Report Or %LVS_SINGLESEL Or %LVS_SHOWSELALWAYS Or %LVS_OWNERDRAWFIXED, _
                        0, _
                        0, _
                        rect.nRight - 1, _
                        rect.nBottom - 1, _
                        hWnd, _
                        %LISTVIEW1, _
                        GETMODULEHANDLE(ByVal 0&), _
                        %Null )
            OldLvProc = SetWindowLong(hListView, %GWL_WNDPROC, CODEPTR(LvSubClass))
     
            LV_CreateColumn hListView, "Downloading", %LVCF_FMT Or %LVCF_WIDTH Or %LVCF_TEXT Or %LVCF_SUBITEM, 300, 0
            LV_CreateColumn hListView, "Progress", %LVCF_FMT Or %LVCF_WIDTH Or %LVCF_TEXT Or %LVCF_SUBITEM, 200, 1
            LV_CreateColumn hListView, "Size", %LVCF_FMT Or %LVCF_WIDTH Or %LVCF_TEXT Or %LVCF_SUBITEM, 100, 2
           '================================================
     
         Case %WM_DRAWITEM
            IF wParam = %LISTVIEW1 THEN
               LOCAL cw1 AS LONG, cw2 AS LONG, cw3 AS LONG, tw AS LONG, rc AS RECT
               LOCAL lpdis AS DRAWITEMSTRUCT PTR
     
               lpdis = lParam
     
               SELECT CASE @lpdis.itemAction
                  CASE %ODA_DRAWENTIRE, %ODA_SELECT
                     'GET COORDINATES
                     GetClientRect hListView, rc
                     tw = rc.nRight                                                  'total width
                     ListView_GetItemRect hListView, @lpdis.itemID, rc, %LVIR_BOUNDS 'for item height
                     cw1 = ListView_GetColumnWidth(hListView, 0)                     'width, column 1
                     cw2 = ListView_GetColumnWidth(hListView, 1)                     'width, column 2
                     cw3 = ListView_GetColumnWidth(hListView, 2)                     'width, column 3
                     rc.nLeft = 0 : rc.nRight = cw1                                  'first column rect
     
                     'CLEAR BACKGROUND
                     IF (@lpdis.itemState AND %ODS_SELECTED) THEN
                        FillRect @lpdis.hDC, rc, GetSysColorBrush(%COLOR_HIGHLIGHT)
                        SetBkColor @lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHT)
                        SetTextColor @lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHTTEXT)
                     ELSE
                        FillRect @lpdis.hDC, rc, GetSysColorBrush(%COLOR_WINDOW)
                        SetBkColor @lpdis.hDC, GetSysColor(%COLOR_WINDOW)
                        SetTextColor @lpdis.hDC, GetSysColor(%COLOR_WINDOWTEXT)
                     END IF
     
                     'COLUMN 1
                     zTxt = ""
                     CALL ListView_GetItemText(hListView, @lpdis.itemID, 0, zTxt, SIZEOF(zTxt))
                     rc.nLeft = 2 'don't want text far out in corner
                     DrawText @lpdis.hDC, zTxt, LEN(zTxt), rc, %DT_LEFT OR %DT_SINGLELINE OR %DT_VCENTER
     
                     'DRAW FOCUSRECT ON FIRST COLUMN (if control has focus)
                     IF (@lpdis.itemState AND %ODS_SELECTED) AND GetFocus = hListView THEN 'if selected + focus
                        rc.nLeft = 0
                        CALL DrawFocusRect(@lpdis.hDC, rc) 'draw focus rectangle
                     END IF
     
                     'COLUMN 2 - PROGRESSBAR
                     zTxt = ""
                     CALL ListView_GetItemText(hListView, @lpdis.itemID, 1, zTxt, SIZEOF(zTxt))
                     IF VAL(zTxt) > 0 THEN 
                        rc.nLeft  = cw1
                        rc.nRight = cw1 + cw2 * VAL(zTxt) / 100
                        FillRect @lpdis.hDC, rc, GetSysColorBrush(%COLOR_3DFACE)
                        DrawEdge @lpdis.hDC, rc, %BDR_RAISEDINNER, %BF_RECT
     
                        rc.nLeft  = rc.nRight
                        rc.nRight = cw1 + cw2
                        FillRect @lpdis.hDC, rc, GetSysColorBrush(%COLOR_WINDOW)
     
                        rc.nLeft = cw1
                        SetBkMode @lpdis.hDC, %TRANSPARENT
                        SetTextColor @lpdis.hDC, %BLUE
                        zTxt = zTxt + "%"
                        INCR rc.nTop
                        DrawText @lpdis.hDC, zTxt, LEN(zTxt), rc, %DT_CENTER OR %DT_SINGLELINE OR %DT_VCENTER
                        DECR rc.nTop
                     END IF
     
                     'COLUMN 3
                     zTxt = ""
                     CALL ListView_GetItemText(hListView, @lpdis.itemID, 2, zTxt, SIZEOF(zTxt))
                     rc.nLeft  = rc.nRight
                     rc.nRight = cw1 + cw2 + cw3
                     FillRect @lpdis.hDC, rc, GetSysColorBrush(%COLOR_WINDOW)
                     IF LEN(zTxt) THEN
                        DrawText @lpdis.hDC, zTxt, LEN(zTxt), rc, %DT_LEFT OR %DT_SINGLELINE OR %DT_VCENTER
                     END IF
     
                     'COLUMN.. the rest..
                     rc.nLeft  = rc.nRight
                     rc.nRight = tw
                     IF rc.nLeft < rc.nRight THEN FillRect @lpdis.hDC, rc, GetSysColorBrush(%COLOR_WINDOW)
     
     
                     'DRAW FOCUSRECT AROUND SELECTED ITEM (if control has focus) (moved up for test..)
                     'IF (@lpdis.itemState AND %ODS_SELECTED) AND GetFocus = hListView THEN 'if selected + focus
                     '   CALL DrawFocusRect(@lpdis.hDC, @lpdis.rcItem) 'draw focus rectangle
                     'END IF
                     FUNCTION = %TRUE : EXIT FUNCTION
     
               END SELECT
            END IF
     
         Case %WM_DESTROY
            IF OldLvProc THEN SETWINDOWLONG hListView, %GWL_WNDPROC, OldLvProc
            POSTQUITMESSAGE 0
     
      End Select
     
      Function = DEFWINDOWPROC(hWnd, wMsg, wParam, lParam)
    End Function
    '------------------------------------------------------------------------------
    Function WinMain (ByVal hInstance     As Long, _
                      ByVal hPrevInstance As Long, _
                      lpCmdLine           As Asciiz Ptr, _
                      ByVal iCmdShow      As Long) As Long
     
      Local Msg         As tagMsg
      Local wndclass    As WndClassEx
      Local szClassName As Asciiz * 80
      Local hWnd        As Long
      Local CC1 As INIT_COMMON_CONTROLSEX
      REDIM gURL(10000) AS UrlStruct
     
      CC1.dwSize=SizeOf(CC1)
      CC1.dwICC=%ICC_WIN95_CLASSES
      INITCOMMONCONTROLSEX CC1
     
      szClassName            = "SDK_LISTVIEW"
      wndclass.cbSize        = SizeOf(WndClass)
      wndclass.style         = %CS_HREDRAW Or %CS_VREDRAW
      wndclass.lpfnWndProc   = CodePtr( WndProc )
      wndclass.cbClsExtra    = 0
      wndclass.cbWndExtra    = 0
      wndclass.hInstance     = hInstance
      wndclass.hIcon         = LOADICON( hInstance, "FACE1")
      wndclass.hCursor       = LOADCURSOR( %NULL, ByVal %IDC_ARROW )
      wndclass.hbrBackground = GETSTOCKOBJECT( %GRAY_BRUSH )
      wndclass.lpszMenuName  = %NULL
      wndclass.lpszClassName = VarPtr( szClassName )
      wndclass.hIconSm       = 0
      REGISTERCLASSEX wndclass
      hWnd = CREATEWINDOWEX(%WS_EX_TOPMOST, _
                            szClassName, _
                            "WebGet 1.0", _
                            %DS_CENTER _
                            Or %WS_CAPTION  _
                            Or %WS_SYSMENU , _
                            0, _
                            0, _
                            700&, _
                            300&, _
                            %NULL, _
                            %NULL, _
                            hInstance, _
                            ByVal %NULL)
     
      SHOWWINDOW hWnd, iCmdShow
      UPDATEWINDOW hWnd
     
      While IsTrue GETMESSAGE(Msg, %NULL, 0, 0)
         TRANSLATEMESSAGE msg
         DISPATCHMESSAGE msg
      Wend
      Sleep 1
      Function = msg.wParam
     
    End Function
    '------------------------------------------------------------------------------
    CALLBACK FUNCTION LvSubClass
      SELECT CASE CBMSG
         CASE %WM_NCPAINT 'something triggered repaint, allow it to happen
            pbStep = 0
     
         CASE %WM_ERASEBKGND
            IF pbStep THEN   'prevent repaints during progress
               FUNCTION = 1 : EXIT FUNCTION
     
            ELSE             'but sometimes need to ignore and repaint..
               pbStep = 1
            END IF
     
      END SELECT
      FUNCTION = CallWindowProc(OldLvProc, CBHNDL, CBMSG, CBWPARAM, CBLPARAM)
    END FUNCTION
    ------------------
    Moved pbStep (controls WM_ERASEBKGND in sub-class procedure) to GetURL..
    Added later: in LvSubClass, added trap in %WM_NCPAINT for enforced
    repaint if control is covered and needs to be redrawn. Also corrected
    some code in WM_DRAWITEM.




    [This message has been edited by Borje Hagsten (edited October 20, 2001).]

    Leave a comment:


  • Gregery D Engle
    replied
    I got it to stop writing outside the control boundries by doing
    this in DrawProgress:

    IF lPos& < ListView_GetTopIndex(hListView&) THEN EXIT SUB
    IF lPos& > ListView_GetTopIndex(hListView&) + ListView_GetCountPerPage(hListView&) THEN EXIT SUB

    It does however update very slowly after scrolling. Any tips to fix that?

    ------------------
    -Greg

    [This message has been edited by Gregery D Engle (edited October 19, 2001).]

    Leave a comment:


  • Gregery D Engle
    replied
    I tried forcing a repaint of the window, and it doesn't seem to
    work correctly. This is the modified code I used. If you click
    about 15 times on the listview and you scroll up and down you
    will see it starting to paint in the Column Header section.

    Maybe if I only invalidate the Column Header section it will
    work. I will try that.

    Anybody have any other suggestions?

    Code:
    FUNCTION GetURL(BYVAL x AS LONG) AS LONG
        LOCAL I AS LONG
        sText$ = TRIM$(gURL(x).sURL) & " " & FORMAT$(x)
        LV_AddItem hListView&, BYCOPY sText$, %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
        FOR I = 1 TO 100
            DrawProgress hListView&, I, x
            
            SLEEP 1000
            CALL CtrlRedraw(hListView&, 1)
        NEXT
    END FUNCTION
    
    SUB AddURL(URL$)
      STATIC qID&
      gURL(qID&).sURL = URL$
      THREAD CREATE GetUrl(qID&) TO woot&
      INCR qID&
    END SUB
    
    FUNCTION CtrlRedraw( BYVAL hWnd AS LONG, BYVAL rDraw AS LONG) AS LONG
      CALL SendMessage(hWnd, %WM_SETREDRAW, rDraw, 0)
    
      IF rDraw THEN
        InvalidateRect hWnd, BYVAL %NULL, 0
        UpdateWindow hWnd
      END IF
    END FUNCTION
    ------------------
    -Greg

    Leave a comment:


  • Gregery D Engle
    replied
    This is a modified version of Borje's code.

    When you run it, and click on the listview, it will add an
    entry and create a thread that will scroll the progressbar.

    The problem is that when you add about 15 or 16 and you scroll up
    and down, it doesn't repaint correctly. It repaints very slowly.

    Code:
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Eliminate unnecessary macros for COMMCTRL.INC
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    %NOANIMATE       = 1
    %NOBUTTON        = 1
    %NOCOMBO         = 1
    %NODATETIMEPICK  = 1
    %NODRAGLIST      = 1
    %NOEDIT          = 1
    %NOFLATSBAPIS    = 1
    %NOHEADER        = 1
    %NOHOTKEY        = 1
    %NOIMAGELIST     = 1
    %NOIPADDRESS     = 1
    %NOLIST          = 1
    '%NOLISTVIEW      = 1
    %NOMONTHCAL      = 1
    %NONATIVEFONTCTL = 1
    %NOPAGESCROLLER  = 1
    %NOPROGRESS      = 1
    %NOREBAR         = 1
    %NOSTATUSBAR     = 1
    %NOTABCONTROL    = 1
    %NOTOOLBAR       = 1
    %NOTOOLTIPS      = 1
    %NOTRACKBAR      = 1
    %NOTREEVIEW      = 1
    %NOUPDOWN        = 1
    '------------------------------------------------------------------------------
    #COMPILE EXE
    #INCLUDE "WIN32API.INC"
    #INCLUDE "COMMCTRL.INC"
    #RESOURCE "c:\pbdll60\samples\tray\tray.pbr"
    '------------------------------------------------------------------------------
    %LISTVIEW1 = 100
    %MNU_LOAD_DOWNLOADLIST = 500
    %MNU_OPTIONS = 501
    %MNU_EXIT = 502
    GLOBAL hListView&
    '------------------------------------------------------------------------------
    TYPE UrlStruct
         sURL AS STRING * 512
         nProgress AS LONG
         nSize AS LONG
    END TYPE
    
    DECLARE SUB DrawProgress(hListView&, Percentage&, lPos&)
    GLOBAL gURL() AS UrlStruct
    
    
    SUB LV_AddItem(hListView&, sTitle$, lMask&, lStateMask&, lPos&)
      LOCAL azItemText AS ASCIIZ * %MAX_PATH
      LOCAL lvITEM AS LV_ITEM
       azItemText = sTitle$
       lvITEM.iImage = 0
       lvITEM.iItem = ListView_GetItemCount(hListView&)
       lvITEM.mask = %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM
       lvITEM.stateMask =  lStateMask&
       lvITEM.pszText = VARPTR(azItemText)
       lStatus& = ListView_InsertItem (hListView&, lvITEM)
    END SUB
    
    SUB LV_CreateColumn(hListView&, sTitle$, lMask&, lWidth&, lPos&)
      LOCAL azTitle AS ASCIIZ * 25
      LOCAL Column AS LV_COLUMN
      azTitle = sTitle$
      Column.mask = lMask&
      Column.fmt = %LVCFMT_LEFT
      Column.cx = lWidth&
      Column.pszText = VARPTR(azTitle)
      ListView_InsertColumn hListView&, lPos&, Column
    END SUB
    
    FUNCTION LVW_GetSelected(hListView&) AS LONG
      ListCount& = ListView_GetItemCount(hListView&)
      FOR a& = 0 TO ListCount&
          r& = ListView_GetItemState(hListView&,a&,%LVIS_FOCUSED)
          IF r& = %LVIS_FOCUSED THEN
             FUNCTION = a&
             EXIT FUNCTION
          END IF
      NEXT
    END FUNCTION
    
    '------------------------------------------------------------------------------
    
    FUNCTION GetURL(BYVAL x AS LONG) AS LONG
        LOCAL I AS LONG
        sText$ = TRIM$(gURL(x).sURL) & " " & FORMAT$(x)
        LV_AddItem hListView&, BYCOPY sText$, %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
        FOR I = 1 TO 100
            DrawProgress hListView&, I, x
            SLEEP 1000
        NEXT
    END FUNCTION
    
    SUB AddURL(URL$)
      STATIC qID&
      gURL(qID&).sURL = URL$
      THREAD CREATE GetUrl(qID&) TO woot&
      INCR qID&
    END SUB
    
    
    SUB DrawProgress(hListView&, Percentage&, lPos&)
      LOCAL cw1 AS LONG, cw2 AS LONG, tmpRect AS RECT, zTxt AS ASCIIZ * 20
      LOCAL hDcLV AS LONG
    
      hDcLv = GetDC(hListView&)
        'lPos& = LVW_GetSelected(hListView&)
        ListView_GetItemRect hListView&, lPos&, tmpRect, %LVIR_BOUNDS 'for column height
        cw1 = ListView_GetColumnWidth(hListView&, 0) 'width of column 1
        cw2 = ListView_GetColumnWidth(hListView&, 1) 'width of column 2
    
        tmpRect.nLeft  = cw1
        tmpRect.nRight = cw1 + cw2 * Percentage& / 100
        FillRect hDcLv, tmpRect, GetSysColorBrush(%COLOR_3DFACE)
    
        tmpRect.nLeft  = tmpRect.nRight
        tmpRect.nRight = cw1 + cw2
        FillRect hDcLv, tmpRect, GetSysColorBrush(%COLOR_WINDOW)
    
        tmpRect.nLeft = cw1
        SetBkMode hDcLv, %TRANSPARENT
        SetTextColor hDcLv, %BLUE
        zTxt = FORMAT$(Percentage&) + "%"
        DrawText hDcLv, zTxt, LEN(zTxt), tmpRect, %DT_CENTER OR %DT_SINGLELINE OR %DT_VCENTER
      ReleaseDc hListView&, hDcLv
    END SUB
    
    FUNCTION WndProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _
                      BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG
      LOCAL rect AS rect
      LOCAL LV_LpLvNm AS NM_LISTVIEW PTR
      'STATIC hListView&
    
      SELECT CASE wMsg
          CASE %WM_NOTIFY
               SELECT CASE LOWRD(wParam)
                   CASE %LISTVIEW1
                      LV_LPLVNM = lParam
                      SELECT CASE @LV_LPLVNM.HDR.CODE
                          CASE %NM_CLICK
                            AddURL "Yoga!"
                          CASE %NM_RCLICK
                              'debug_print "Right Mouse"
                          CASE %LVN_COLUMNCLICK
                              'debug_print "Column Click"
                      END SELECT
               END SELECT
    
          CASE %WM_CREATE
              GETCLIENTRECT hWnd, rect
    
              hListView& = CREATEWINDOW ( "SysListView32", _
                          "", _
                          %WS_border OR %WS_Child OR %WS_visible OR _
                          %LVS_Report OR %LVS_SINGLESEL OR %LVS_SHOWSELALWAYS, _
                          0, _
                          0, _
                          rect.nRight - 1, _
                          rect.nBottom - 50, _
                          hWnd, _
                          %LISTVIEW1, _
                          GETMODULEHANDLE(BYVAL 0&), _
                          %Null )
    
              LV_CreateColumn hListView&, "Downloading", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 300, 0
              LV_CreateColumn hListView&, "Progress", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 200, 1
              LV_CreateColumn hListView&, "Size", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 100, 2
             
             ' LV_AddItem hListView&, "File1", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
             ' LV_AddItem hListView&, "File1", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
             ' LV_AddItem hListView&, "File2", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
             ' LV_AddItem hListView&, "File3", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
             ' LV_AddItem hListView&, "File4", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
             ' LV_AddItem hListView&, "File5", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
             ' LV_AddItem hListView&, "File6", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
             ' LV_AddItem hListView&, "File7", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              MENU NEW BAR TO hMenu0&
              MENU NEW POPUP TO hMenu1&
              MENU ADD POPUP, hMenu0& ,"&File", hMenu1&, %MF_ENABLED
              MENU ADD STRING, hMenu1&, "&Load Download List",  %MNU_LOAD_DOWNLOADLIST, %MF_ENABLED
              MENU ADD STRING, hMenu1&, "-",  0, %MF_ENABLED
              MENU ADD STRING, hMenu1&, "Options",  %MNU_OPTIONS, %MF_ENABLED
              MENU ADD STRING, hMenu1&, "E&xit",  %MNU_EXIT, %MF_ENABLED
              MENU ATTACH hMenu0&, hWnd
    
          CASE %WM_DESTROY
              POSTQUITMESSAGE 0
    
      END SELECT
      FUNCTION = DEFWINDOWPROC(hWnd, wMsg, wParam, lParam)
    END FUNCTION
    
    FUNCTION WINMAIN (BYVAL hInstance     AS LONG, _
                      BYVAL hPrevInstance AS LONG, _
                      lpCmdLine           AS ASCIIZ PTR, _
                      BYVAL iCmdShow      AS LONG) AS LONG
      LOCAL Msg         AS tagMsg
      LOCAL wndclass    AS WndClassEx
      LOCAL szClassName AS ASCIIZ * 80
      LOCAL hWnd        AS LONG
      LOCAL CC1 AS INIT_COMMON_CONTROLSEX
      REDIM gURL(0 TO 10000) AS UrlStruct
    
      CC1.dwSize=SIZEOF(CC1)
      CC1.dwICC=%ICC_WIN95_CLASSES
      INITCOMMONCONTROLSEX CC1
    
      szClassName            = "SDK_LISTVIEW"
      wndclass.cbSize        = SIZEOF(WndClass)
      wndclass.style         = %CS_HREDRAW OR %CS_VREDRAW
      wndclass.lpfnWndProc   = CODEPTR( WndProc )
      wndclass.cbClsExtra    = 0
      wndclass.cbWndExtra    = 0
      wndclass.hInstance     = hInstance
      wndclass.hIcon         = LOADICON( hInstance, "FACE1")
      wndclass.hCursor       = LOADCURSOR( %NULL, BYVAL %IDC_ARROW )
      wndclass.hbrBackground = GETSTOCKOBJECT( %GRAY_BRUSH )
      wndclass.lpszMenuName  = %NULL
      wndclass.lpszClassName = VARPTR( szClassName )
      wndclass.hIconSm       = 0
      REGISTERCLASSEX wndclass
      hWnd = CREATEWINDOWEX(%WS_EX_TOPMOST, _
                             szClassName, _
                             "WebGet 1.0", _
                             %DS_CENTER _
                             OR %WS_CAPTION  _
                             OR %WS_SYSMENU , _
                             0, _
                             0, _
                             700&, _
                             300&, _
                             %NULL, _
                             %NULL, _
                             hInstance, _
                             BYVAL %NULL)
    
      SHOWWINDOW hWnd, iCmdShow
      UPDATEWINDOW hWnd
    
      WHILE ISTRUE GETMESSAGE(Msg, %NULL, 0, 0)
         TRANSLATEMESSAGE msg
         DISPATCHMESSAGE msg
      WEND
      SLEEP 1
    
      FUNCTION = msg.wParam
    END FUNCTION
    ------------------
    -Greg

    Leave a comment:


  • Edwin Knoppert
    replied
    Darn, someone is before me!

    I rewrote it a little to get you started.
    You should use the wm_drawitem (ownerdraw style)

    See the progressbar in your left side, incorrect of course but you'll notice my point..


    Code:
    #Compile Exe
    #include "win32api.inc"
    #include "commctrl.inc"
    #Resource "c:\pbdll60\samples\tray\tray.pbr"
     
     
    %LISTVIEW1 = 100
    %PROGRESSBAR1 = 101
    %MNU_LOAD_DOWNLOADLIST = 500
    %MNU_OPTIONS = 501
    %MNU_EXIT = 502
     
    %WM_PRINT = &H317
     
     
    Sub LV_AddItem(hListView&, sTitle$, lMask&, lStateMask&, lPos&)
       Local azItemText As Asciiz * %MAX_PATH
       Local lvITEM As LV_ITEM
       azItemText = sTitle$
       lvITEM.iImage = 0
       lvITEM.iItem = ListView_GetItemCount(hListView&)
       lvITEM.mask = %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM
       lvITEM.stateMask =  lStateMask&
       lvITEM.pszText = VarPtr(azItemText)
       lStatus& = ListView_InsertItem (hListView&, lvITEM)
    End Sub
     
    Sub LV_CreateColumn(hListView&, sTitle$, lMask&, lWidth&, lPos&)
        Local azTitle As Asciiz * 25
        Local Column As LV_COLUMN
     
        azTitle = sTitle$
        Column.mask = lMask&
        Column.fmt = %LVCFMT_LEFT
        Column.cx = lWidth&
        Column.pszText = VarPtr(azTitle)
        ListView_InsertColumn hListView&, lPos&, Column
    End Sub
     
    Function LVW_GetSelected(hListView&) As Long
        ListCount& = ListView_GetItemCount(hListView&)
        For a& = 0 To ListCount&
            r& = ListView_GetItemState(hListView&,a&,%LVIS_FOCUSED)
            If r& = %LVIS_FOCUSED Then
                Function = a&
                Exit Function
            End If
        Next
    End Function
     
    Sub DrawProgress( hListView& , hProgressBar&, Percentage&, x&, y&, xx&, yy&, style&)
     
        Local tmpRect As RECT
        Local pt As POINTAPI
     
        tmpRect.nLeft = 0
        lPos& = LVW_GetSelected(hListView&)
     
        woot& = SendMessage(hListView&, %LVM_GETITEMRECT, lPos&, VarPtr(tmpRect))
     
        Dim hMemDC As Long
     
     
    '    BitBlt GetDC(hListView&), 0, tmpRect.nTop + 1, 2, tmpRect.nBottom - tmpRect.nTop, hBitMap, 0, 0, %SRCCOPY
     
     
     
    End Sub
     
    Function WndProc (ByVal hWnd As Long, ByVal wMsg As Long, _
                      ByVal wParam As Long, ByVal lParam As Long) Export As Long
        Local rect As rect
        Local LV_LpLvNm As NM_LISTVIEW Ptr
        Static hListView&
        Static hProgressBar&
     
        Select Case wMsg
            Case %WM_NOTIFY
                 Select Case LoWrd(wParam)
                     Case %LISTVIEW1
                        LV_LPLVNM = lParam
                        Select Case @LV_LPLVNM.HDR.CODE
                            Case %NM_CLICK
                                 DrawProgress hListView&, hProgressBar&, 0, 0, 0, 0, 0, 0
                            Case %NM_RCLICK
                                'debug_print "Right Mouse"
                            Case %LVN_COLUMNCLICK
                                'debug_print "Column Click"
                        End Select
                 End Select
            Case %WM_CREATE
                GETCLIENTRECT hWnd, rect
     
                hProgressBar& = CREATEWINDOW ( "msctls_progress32", _
                            "", _
                            %WS_CHILD, _
                            200, _
                            300, _
                            100, _
                            10, _
                            hWnd, _
                            %PROGRESSBAR1, _
                            GETMODULEHANDLE(ByVal 0&), _
                            %Null )
                sendmessage hListView&, %PBM_SETPOS, 75, 0
     
     
                hListView& = CREATEWINDOW ( "SysListView32", _
                            "", _
                            %WS_border Or %WS_Child Or %WS_visible Or _
                            %LVS_Report Or %LVS_SINGLESEL Or %LVS_SHOWSELALWAYS Or %LVS_OWNERDRAWFIXED, _
                            0, _
                            0, _
                            rect.nRight - 1, _
                            rect.nBottom - 1, _
                            hWnd, _
                            %LISTVIEW1, _
                            GETMODULEHANDLE(ByVal 0&), _
                            %Null )
     
     
                LV_CreateColumn hListView&, "Downloading", %LVCF_FMT Or %LVCF_WIDTH Or %LVCF_TEXT Or %LVCF_SUBITEM, 300, 0
                LV_CreateColumn hListView&, "Progress", %LVCF_FMT Or %LVCF_WIDTH Or %LVCF_TEXT Or %LVCF_SUBITEM, 200, 1
                LV_CreateColumn hListView&, "Size", %LVCF_FMT Or %LVCF_WIDTH Or %LVCF_TEXT Or %LVCF_SUBITEM, 100, 2
     
                LV_AddItem hListView&, "File1", %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File1", %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File2", %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File3", %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File4", %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File5", %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File6", %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File7", %LVCF_FMT Or %LVCF_WIDTH Or  %LVCF_TEXT Or %LVCF_SUBITEM, %LVIS_FOCUSED, 0
     
                Menu New Bar To hMenu0&
                Menu New Popup To hMenu1&
                Menu Add Popup, hMenu0& ,"&File", hMenu1&, %MF_ENABLED
                Menu Add String, hMenu1&, "&Load Download List",  %MNU_LOAD_DOWNLOADLIST, %MF_ENABLED
                Menu Add String, hMenu1&, "-",  0, %MF_ENABLED
                Menu Add String, hMenu1&, "Options",  %MNU_OPTIONS, %MF_ENABLED
                Menu Add String, hMenu1&, "E&xit",  %MNU_EXIT, %MF_ENABLED
                Menu Attach hMenu0&, hWnd
     
     
    '================================================
     
     
     
            Case %WM_DRAWITEM
     
     
        Dim hDC As Long
        Dim hBitmapDC As Long
        Dim hBitMap As Long
        Dim hOldBitMap As Long
         Dim pDIS As DRAWITEMSTRUCT Ptr
     pDIS =lParam
     
        hDC = GetDC( %HWND_DESKTOP )
        hBitmapDC = CreateCompatibleDC( hDC )
        hBitMap = CreateCompatibleBitmap( hDC, 100, 100 )
     
        hOldBitMap  = SelectObject( hBitMapDC, hBitMap )
     
        SendMessage hProgressBar&, %WM_PRINT, hBitMapDC, %PRF_CLIENT Or %PRF_ERASEBKGND Or %PRF_NONCLIENT
     
     
        BitBlt @pDIS.hDC _
            , @pDIS.rcItem.nLeft, @pDIS.rcItem.nTop, @pDIS.rcItem.nRight - @pDIS.rcItem.nLeft, @pDIS.rcItem.nBottom - @pDIS.rcItem.nTop _
            , hBitMapDC _
            , 0, 0 _
            , %SRCCOPY
     
        SelectObject hBitMapDC, hOldBitmap
        DeleteObject hBitmap
        DeleteDC hBitMapDC
     
     
        ReleaseDC %HWND_DESKTOP, hDC
     
     
     
            Case %WM_DESTROY
                POSTQUITMESSAGE 0
        End Select
     
    Function = DEFWINDOWPROC(hWnd, wMsg, wParam, lParam)
    End Function
     
    Function WinMain (ByVal hInstance     As Long, _
                      ByVal hPrevInstance As Long, _
                      lpCmdLine           As Asciiz Ptr, _
                      ByVal iCmdShow      As Long) As Long
     
      Local Msg         As tagMsg
      Local wndclass    As WndClassEx
      Local szClassName As Asciiz * 80
      Local hWnd        As Long
      Local CC1 As INIT_COMMON_CONTROLSEX
     
      CC1.dwSize=SizeOf(CC1)
      CC1.dwICC=%ICC_WIN95_CLASSES
      INITCOMMONCONTROLSEX CC1
     
      szClassName            = "SDK_LISTVIEW"
      wndclass.cbSize        = SizeOf(WndClass)
      wndclass.style         = %CS_HREDRAW Or %CS_VREDRAW
      wndclass.lpfnWndProc   = CodePtr( WndProc )
      wndclass.cbClsExtra    = 0
      wndclass.cbWndExtra    = 0
      wndclass.hInstance     = hInstance
      wndclass.hIcon         = LOADICON( hInstance, "FACE1")
      wndclass.hCursor       = LOADCURSOR( %NULL, ByVal %IDC_ARROW )
      wndclass.hbrBackground = GETSTOCKOBJECT( %GRAY_BRUSH )
      wndclass.lpszMenuName  = %NULL
      wndclass.lpszClassName = VarPtr( szClassName )
      wndclass.hIconSm       = 0
      REGISTERCLASSEX wndclass
      hWnd = CREATEWINDOWEX(%WS_EX_TOPMOST, _
                              szClassName, _
                              "WebGet 1.0", _
                              %DS_CENTER _
                              Or %WS_CAPTION  _
                              Or %WS_SYSMENU , _
                              0, _
                              0, _
                              700&, _
                              300&, _
                              %NULL, _
                              %NULL, _
                              hInstance, _
                              ByVal %NULL)
     
      SHOWWINDOW hWnd, iCmdShow
      UPDATEWINDOW hWnd
     
        While IsTrue GETMESSAGE(Msg, %NULL, 0, 0)
            TRANSLATEMESSAGE msg
            DISPATCHMESSAGE msg
        Wend
        Sleep 1
      Function = msg.wParam
     
    End Function
    ------------------
    http://www.hellobasic.com

    Leave a comment:


  • Borje Hagsten
    replied
    Several things: DC must be released - and why use Pogressbar at all?
    Rewrote it a bit - no progbar, all is drawn "by hand" in DrawProgress.
    Can be done prettier - Semen has posted some fine samples of this, with
    different colors on text, etc, but at least it shows a way that works.

    Note - painting does not "stick" if dialog is covered. Better to
    sub-class the listview and make sure DrawProgress is triggered in
    its WM_ERASEBKGND, to make it "stick" properly in all situations.
    Code:
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Eliminate unnecessary macros for COMMCTRL.INC
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    %NOANIMATE       = 1
    %NOBUTTON        = 1
    %NOCOMBO         = 1
    %NODATETIMEPICK  = 1
    %NODRAGLIST      = 1
    %NOEDIT          = 1
    %NOFLATSBAPIS    = 1
    %NOHEADER        = 1
    %NOHOTKEY        = 1
    %NOIMAGELIST     = 1
    %NOIPADDRESS     = 1
    %NOLIST          = 1
    '%NOLISTVIEW      = 1
    %NOMONTHCAL      = 1
    %NONATIVEFONTCTL = 1
    %NOPAGESCROLLER  = 1
    %NOPROGRESS      = 1
    %NOREBAR         = 1
    %NOSTATUSBAR     = 1
    %NOTABCONTROL    = 1
    %NOTOOLBAR       = 1
    %NOTOOLTIPS      = 1
    %NOTRACKBAR      = 1
    %NOTREEVIEW      = 1
    %NOUPDOWN        = 1
    '------------------------------------------------------------------------------
    #COMPILE EXE
    #INCLUDE "WIN32API.INC"
    #INCLUDE "COMMCTRL.INC"
    #RESOURCE "c:\pbdll60\samples\tray\tray.pbr"
    '------------------------------------------------------------------------------
    %LISTVIEW1 = 100
    %MNU_LOAD_DOWNLOADLIST = 500
    %MNU_OPTIONS = 501
    %MNU_EXIT = 502
    '------------------------------------------------------------------------------
     
    SUB LV_AddItem(hListView&, sTitle$, lMask&, lStateMask&, lPos&)
      LOCAL azItemText AS ASCIIZ * %MAX_PATH
      LOCAL lvITEM AS LV_ITEM
       azItemText = sTitle$
       lvITEM.iImage = 0
       lvITEM.iItem = ListView_GetItemCount(hListView&)
       lvITEM.mask = %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM
       lvITEM.stateMask =  lStateMask&
       lvITEM.pszText = VARPTR(azItemText)
       lStatus& = ListView_InsertItem (hListView&, lvITEM)
    END SUB
     
    SUB LV_CreateColumn(hListView&, sTitle$, lMask&, lWidth&, lPos&)
      LOCAL azTitle AS ASCIIZ * 25
      LOCAL Column AS LV_COLUMN
      azTitle = sTitle$
      Column.mask = lMask&
      Column.fmt = %LVCFMT_LEFT
      Column.cx = lWidth&
      Column.pszText = VARPTR(azTitle)
      ListView_InsertColumn hListView&, lPos&, Column
    END SUB
     
    FUNCTION LVW_GetSelected(hListView&) AS LONG
      ListCount& = ListView_GetItemCount(hListView&)
      FOR a& = 0 TO ListCount&
          r& = ListView_GetItemState(hListView&,a&,%LVIS_FOCUSED)
          IF r& = %LVIS_FOCUSED THEN
             FUNCTION = a&
             EXIT FUNCTION
          END IF
      NEXT
    END FUNCTION
     
    SUB DrawProgress(hListView&, Percentage&)
      LOCAL cw1 AS LONG, cw2 AS LONG, tmpRect AS RECT, zTxt AS ASCIIZ * 20
      LOCAL hDcLV AS LONG
     
      hDcLv = GetDC(hListView&)
        lPos& = LVW_GetSelected(hListView&)
        ListView_GetItemRect hListView&, lPos&, tmpRect, %LVIR_BOUNDS 'for column height
        cw1 = ListView_GetColumnWidth(hListView&, 0) 'width of column 1
        cw2 = ListView_GetColumnWidth(hListView&, 1) 'width of column 2
     
        tmpRect.nLeft  = cw1
        tmpRect.nRight = cw1 + cw2 * Percentage& / 100
        FillRect hDcLv, tmpRect, GetSysColorBrush(%COLOR_3DFACE)
     
        tmpRect.nLeft  = tmpRect.nRight
        tmpRect.nRight = cw1 + cw2
        FillRect hDcLv, tmpRect, GetSysColorBrush(%COLOR_WINDOW)
     
        tmpRect.nLeft = cw1
        SetBkMode hDcLv, %TRANSPARENT
        SetTextColor hDcLv, %BLUE
        zTxt = FORMAT$(Percentage&) + "%"
        DrawText hDcLv, zTxt, LEN(zTxt), tmpRect, %DT_CENTER OR %DT_SINGLELINE OR %DT_VCENTER
      ReleaseDc hListView&, hDcLv
    END SUB
     
    FUNCTION WndProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _
                      BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG
      LOCAL rect AS rect
      LOCAL LV_LpLvNm AS NM_LISTVIEW PTR
      STATIC hListView&
     
      SELECT CASE wMsg
          CASE %WM_NOTIFY
               SELECT CASE LOWRD(wParam)
                   CASE %LISTVIEW1
                      LV_LPLVNM = lParam
                      SELECT CASE @LV_LPLVNM.HDR.CODE
                          CASE %NM_CLICK
                             STATIC I AS LONG
                             FOR I = 1 TO 100
                                DrawProgress hListView&, I
                                SLEEP 20
                             NEXT
                             beep
     
                          CASE %NM_RCLICK
                              'debug_print "Right Mouse"
                          CASE %LVN_COLUMNCLICK
                              'debug_print "Column Click"
                      END SELECT
               END SELECT
     
          CASE %WM_CREATE
              GETCLIENTRECT hWnd, rect
     
              hListView& = CREATEWINDOW ( "SysListView32", _
                          "", _
                          %WS_border OR %WS_Child OR %WS_visible OR _
                          %LVS_Report OR %LVS_SINGLESEL OR %LVS_SHOWSELALWAYS, _
                          0, _
                          0, _
                          rect.nRight - 1, _
                          rect.nBottom - 1, _
                          hWnd, _
                          %LISTVIEW1, _
                          GETMODULEHANDLE(BYVAL 0&), _
                          %Null )
     
              LV_CreateColumn hListView&, "Downloading", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 300, 0
              LV_CreateColumn hListView&, "Progress", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 200, 1
              LV_CreateColumn hListView&, "Size", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 100, 2
              LV_AddItem hListView&, "File1", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              LV_AddItem hListView&, "File1", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              LV_AddItem hListView&, "File2", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              LV_AddItem hListView&, "File3", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              LV_AddItem hListView&, "File4", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              LV_AddItem hListView&, "File5", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              LV_AddItem hListView&, "File6", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              LV_AddItem hListView&, "File7", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
              MENU NEW BAR TO hMenu0&
              MENU NEW POPUP TO hMenu1&
              MENU ADD POPUP, hMenu0& ,"&File", hMenu1&, %MF_ENABLED
              MENU ADD STRING, hMenu1&, "&Load Download List",  %MNU_LOAD_DOWNLOADLIST, %MF_ENABLED
              MENU ADD STRING, hMenu1&, "-",  0, %MF_ENABLED
              MENU ADD STRING, hMenu1&, "Options",  %MNU_OPTIONS, %MF_ENABLED
              MENU ADD STRING, hMenu1&, "E&xit",  %MNU_EXIT, %MF_ENABLED
              MENU ATTACH hMenu0&, hWnd
     
          CASE %WM_DESTROY
              POSTQUITMESSAGE 0
     
      END SELECT
      FUNCTION = DEFWINDOWPROC(hWnd, wMsg, wParam, lParam)
    END FUNCTION
     
    FUNCTION WINMAIN (BYVAL hInstance     AS LONG, _
                      BYVAL hPrevInstance AS LONG, _
                      lpCmdLine           AS ASCIIZ PTR, _
                      BYVAL iCmdShow      AS LONG) AS LONG
      LOCAL Msg         AS tagMsg
      LOCAL wndclass    AS WndClassEx
      LOCAL szClassName AS ASCIIZ * 80
      LOCAL hWnd        AS LONG
      LOCAL CC1 AS INIT_COMMON_CONTROLSEX
     
      CC1.dwSize=SIZEOF(CC1)
      CC1.dwICC=%ICC_WIN95_CLASSES
      INITCOMMONCONTROLSEX CC1
     
      szClassName            = "SDK_LISTVIEW"
      wndclass.cbSize        = SIZEOF(WndClass)
      wndclass.style         = %CS_HREDRAW OR %CS_VREDRAW
      wndclass.lpfnWndProc   = CODEPTR( WndProc )
      wndclass.cbClsExtra    = 0
      wndclass.cbWndExtra    = 0
      wndclass.hInstance     = hInstance
      wndclass.hIcon         = LOADICON( hInstance, "FACE1")
      wndclass.hCursor       = LOADCURSOR( %NULL, BYVAL %IDC_ARROW )
      wndclass.hbrBackground = GETSTOCKOBJECT( %GRAY_BRUSH )
      wndclass.lpszMenuName  = %NULL
      wndclass.lpszClassName = VARPTR( szClassName )
      wndclass.hIconSm       = 0
      REGISTERCLASSEX wndclass
      hWnd = CREATEWINDOWEX(%WS_EX_TOPMOST, _
                             szClassName, _
                             "WebGet 1.0", _
                             %DS_CENTER _
                             OR %WS_CAPTION  _
                             OR %WS_SYSMENU , _
                             0, _
                             0, _
                             700&, _
                             300&, _
                             %NULL, _
                             %NULL, _
                             hInstance, _
                             BYVAL %NULL)
     
      SHOWWINDOW hWnd, iCmdShow
      UPDATEWINDOW hWnd
     
      WHILE ISTRUE GETMESSAGE(Msg, %NULL, 0, 0)
         TRANSLATEMESSAGE msg
         DISPATCHMESSAGE msg
      WEND
      SLEEP 1
     
      FUNCTION = msg.wParam
    END FUNCTION
    ------------------
    Corrected path to resource file, plus removed garbage from DrawProgess.
    See Edwin posted another way. Always fun to see all ways one can use..


    [This message has been edited by Borje Hagsten (edited October 19, 2001).]

    Leave a comment:


  • Gregery D Engle
    replied
    I'm stuck here.

    I thought about what Edwin was saying and I think what I need to
    do is BltBlt the DC of the ProgressBar to the DC of the ListView
    control, at the cordinates of the Second Column. Am I right?

    In any case, I can't get the picture to show up at all. Do I have
    to use %WM_PRINT?

    here is what I have so far

    Code:
    #COMPILE EXE
    #INCLUDE "win32api.inc"
    #INCLUDE "commctrl.inc"
    #RESOURCE "c:\pbdll60\samples\tray\tray.pbr"
    
    %LISTVIEW1 = 100
    %PROGRESSBAR1 = 101
    %MNU_LOAD_DOWNLOADLIST = 500
    %MNU_OPTIONS = 501
    %MNU_EXIT = 502
    
    
    SUB LV_AddItem(hListView&, sTitle$, lMask&, lStateMask&, lPos&)
       LOCAL azItemText AS ASCIIZ * %MAX_PATH
       LOCAL lvITEM AS LV_ITEM
       azItemText = sTitle$
       lvITEM.iImage = 0
       lvITEM.iItem = ListView_GetItemCount(hListView&)
       lvITEM.mask = %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM
       lvITEM.stateMask =  lStateMask&
       lvITEM.pszText = VARPTR(azItemText)
       lStatus& = ListView_InsertItem (hListView&, lvITEM)
    END SUB
    
    SUB LV_CreateColumn(hListView&, sTitle$, lMask&, lWidth&, lPos&)
        LOCAL azTitle AS ASCIIZ * 25
        LOCAL Column AS LV_COLUMN
    
        azTitle = sTitle$
        Column.mask = lMask&
        Column.fmt = %LVCFMT_LEFT
        Column.cx = lWidth&
        Column.pszText = VARPTR(azTitle)
        ListView_InsertColumn hListView&, lPos&, Column
    END SUB
    
    FUNCTION LVW_GetSelected(hListView&) AS LONG
        ListCount& = ListView_GetItemCount(hListView&)
        FOR a& = 0 TO ListCount&
            r& = ListView_GetItemState(hListView&,a&,%LVIS_FOCUSED)
            IF r& = %LVIS_FOCUSED THEN
                FUNCTION = a&
                EXIT FUNCTION
            END IF
        NEXT
    END FUNCTION
    
    SUB DrawProgress(hListView&,hProgressBar&, Percentage&, x&, y&, xx&, yy&, style&)
        LOCAL tmpRect AS RECT
        LOCAL pt AS POINTAPI
    
        tmpRect.nLeft = 0
        lPos& = LVW_GetSelected(hListView&)
    
        woot& = SendMessage(hListView&, %LVM_GETITEMRECT, lPos&, VARPTR(tmpRect))
    
        BitBlt GetDC(hListView&), 0, tmpRect.nTop + 1, 2, tmpRect.nBottom - tmpRect.nTop, GetDC(hProgressBar&), 0, 0, %SRCCOPY
    END SUB
    
    FUNCTION WndProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _
                      BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG
        LOCAL rect AS rect
        LOCAL LV_LpLvNm AS NM_LISTVIEW PTR
        STATIC hListView&
        STATIC hProgressBar&
    
        SELECT CASE wMsg
            CASE %WM_NOTIFY
                 SELECT CASE LOWRD(wParam)
                     CASE %LISTVIEW1
                        LV_LPLVNM = lParam
                        SELECT CASE @LV_LPLVNM.HDR.CODE
                            CASE %NM_CLICK
                                 DrawProgress hListView&, hProgressBar&, 0, 0, 0, 0, 0, 0
                            CASE %NM_RCLICK
                                'debug_print "Right Mouse"
                            CASE %LVN_COLUMNCLICK
                                'debug_print "Column Click"
                        END SELECT
                 END SELECT
            CASE %WM_CREATE
                GETCLIENTRECT hWnd, rect
                
                hProgressBar& = CREATEWINDOW ( "msctls_progress32", _
                            "", _
                            %WS_CHILD, _
                            200, _
                            300, _
                            100, _
                            10, _
                            hWnd, _
                            %PROGRESSBAR1, _
                            GETMODULEHANDLE(BYVAL 0&), _
                            %Null )
                sendmessage hListView&, %PBM_SETPOS, 75, 0
                                        
    
                hListView& = CREATEWINDOW ( "SysListView32", _
                            "", _
                            %WS_border OR %WS_Child OR %WS_visible OR _
                            %LVS_Report OR %LVS_SINGLESEL OR %LVS_SHOWSELALWAYS, _
                            0, _
                            0, _
                            rect.nRight - 1, _
                            rect.nBottom - 1, _
                            hWnd, _
                            %LISTVIEW1, _
                            GETMODULEHANDLE(BYVAL 0&), _
                            %Null )
                
                
                LV_CreateColumn hListView&, "Downloading", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 300, 0
                LV_CreateColumn hListView&, "Progress", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 200, 1
                LV_CreateColumn hListView&, "Size", %LVCF_FMT OR %LVCF_WIDTH OR %LVCF_TEXT OR %LVCF_SUBITEM, 100, 2
    
                LV_AddItem hListView&, "File1", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File1", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File2", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File3", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File4", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File5", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File6", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
                LV_AddItem hListView&, "File7", %LVCF_FMT OR %LVCF_WIDTH OR  %LVCF_TEXT OR %LVCF_SUBITEM, %LVIS_FOCUSED, 0
    
                MENU NEW BAR TO hMenu0&
                MENU NEW POPUP TO hMenu1&
                MENU ADD POPUP, hMenu0& ,"&File", hMenu1&, %MF_ENABLED
                MENU ADD STRING, hMenu1&, "&Load Download List",  %MNU_LOAD_DOWNLOADLIST, %MF_ENABLED
                MENU ADD STRING, hMenu1&, "-",  0, %MF_ENABLED
                MENU ADD STRING, hMenu1&, "Options",  %MNU_OPTIONS, %MF_ENABLED
                MENU ADD STRING, hMenu1&, "E&xit",  %MNU_EXIT, %MF_ENABLED
                MENU ATTACH hMenu0&, hWnd
            CASE %WM_DESTROY
                POSTQUITMESSAGE 0
        END SELECT
    
    FUNCTION = DEFWINDOWPROC(hWnd, wMsg, wParam, lParam)
    END FUNCTION
    
    FUNCTION WINMAIN (BYVAL hInstance     AS LONG, _
                      BYVAL hPrevInstance AS LONG, _
                      lpCmdLine           AS ASCIIZ PTR, _
                      BYVAL iCmdShow      AS LONG) AS LONG
    
      LOCAL Msg         AS tagMsg
      LOCAL wndclass    AS WndClassEx
      LOCAL szClassName AS ASCIIZ * 80
      LOCAL hWnd        AS LONG
      LOCAL CC1 AS INIT_COMMON_CONTROLSEX
    
      CC1.dwSize=SIZEOF(CC1)
      CC1.dwICC=%ICC_WIN95_CLASSES
      INITCOMMONCONTROLSEX CC1
    
      szClassName            = "SDK_LISTVIEW"
      wndclass.cbSize        = SIZEOF(WndClass)
      wndclass.style         = %CS_HREDRAW OR %CS_VREDRAW
      wndclass.lpfnWndProc   = CODEPTR( WndProc )
      wndclass.cbClsExtra    = 0
      wndclass.cbWndExtra    = 0
      wndclass.hInstance     = hInstance
      wndclass.hIcon         = LOADICON( hInstance, "FACE1")
      wndclass.hCursor       = LOADCURSOR( %NULL, BYVAL %IDC_ARROW )
      wndclass.hbrBackground = GETSTOCKOBJECT( %GRAY_BRUSH )
      wndclass.lpszMenuName  = %NULL
      wndclass.lpszClassName = VARPTR( szClassName )
      wndclass.hIconSm       = 0
      REGISTERCLASSEX wndclass
      hWnd = CREATEWINDOWEX(%WS_EX_TOPMOST, _
                              szClassName, _
                              "WebGet 1.0", _
                              %DS_CENTER _
                              OR %WS_CAPTION  _
                              OR %WS_SYSMENU , _
                              0, _
                              0, _
                              700&, _
                              300&, _
                              %NULL, _
                              %NULL, _
                              hInstance, _
                              BYVAL %NULL)
    
      SHOWWINDOW hWnd, iCmdShow
      UPDATEWINDOW hWnd
    
        WHILE ISTRUE GETMESSAGE(Msg, %NULL, 0, 0)
            TRANSLATEMESSAGE msg
            DISPATCHMESSAGE msg
        WEND
        SLEEP 1
      FUNCTION = msg.wParam
    
    END FUNCTION
    ------------------
    -Greg



    [This message has been edited by Gregery D Engle (edited October 19, 2001).]

    Leave a comment:


  • Gregery D Engle
    replied
    Edwin,

    Thanks for the nice offer, I'm sure if I get pointed in the
    right direction I could do it. In anycase, my email address
    is [email protected] if you want to work on this with me.



    ------------------
    -Greg

    Leave a comment:


  • Edwin Knoppert
    replied
    Gregery,

    I would like to build it all for you but... time!

    maybe this weekend?



    ------------------
    http://www.hellobasic.com

    Leave a comment:


  • Gregery D Engle
    replied
    Michael,

    I would love to be able to do your method, but client says Nope.
    has to look like Napster.

    I'm sure if I can figure out how to use Edwin's example like
    this:

    DrawProgress hWnd&, Percentage&, x, y, xx, yy, style&

    I'll be set.

    ------------------
    -Greg

    Leave a comment:


  • Michael Mattias
    replied
    Based on your application description, maybe you could create a dialog something like this:

    Code:
     ---------------------------------------
     Listbox with list of files to process
     File1
     File2
    [b]File3[/b]     <<<< Current file highlited
     ----------------------------------------
    
     Label  "Now Processing File3"
    
     Progressbar "percentage of total files downloaded"
       or 
     Label  "Processing file # 3 of 22 total files"
    
     Progressbar "percentage of current file completed"
    As each file is being worked on, you can SELECT it in the Listbox so it is highlighted; and reset the two progress controls.

    That said, "I freely admit and acknowledge I am reall pretty crummy on user interface design."

    MCM


    Leave a comment:


  • Gregery D Engle
    replied
    Edwin,

    Your code is interesting. How do I specify x,y,xx,yy cordinates?

    I'm thinking of doing sometihng like this:

    DrawProgress hWnd&, Percentage&, x, y, xx, yy, style&

    I assume I could use the hwnd from the Listview instead of the
    dialog. And get location of the column, row and draw it in the
    listview.

    any ideas?

    ------------------
    -Greg

    [This message has been edited by Gregery D Engle (edited October 18, 2001).]

    Leave a comment:


  • Semen Matusovski
    replied
    Main common controls support NM_CUSTOMDRAW since 4.70 (IE 3).
    It's analog of WM_DRAWITEM.


    ------------------
    E-MAIL: [email protected]

    Leave a comment:


  • Edwin Knoppert
    replied
    Here you have an example.
    An example for an ownerdraw lv is prob. to be find here too..

    To PB, %WM_PRINT is not declared..


    Code:
    #Compile Exe
     
    Option Explicit
     
    #include "win32api.inc"
    #include "Commctrl.inc"
     
    '%PRF_CHECKVISIBLE = &H00000001
    '%PRF_NONCLIENT = &H00000002
    '%PRF_CLIENT = &H00000004
    '%PRF_ERASEBKGND = &H00000008
    '%PRF_CHILDREN = &H00000010
    '%PRF_OWNED = &H00000020
    %WM_PRINT = &H317
     
    CallBack Function DlgProc() As Long
     
        Dim a   As Long
        Dim R   As Rect
        Dim PS  As PAINTSTRUCT
        Dim T   As String
     
        Select Case CbMsg
        Case %WM_INITDIALOG
     
            Control Add "msctls_progress32", CbHndl, 100, "", 10, 10, 100, 10, %WS_CHILD' Or %WS_VISIBLE
     
            Control Send CbHndl, 100, %PBM_SETPOS, 50, 0
     
        Case %WM_PAINT
     
            BeginPaint CbHndl, PS
            Control Send CbHndl, 100, %WM_PRINT, PS.hDC, %PRF_CLIENT Or %PRF_ERASEBKGND Or %PRF_NONCLIENT
            EndPaint   CbHndl, PS
            Function = 1
            Exit Function
     
        Case %WM_COMMAND
        Case %WM_SIZE
        Case %WM_SETCURSOR
        Case %WM_DESTROY
        End Select
     
    End Function
     
    Function WinMain ( ByVal hCurInstance  As Long, _
                       ByVal hPrevInstance As Long, _
                       lpszCmdLine         As Asciiz Ptr, _
                       ByVal nCmdShow      As Long ) As Long
     
        Dim a       As Long
        Dim hDlg    As Long
        Dim Result  As Long
     
        Dialog New 0, "What you see is not the progressbar but a painting of it.",,, 240, 180 _
            ,  %WS_OVERLAPPED _
            Or %WS_SYSMENU _
            Or %WS_MINIMIZEBOX _
            Or %WS_MAXIMIZEBOX _
            Or %WS_THICKFRAME _
            Or %WS_CLIPSIBLINGS _
            Or %WS_CLIPCHILDREN _
            To hDlg
     
        If hDlg = 0 Then Exit Function
     
        Dialog Show Modal hDlg Call DlgProc To Result
     
        Function = 1
     
    End Function
    ------------------
    http://www.hellobasic.com

    Leave a comment:

Working...
X