List View Control
The list view control displays a series of data items (list item) in a table form, and the content of each list item may be comprised of one or more sub items. The sub items with the same type of different list items are organized in a column form. The header content of the list view control generally depicts the meaning of the different sub items of the list item. In appearance, the list view control is a rectangle including header and list items. The width of each sub item in the list view control can be adjusted by dragging the header, and the scrolling the control can show the content, which cannot be displayed fully in the list.
For the data including multiple properties, the list view control is a convenient and efficient tool for sorting and displaying such data. For example, the list view control is usually used as a file browser, which can display many file attributes including the file name, type, size, modified date, and so on.
You can create a list view control by calling CreateWindow
function with CTRL_LISTVIEW
as the control class name. The application usually sends messages to a list view control to add, delete, sort, and operate the list items. Similar to other controls, the list view control will generate notification messages when responding to the user operations such as clicking.
Styles of List View Control
In the default state, the window of a list view control only displays the header and the list view items, and has no border around the displaying area. You can add border to the list view control by using WS_BORDER
when creating the list view control with CreateWindow
function. In addition, you can add vertical and horizontal scrollbars using WS_VSCROLL
and WS_HSCROLL
style in order to scroll the content of the list view control.
List view control with LVS_TREEVIEW
style supports displaying list items in tree view mode, in other words, list view control with this style combines the function of normal list view control and tree view control.
LVS_UPNOTIFY
style specifies the responding modes of a list view control when responding to the user mouse click operation. In the default condition, if you does not specify LVS_UPNOTIFY
style, a list view control will send notification messages when the mouse if pressed down; if this style is specified, the control will send notification message when the mouse is released.
Messages of List View Control
Operations on Columns
After a list view control has been created, the next step generally is adding one or more columns successively to this control. Sending LVM_ADDCOLUMN
to the control can complete this:
LVCOLUMN p;
SendMessage (hwndListView, LVM_ADDCOLUMN, 0, (LPARAM)&p) ;
Here, p is a LVCOLUMN
structure, which includes the information related to the newly added column in the list view control. Definition and meaning of each field of LVCOLUMN
are as follow:
typedef struct _LVCOLUMN
{
/* The position of the column to be added */
int nCols;
/* The width of the column */
int width;
/* The title of the column */
char *pszHeadText;
/* The maximum length of the column title */
int nTextMax;
/* The image of the column header */
DWORD image;
/* The comparing function for sorting the columns */
PFNLVCOMPARE pfnCompare;
/* The column flag */
DWORD colFlags;
} LVCOLUMN;
typedef LVCOLUMN *PLVCOLUMN;
LVCOLUMN
structure is used to create or operate on columns of a list view control, and is used together with the messages LVM_ADDCOLUMN
, LVM_GETCOLUMN
, LVM_SETCOLUMN
, and LVM_MODIFYHEAD
.
When used with LVM_ADDCOLUMN
message, it is needed at least to give the value of pszHeadText
of LVCOLUMN
structure, i.e. the column title, and the other items can be set NULL
or 0. At this time, the list view control will adopt the default values for these fields.
The nCols
item is an integer value to indicate which column the newly added column is, and the column index is from 1. If nCols
is 0 or exceeds the range of the column index, the newly added column will be appended as the last column of the list view control. Width is the width of the newly added column. If this value is 0 or not specified, the width of the newly added column will adopt the default value. NTextMax
can be ignored when used for adding columns.
image is the handle of a bitmap or an icon. If this value is specified, the specified image will be displayed on the header of the column. This item does not work at present.
PfnCompare
points to a PFNLVCOMPARE
type function, and this function is the comparing function attached to the newly added column. When the user clicks the title of the column, the list view control will determine the order of each list item according to the comparing function. If the column comparing function is not specified, the list view control will adopt the default string comparing function:
typedef int (*PFNLVCOMPARE) (int nItem1, int nItem2, PLVSORTDATA sortData);
Here nItem1
and nItem2
are integers, and are the indices of the two compared list items. SortData
has no meaning at present and reserved for future. The comparing function determines the comparing result according to the indices of the two list items passed to it. The comparing basis is generally related to the meaning of the column, and the meaning is defined by the application. Other data besides the list item index may be needed for comparison. One commonly used and feasible approach is that setting additional data useful for the comparing function when adding list items, then getting this additional data in the comparing function to handle.
colFlags
is the column flag, and has the following alignment flags at present: LVCF_LEFTALIGN
, LVCF_RIGHTALIGN
, and LVCF_CENTERALIGN
, which means left-aligned, right-aligned, and center-aligned of the column text, respectively.
After a column has been added, you can also set or change the attributes of the column by LVM_SETCOLUMN
message:
LVCOLUMN p;
SendMessage (hwndListView, LVM_SETCOLUMN, 0, (LPARAM)&p);
Here p is also a LVCOLUMN
structure, and the meanings and requirements of each item are the same as parameter p of LVM_ADDCOLUMN
message.
LVM_MODIFYHEAD
message is a simplification of LVM_SETCOLUMN
, and can be used to set the title of a list header:
LVCOLUMN p;
SendMessage (hwndListView, LVM_MODIFYHEAD, 0, (LPARAM)&p) ;
Here p is also a LVCOLUMN
structure, but only the values of nCols
and pszHeadText
are needed to set.
LVM_GETCOLUMN
message is used to get the column attributes of a list view control:
LVCOLUMN p;
int nCols;
SendMessage (hwndListView, LVM_GETCOLUMN, nCols, (LPARAM)&p) ;
Here nCols
is the integer index of the column of which the information is to be gotten, and p is a LVCOLUMN
structure, used to store the gotten attributes.
LVM_GETCOLUMNWIDTH
message is used to get the width of a column:
int width;
int nCols;
width = SendMessage (hwndListView, LVM_GETCOLUMNWIDTH, nCols, 0) ;
Here nCols
is the integer index of the column of which the information is to be gotten, and the return value of SendMessage
function is the width of the column, and is -1 if error occurred.
LVM_GETCOLUMNCOUNT
is used to get the number of columns in a list view control:
int count;
count = SendMessage (hwndListView, LVM_GETCOLUMNCOUNT, 0, 0) ;
The return value of SendMessage
function is the number of columns.
LVM_DELCOLUMN
message is used to delete a column from a list view control:
int nCols;
SendMessage (hwndListView, LVM_DELCOLUMN, nCols, 0) ;
Here nCols
is the index of the column to be deleted.
LVM_SETHEADHEIGHT
is used to set the height of the column header:
int newHeight;
SendMessage (hwndListView, LVM_SETHEADHEIGHT, newHeight, 0) ;
Here newHeight
is the new header height.
Operations on List Item
A list view control is comprised of many list items aligned vertically. Columns to multiple sub items divide each list item, and the list item can include additional data defined by application. The application can add, change, set, delete the list item, and get information of the list item by sending corresponding messages.
After a list view control has been created using CreateWindow
function, the control has no items, and you need add list items to the list view control by LVM_ADDITEM
message:
HLVITEM hItem;
HLVITEM hParent;
LVITEM lvItem;
hItem = SendMessage (hwndListView, LVM_ADDITEM, hParent, (LPARAM)&lvItem) ;
Here hParent
specifies the parent node of newly added list item, if hParent
is 0, this means the node is added to the root node (the topmost layer). If the control is normal list view control, 0 for hParent
is ok.
lvItem
is a LVITEM
structure, and contains the related information of a newly added list item in the list view control. Definition and meanings of fields of LVITEM
are as follow:
typedef struct _LVITEM
{
/**
* The rows of the item
*/
int nItem;
/** Height of the item */
int nItemHeight;
/** Attached additional data of this item */
DWORD itemData;
/**
* State flags of the item, can be OR'ed by the following values:
*
* - LVIF_FOLD\n
* The item is folded.
*
* When adding an item to the listview control, only LVIF_FOLD
* flag is valid.
*/
DWORD dwFlags;
} LVITEM;
Here nItem
is the position value of the newly added list item. If this value is 0 or exceeds the index range, the newly added item will be added in the last of the list view. If wParam
argument of LVM_ADDITEM
message specifies the parent node of the newly added node, nItem
specifies the position of newly added node in the parent node.
The return value of LVM_ADDITEM
message is the handle of the newly added list item, and the handle can be used in other messages to access the item.
The newly added item by LVM_ADDITEM
has no content yet, and you need use LVM_FILLSUBITEM
or LVM_SETSUBITEM
message to set the content of each sub item of the list item.
LVM_GETITEM
message is used to get the information of a list item:
LVITEM lvItem;
HLVITEM hItem;
SendMessage (hwndListView, LVM_GETITEM, hItem, (LPARAM)&lvItem) ;
Here hItem
is the handle of target list type; lvItem
is a structure of LVITEM
type, and this structure is used to save the gotten list item information. If hItem
is 0, nItem
of lvItem
structure should be set as the index value of list item to be gotten.
LVM_GETITEMCOUNT
message is used to get the number of all the items in the list view control:
int count;
count = SendMessage (hwndListView, LVM_GETITEMCOUNT, 0, 0) ;
The return value of SendMessage
function is the number of list items in the list view control.
LVM_GETITEMADDDATA
message is used to get the additional data of a list item:
DWORD addData;
int nItem;
HLVITEM hItem;
addData = SendMessage (hwndListView, LVM_GETITEMADDDATA, nItem, hItem) ;
Here hItem
is the handle of list item to be gotten, if hItem
is zero, nItem
should be used to specify the index value of list item to be gotten. SendMessage
function returns the additional data of list item.
LVM_SETITEMADDDATA
message sets the additional data of a list item:
HLVITEM hItem;
DWORD addData;
SendMessage (hwndListView, LVM_GETITEMADDDATA, hItem, (LPARAM)addData) ;
Here hItem
is the handle of list item to be set; addData
is the additional data, if set successfully, SendMessage
returns LV_OKAY
, else LV_ERR
.
LVM_SETITEMHEIGHT
message can be used to set the height of list items in a list view control. If the height is not set, the height of list items in the list view control will adopt the default value:
HLVITEM hItem;
int newHeight;
SendMessage (hwndListView, LVM_SETITEMHEIGHT, hItem, newHeight) ;
Here hItem
is the handle of the list item to be set; newHeight
is the new height value of the list item. Setting successfully, SendMessage
function will return TRUE
; otherwise return FALSE
.
LVM_DELITEM
message is used to delete an item from the list view control, and LVM_DELALLITEM
message is used to delete all the list items:
HLVITEM hItem;
int nItem;
SendMessage (hwndListView, LVM_DELITEM, nItem, hItem) ;
SendMessage (hwndListView, LVM_DELALLITEM, 0, 0) ;
Here hItem
is the handle of list item to be deleted. It hItem
is 0; nItem
should be used to specify the index value of the list item to be deleted.
Each list item contains one or multiple sub items, and the number of sub items is the same as the number of columns in the list view control. A sub item contains string and bitmap, and can use the messages LVM_SETSUBITEM
, LVM_SETSUBITEMTEXT
, LVM_SETSUBITEMCOLOR
, and LVM_GETSUBITEMTEXT
to get and set the sub item attributes.
LVM_SETSUBITEM
(LVM_FILLSUBITEM
) message is used to set the attributes of a sub item:
LVSUBITEM subItem;
HLVITEM hItem;
SendMessage (hwndListView, LVM_SETSUBITEM, hItem, (LPARAM)&subItem) ;
Here hItem
is the handle of the list item to be set; sub item is a structure of LVSUBITEM
type, in which relevant information required for creating a sub item is included:
typedef struct _LVSUBITEM
{
/* The flags of a subitem */
DWORD flags;
/* The vertical index of a subitem */
int nItem;
/* The horizontal index of a subitem */
int subItem;
/* The text content of a subitem */
char *pszText;
/* The text length of a subitem */
int nTextMax;
/* The text color of a subitem */
int nTextColor;
/* The image of a subitem */
DWORD image;
} LVSUBITEM;
typedef LVSUBITEM *PLVSUBITEM;
Here, flags is the flag value of a sub item, can be LVFLAG_BITMAP
or LVFLAG_ICON
at present. If a bitmap or an icon is to be displayed in the sub item, the corresponding flag should be set, for example, flags |= LVFLAG_BITMAP
.
NItem
and sub item are the vertical index and horizontal index of an item, i.e. the positions of the row and the column, respectively. PszText
is the text content to be displayed in the sub item. NTextMax
is the maximum length of the text of the sub item, and can be ignored when used for LVM_SETSUBITEM
message. When LVSUBITEM
structure is used to get information of a sub item, pszText
points to a buffer storing the text content, and nTextMax
indicates the size of the buffer.
NTextColor
specifies the color of the text in a sub item, and we can also use LVM_SETSUBITEMCOLOR
to set the color of text in a sub item. Image specifies the bitmap or icon to be displayed in a sub item, which works only when flags item is set LVFLAG_BITMAP
or LVFLAG_ICON
.
LVM_GETSUBITEMTEXT
and LVM_SETSUBITEMTEXT
messages are used to get and set the text content of a sub item, respectively; LVM_GETSUBITEMLEN
message is used to get the length of the string in a sub item:
LVSUBITEM subItem;
HLVITEM hItem;
int len;
SendMessage (hwndListView, LVM_GETSUBITEMTEXT, hItem, (LPARAM)&subItem) ;
SendMessage (hwndListView, LVM_SETSUBITEMTEXT, hItem, (LPARAM)&subItem) ;
len = SendMessage (hwndListView, LVM_GETSUBITEMLEN, hItem, (LPARAM)&subItem) ;
Selecting, Displaying, and Searching List Item
LVM_SELECTITEM
message is used to select a list item, and the selected item will be highlighted. It should be noted that, the selected item might not be visible.
int nItem;
HLVITEM hItem;
SendMessage (hwndListView, LVM_SELECTITEM, nItem, hItem) ;
Here hItem
is the handle of list item to be selected; if hItem
is 0, nItem
specifies the index value of list item to be selected.
LVM_GETSELECTEDITEM
message is used to get the current selected list item:
HLVITEM hItemSelected;
hItemSelected = SendMessage (hwndListView, LVM_GETSELECTEDITEM, 0, 0) ;
SendMessage
function returns the handle of a list item in a list view control currently selected. If no item is selected, 0 is returned.
LVM_SHOWITEM
message makes a list item visible in the list view control. Making a list item visible will not make it selected.
HLVITEM hItem;
int nItem;
SendMessage (hwndListView, LVM_SHOWITEM, nItem, hItem) ;
Here hItem
is the handle of the list item to be displayed; if hItem
is 0, nItem
should be used to specify the index value of list item to be displayed. If the item to be displayed is not visible or not totally visible, the item will become the first or last visible item of visible area and is totally visible after sending LVM_SHOWITEM
message.
LVM_CHOOSEITEM
is the combination of LVM_SELECTIEM
and LVM_SHOWITEM
. It makes a list item be selected and visible:
int nItem;
HHLVITEM hItem;
SendMessage (hwndListView, LVM_CHOOSEITEM, nItem, hItem) ;
Here hItem
is the handle of the list item to be selected and displayed; if hItem
is 0, nItem
should be used to specify the index value of the list item to be selected and displayed.
LVM_FINDITEM
message is used to search a certain list item in a list view control. If successful for searching, SendMessage
returns the handle of the found list item.
HLVITEM hFound;
HLVITEM hParent;
LVFINDINFO findInfo;
hFound = SendMessage (hwndListView, LVM_FINDITEM, hParent, (LPARAM)&findInfo) ;
Here hParent
specifies the root node of target node tree to be searched for. FindInfo
is a LVFINDINFO
structure, and contains the information needed for searching:
typedef struct _LVFINDINFO
{
/* The searching flags */
DWORD flags;
/* The starting index for searching */
int iStart;
/* pszInfo field includes how many columns */
int nCols;
/* The text contents of sevearal subitems to be found */
char **pszInfo;
/* The additional data of a list item */
DWORD addData;
/** The found item's row, reserved */
int nItem;
/** The found subitem's column, reserved */
int nSubitem;
} LVFINDINFO;
typedef LVFINDINFO *PLVFINDINFO;
The field flags is the search flag, and can be LVFF_TEXT
and/or LVFF_ADDDATA
, which means to search according to sub item text and (or) additional data of list item. If the root node hParent
specified by wParam
argument of LVM_FINDITEM
message is zero, iStart
is the start index value for searching, and if it is zero then search from the start.
The pointer pszinfo
points to a multiple character strings to be searched for, value of nCols
means text content of the first nCols
column sub item in matching list item should be consistent to the character string in pszInfo
. If searching according to the additional data, addData
field should include the additional data to be searched for.
Comparing and Sorting
After a list view control has added items with LVM_ADDITEM
message, the items are sorted according to their sequence and specified index during being added. When the user clicks the header of a list view control, i.e. the column title, the control will determine the orders of the list items according to the comparing function associated with this column, and sort them. As mentioned earlier, when you use LVM_ADDCOLUMN
message to add a column, you can specify the comparing function of the new column; after this, you can also set a new comparing function by LVM_SETCOLUMN
function.
We can also sort the list items by sending LVM_SORTIEMS
message to the list view control:
SendMessage (hwndListView, LVM_SORTITEMS, 0, (LPARAM)pfnCompare) ;
Here pfnCompare
points to a function with PFNLVCOMPARE
type, and this function is the comparing function to sort list items and should be defined by application.
In addition, we can also make the list view control sort all the sub items according to a certain column by sending LVM_COLSORT
message:
int nCol;
SendMessage (hwndListView, LVM_COLSORT, nCol, 0) ;
Here nCol
is the index of the specified column, and the list view control will compare and sort the sub items according to the comparing function associated with the column.
When the comparing function is not specified, the list view control uses the default string comparing function to sort. The initial string comparing function is strcasecmp
. We can set a user-defined string comparing function by LVM_SETSTRCMPFUNC
message:
SendMessage (hwndListView, LVM_SETSTRCMPFUNC, 0, (LPARAM)pfnStrCmp) ;
Here pfnStrCmp
is a pointer to the function with STRCMP
type:
typedef int (*STRCMP) (const char* s1, const char* s2, size_t n);
This string comparing function compares the first (at most) n characters of the two compared strings s1
and s2
, and returns an integer less than, equal to, or greater than 0 according to the comparing result.
Operation of Tree View Node
We can perform some operations on the tree view node in a list view control with LVS_TREEVIEW
style, including getting the related node and/or fold/unfold a node.
LVM_GETRELATEDITEM
message is used to get the related tree view nodes of a node, such as the parent node, the sibling nodes and its first child node etc:
int related;
HLVITEM hItem;
HLVITEM hRelatedItem;
hRelatedItem = SendMessage (hwndListView, LVM_GETRELATEDITEM, related, hItem) ;
Here related specifies the relationship between the node and the target node, including:
LVIR_PARENT
: Get the parent node.LVIR_FIRSTCHILD
: Get the first child node.LVIR_NEXTSIBLING
: Get the next sibling node.LVIR_PREVSIBLING
: Get the previous sibling node.
hItem
is the handle of target node. LVM_GETRELATEDITEM
message returns the handle to the gotten related node.
LVM_FOLDITEM
message is used to fold or unfold a node item including child nodes:
HLVITEM hItem;
BOOL bFold;
SendMessage (hwndListView, LVM_FOLDITEM, bFold, hItem) ;
If bFold
is TRUE
, the node item is folded, else unfolded it. hItem
is the handle of the node.
Handling of Key Messages
When the user clicks the up or down arrow key, the current selected list item will change, moving forward or backward by one item, and the newly selected item will change to be visible (if it is invisible originally). When the user presses the PageUp
or PageDown
key, the list item will go to the next page, and the range is the same as clicking the scrollbar to the next page, i.e. the last item of the former page becomes the first item of the latter page. If the HOME
key is pressed down, the first list item will be selected and visible; and if the END
key is pressed down, the last item will be selected and visible.
Notification Codes of List View Control
The list view control will generate notification messages when responding to the user operation such as clicking and some state changes, including:
LVN_ITEMRDOWN
: The right mouse button is pressed down on a list view item.LVN_ITEMRUP
: The right mouse button is released on a list view item.LVN_HEADRDOWN
: The right mouse button is pressed down on the list view header.LVN_HEADRUP
: The right mouse button is released up on the list view header.LVN_KEYDOWN
: A key is pressed down.LVN_ITEMDBCLK
: The user double clicked a list item.LVN_ITEMCLK
: The user clicked a list item (reserved).LVN_SELCHANGE
: The current selected item changed.LVN_FOLDED
: The user clicks some list item by mouse to fold it.LVN_UNFOLDED
: The user clicks some list item by mouse to unfold it.
When the right mouse button is pressed down on a list item, the item is selected, and two notification codes LVN_SELCHANGE
and LVN_ITEMRDOWN
are generated.
If the application need to know the notification codes generated by a list view control, it is better to use SetNotificationCallback
function to register a notification callback function.
Sample Program
The program in List 1 illustrates the use of a list view control. Please refer to listview.c
file of the demo program package of this guide for the complete source code.
List 1 Sample program of list view control
#define IDC_LISTVIEW 10
#define IDC_CTRL1 20
#define IDC_CTRL2 30
#define SUB_NUM 3
static char * caption [] =
{
"Name", "Chinese", "Math", "English"
};
#define COL_NR TABLESIZE(caption)
static char *classes [] =
{
"Grade 1", "Grade 2", "Grade 3"
};
typedef struct _SCORE
{
char *name;
int scr[SUB_NUM];
} SCORE;
static SCORE scores[] =
{
{"Tom", {81, 96, 75}},
{"Jack", {98, 62, 84}},
{"Merry", {79, 88, 89}},
{"Bob", {79, 88, 89}},
};
#define SCORE_NUM TABLESIZE(scores)
static GHANDLE add_class_item (HWND hlist, PLVITEM lvItem, GHANDLE classent)
{
LVSUBITEM subdata;
GHANDLE item = SendMessage (hlist, LVM_ADDITEM, classent, (LPARAM)lvItem);
subdata.nItem = lvItem->nItem;
subdata.subItem = 0;
subdata.pszText = classes[lvItem->nItem];;
subdata.nTextColor = 0;
subdata.flags = 0;
subdata.image = 0;
SendMessage (hlist, LVM_SETSUBITEM, item, (LPARAM) & subdata);
return item;
}
static GHANDLE add_score_item (HWND hlist, PLVITEM lvItem, GHANDLE classent)
{
char buff[20];
LVSUBITEM subdata;
GHANDLE item = SendMessage (hlist, LVM_ADDITEM, classent, (LPARAM)lvItem);
int i = lvItem->nItem;
int j;
subdata.flags = 0;
subdata.image = 0;
subdata.nItem = lvItem->nItem;
for (j = 0; j < 4; j ++) {
subdata.subItem = j;
if (j == 0) {
subdata.pszText = scores[i].name;
subdata.nTextColor = 0;
}
else {
sprintf (buff, "%d", scores[i].scr[j-1]);
subdata.pszText = buff;
if (scores[i].scr[j-1] > 90)
subdata.nTextColor = PIXEL_red;
else
subdata.nTextColor = 0;
}
SendMessage (hlist, LVM_SETSUBITEM, item, (LPARAM) & subdata);
}
return item;
}
static int
ScoreProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
HWND hListView;
hListView = GetDlgItem (hDlg, IDC_LISTVIEW);
switch (message)
{
case MSG_INITDIALOG:
{
int i, j;
LVITEM item;
LVCOLUMN lvcol;
GHANDLE hitem;
for (i = 0; i < COL_NR; i++) {
lvcol.nCols = i;
lvcol.pszHeadText = caption[i];
lvcol.width = 120;
lvcol.pfnCompare = NULL;
lvcol.colFlags = 0;
SendMessage (hListView, LVM_ADDCOLUMN, 0, (LPARAM) &lvcol);
}
item.nItemHeight = 25;
SendMessage (hListView, MSG_FREEZECTRL, TRUE, 0);
hitem = 0;
for (i = 0; i < 3; i++) {
item.nItem = i;
hitem = add_class_item (hListView, &item, 0);
for (j = 0; j < SCORE_NUM; j++) {
item.nItem = j;
add_score_item (hListView, &item, hitem);
}
}
SendMessage (hListView, MSG_FREEZECTRL, FALSE, 0);
break;
}
case MSG_COMMAND:
{
int id = LOWORD (wParam);
int i, j;
if (id == IDC_CTRL2) {
float average = 0;
char buff[20];
for (i = 0; i < SCORE_NUM; i++) {
for (j = 0; j < SUB_NUM; j++) {
average += scores[i].scr[j];
}
}
average = average / (SCORE_NUM * SUB_NUM);
sprintf (buff, "%4.1f", average);
SendDlgItemMessage (hDlg, IDC_CTRL1, MSG_SETTEXT, 0, (LPARAM)buff);
}
break;
}
case MSG_CLOSE:
{
EndDialog (hDlg, 0);
break;
}
}
return DefaultDialogProc (hDlg, message, wParam, lParam);
}
static CTRLDATA CtrlScore[] =
{
{
"button",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
80, 260, 80, 20,
IDC_CTRL2,
"Everage score",
0
},
{
"edit",
WS_CHILD | WS_VISIBLE | WS_BORDER,
10, 260, 50, 20,
IDC_CTRL1,
"",
0
},
{
"listview",
WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LVS_TREEVIEW,
10, 10, 320, 220,
IDC_LISTVIEW,
"score table",
0
},
};
static DLGTEMPLATE DlgScore =
{
WS_BORDER | WS_CAPTION,
WS_EX_NONE,
0, 0, 480, 340,
"Getting the average score",
0, 0,
0, NULL,
0
};

Figure 1 Use of list view control
The listview.c program creates a list view control in dialog box for displaying each class scores of students, and you can get the average of total classes of students by clicking the button.
<< Tree View Control | Table of Contents | Month Calendar Control >>
Last updated