• Welcome to Powerbasic Museum 2020-B.
 

News:

Forum in repository mode. No new members allowed.

Main Menu

how to set the background color for ListView

Started by Chris Chancellor, November 03, 2018, 08:31:12 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Chris Chancellor

Hello all

i have tried setting a listview background color but was unsuccessful

i use sendmessage command as in

   '  Shade those unused portions of the main ListView to greenish gray 
          SendMessage(hListView, LVM_SETBKCOLOR, 0,RGB(255,128,64))



the main program listing is

'====================================================================
' Listview example, nested modeless dialog.  modified Nov 2 2018
'====================================================================
$ filename "ListView_64M.exe"
use rtl64
#lookahead

uses dialogs
uses O2Common


'Identifiers
#define IDD_DLG1 2000
#define IDC_LSV1  2001


'  The program logo icon  is obtained from the resource file
'  the 1000 must corespondence to the 1000 in the rc file
   #define IDI_LOGO     1000
   % ICON_BIG=1
   % WM_SETICON=0x80


macro ListView_InsertColumn(hwnd,iCol,pcol) (SendMessage(hwnd, LVM_INSERTCOLUMN, iCol, pcol))
macro ListView_SetColumnWidth(hwnd,iCol,cx) (SendMessage(hwnd, LVM_SETCOLUMNWIDTH, iCol, cx))
macro ListView_InsertItem(hwnd,pitem) (SendMessage(hwnd, LVM_INSERTITEM,0, pitem))
macro ListView_SetItem(hwnd,pitem) (SendMessage(hwnd, LVM_SETITEM,0, pitem))

% DS_CENTER=0x0800
% DS_MODALFRAME=0x80
% SS_CENTERIMAGE=0x200
% LVS_LIST  0x0003
% LVS_REPORT  0x0001
% LVS_EX_GRIDLINES 1
% LVS_EX_CHECKBOXES 4
% LVS_EX_FULLROWSELECT  0x0020

%  LVS_SINGLESEL = 0x0004
%  LVS_EX_DOUBLEBUFFER = 0x0010000

% LVSCW_AUTOSIZE  -1
% LVSCW_AUTOSIZE_USEHEADER  -2
% LVM_INSERTCOLUMN=4123
% LVM_SETCOLUMNWIDTH=4126
% LVM_INSERTITEM=4103
% LVM_SETITEM=4102
% LVCF_FMT 1
% LVCF_WIDTH 2
% LVCF_TEXT=4
% LVCF_SUBITEM 8
% LVCF_ORDER = 20
% LVIF_TEXT=1
% LVM_SETEXTENDEDLISTVIEWSTYLE 0x1036
% LVN_COLUMNCLICK = -108
% LVN_ITEMCHANGED = -101
% LR_LOADFROMFILE=0x0010
% IMAGE_ICON=1
% STM_SETIMAGE=0x172
% SWP_NOZORDER=4

%  LVM_FIRST = 1000
%  LVM_SETBKCOLOR = (LVM_FIRST + 1)

%  CLR_NONE = &HFFFFFFFF&

type LVCOLUMN
  uint  mask
  int   fmt
  int   cx
  char* pszText
  int   cchTextMax
  int   iSubItem
  int   iImage
  int   iOrder
  int   cxMin
  int   cxDefault
  int   cxIdeal 
end type
typedef LVCOLUMN LV_COLUMN

type LVITEM 
  uint   mask
  int    iItem
  int    iSubItem
  uint   state
  uint   stateMask
  char*  pszText
  int    cchTextMax
  int    iImage       // index of the list view item's icon
  sys    lParam       // 32-bit value to associate with item
  int    iIndent
  int    iGroupId
  uint   cColumns
  uint   *puColumns
  int    *piColFmt
  int    iGroup
end type
typedef LVITEM LV_ITEM

' Number of rows in the ListView
   % LVROWS = 200
'  Number of columns in the ListView  meaning 3 +1 = 4 columns
   % LVCOLS = 3         


! GetDlgItem lib "user32.dll" (sys hDlg, int nIDDlgItem) as sys
! IsDialogMessage lib "user32.dll" alias"IsDialogMessageA" (sys hDlg, sys lpMsg) as bool
! IsWindow lib "user32.dll" (sys hWnd) as bool



   '  Handle for the Main Dialog
     sys hDlg

    init_common_controls()





'====================================================================
'   Main callback function
    Function DlgProc( hDlg,uint uMsg, sys wParam, lParam ) as sys callback

    int i , j
    string   txtStr

  '  Handle for the ListView
    sys hListview = GetDlgItem(hDlg, IDC_LSV1) 
   


     LV_COLUMN    lvc
     LV_ITEM        lvi


  select case uMsg

     case WM_INITDIALOG
      ' display the program icon
            sys  hInstance = GetModuleHandle(NULL)
            sys hIcon = LoadIcon(hInstance, IDI_Logo)
           'Set Icon to Main Window
            SendMessage(hDlg, WM_SETICON, ICON_BIG, hIcon)

       
        'Setup the  ListView Column Headers
      '        The  first column must have a wider width to accomodate the checkbox
               lvc.mask =    LVCF_WIDTH  or  LVCF_ORDER
           '    Need to add some blanks behind the header string label
         '    inorder to get a wider column
               txtStr="Column #" & str(1) +  "                      "
              lvc.pszText = txtStr   
              lvc.iorder = 0     
              ListView_InsertColumn(hListview, 0, &lvc)

     '   All the other columns to have a narrower width
        For i = 1  To  LVCOLS 
              lvc.mask = LVCF_FMT OR   LVCF_WIDTH   OR  LVCF_TEXT  OR LVCF_SUBITEM
            If  i =  LVCOLS then
                   '   Leave the last column header blank as we are NOT putting data
                  '   into this last column
                      txtStr = ""
            Else
                  txtStr="Column #" & str(i+1)
                  txtStr =  Trim(txtStr)
           End if
               lvc.pszText = txtStr   
               lvc.iorder = i 
                ListView_InsertColumn(hListview, i, &lvc)
        Next i


        ' Setup the Listview  data Rows
        For i=1 To LVROWS
              'First column
              lvi.mask      =  LVIF_TEXT
              txtStr = "Row #" & str(200-i+1) ", Col # 1"
             lvi.pszText   = txtStr
             lvi.iSubItem  =  0
             ListView_InsertItem(hListview, &lvi)

           'Remaining columns
           for j=2 to LVCOLS
                 txtStr = "Row #" & str(200-i+1) ", Col # " & str(j)
                lvi.pszText   = txtStr
                lvi.iSubItem  =  j-1
                ListView_SetItem(hListview, &lvi)
           next j
        Next i

   '   Set the column widths according to width of  each column header
       for i = 0 to LVCOLS
              ListView_SetColumnWidth(hListview,i,LVSCW_AUTOSIZE_USEHEADER)
        next i

 
  '    Place in the extended style for the listview
        SendMessage(hListview, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, 
                       LVS_EX_FULLROWSELECT or LVS_EX_CHECKBOXES or LVS_EX_GRIDLINES )

    '  Shade those unused portions of the main ListView to greenish gray 
          SendMessage(hListView, LVM_SETBKCOLOR, 0,RGB(255,128,64))
     



    case WM_COMMAND

           select case loword(wParam)
                   case IDCANCEL   
         '            exit   
                     DestroyWindow( hDlg )
              end select

    case WM_NOTIFY
              NMHDR pnm at lParam
       
                if pnm.hwndFrom = hListview then
                           'ListView         
                         select case pnm.code
                         case LVN_COLUMNCLICK
                                    mbox "LVN_COLUMNCLICK"   
                       
                            case LVN_ITEMCHANGED
                 end select
       end if
 

      case WM_SIZE     
               RECT rcClient
         // Calculate remaining height and size edit
              GetClientRect(hDlg, &rcClient)
              SetWindowPos(hListview, NULL, 0, rcClient.top, rcClient.right, rcClient.bottom, SWP_NOZORDER)





    case WM_CLOSE
              DestroyWindow( hDlg )

    case WM_DESTROY
              PostQuitMessage( null )

  end select

  return 0
end function



'====================================================================
'  Display the Main Dialog
Function  DispMainDialog

         sys lpdt
         MSG wMsg

         dyn::init(lpdt)
   
       Dialog( 1, 10,10,380,250, "Listview example 64bits ", lpdt,
                                   WS_OVERLAPPEDWINDOW or DS_CENTER or WS_VISIBLE,
                                    8,"MS Sans Serif" )

    '   Add in the listview
        CONTROL "",IDC_LSV1,"SysListView32", _
           WS_VISIBLE   or  WS_TABSTOP or  WS_BORDER  or   LVS_REPORT  or  LVS_SINGLESEL or  LVS_EX_DOUBLEBUFFER , _
                             10,10,233,100,   WS_EX_CLIENTEDGE
     
          ' WS_CHILDWINDOW  or

        hDlg = CreateModelessDialog( 0, @DlgProc, 0, lpdt )

     



       while GetMessage( @wMsg, null, 0, 0 ) <> 0
              if IsDialogMessage( hDlg,  @wMsg ) = 0 then
                            TranslateMessage( @wMsg )
                            DispatchMessage( @wMsg )
               end if
          wend
End Function



'------------------------------------
'  Start of program
   DispMainDialog








and that of O2common.inc  is as below


' O2common.inc
' These are the commonly use functions and macros
' Updated :  Nov 3 2018

uses Corewin

' Background color for main window
int  MainWindBGColor

' Trim function
def Trim ltrim(rtrim(%1))


'=============================== 
' for displaying the RGB colors
Function RGB(sys red,green,blue) as sys
  sys color
  color = red
  color = color + green*256
  color = color + blue*65536
  Return color
End Function



'========================================
' draws with color gradient
SUB DrawGradient (BYVAL hDC AS DWORD)
   LOCAL rectFill AS RECT, rectClient AS RECT, fStep AS SINGLE
   local hBrush AS DWORD, lOnBand AS LONG
   GetClientRect WindowFromDC(hDC), rectClient
   fStep = rectClient.bottom / 75

   FOR lOnBand = 0 TO 50 ' 199
      SetRect rectFill, 0, lOnBand * fStep, rectClient.right + 1, (lOnBand + 1) * fStep
      ' paint the background -- change the first 2 colors R and G
      ' to vary the color gradient

    Select case MainWindBGColor
      Case 1
      ' this gives a light yellow background
       hBrush = CreateSolidBrush(rgb(255, 255, 205 - lOnBand))
      Case 2
     ' this gives a cyan background
       hBrush = CreateSolidBrush(rgb(0, 248, 255 - lOnBand))
      Case 3
      ' this gives a light green background
        hBrush = CreateSolidBrush(rgb(155, 250, 147 - lOnBand))
    End Select

      Fillrect hDC, rectFill, hBrush
      DeleteObject hBrush
   NEXT

END SUB


Chris Chancellor

thanxx in advance of your help

maybe a simple solution this?

Chris Chancellor

Never mind i finally got it out