列表框:
列表框的类型和风格
Win32 API 提供了两种类型的列表框:1,单选(默认)2,可多选。在单选列表框中,用户在同一时刻只能选中一项,在多选列表框中,用户可以选中多项。创建多选列表框,要指定LBS_MULTIPLESEL 或 LBS_EXTENDEDSEL风格。
Win32 API提供了另外一些列表框的外观和操作的风格,那些风格包括:是否列表框项目需要排序,是否需要有多列等等。列表框的尺寸和风格通常被定义在应用程序的资源中。
列表框的消息
列表框的消息包含在WM_COMMAND中,LOWORD(wParam)中是列表框标识符,HIWORD(wParam)中是具体消息。有些消息由Windows处理,有些消息要由程序处理,这类消息包括:
LBN_DBLCLK //双击列表框中的某一项
LBN_ERRSPACE //列表框不能分配足够的内存实现一个要求
LBN_KILLFOCUS //列表框失去键盘焦点
LBN_SELCANCEL //取消对某一项的选择
LBN_SELCHANGE //列表框中被选中的某项要被改变
LBN_SETFOCUS //列表框得到键盘焦点
用SendMessage 或 SendDlgItemMessage向列表框发送的消息包括
LB_ADDFILE //用DlgDirList函数将一个文件加入目录列表框中并返回该项索引
LB_ADDSTRING //添加字符串到列表框返回索引
LB_DELETESTRING //从列表框移除一个字符串返回列表框剩余表项
LB_DIR //添加文件名列表,返回最后一个添加的文件名的索引
LB_FINDSTRING //返回第一个与指定字符串匹配的索引
LB_FINDSTRINGEXACT //返回具有某一指定前缀的索引
LB_GETANCHORINDEX //返回鼠标最后选中的项的索引
LB_GETCARETINDEX //返回具有矩形焦点的项的索引
LB_GETCOUNT //返回列表框中项的个数
LB_GETCURSEL //返回当前被选中项的索引
LB_GETHORIZONTALEXTENT //返回列表框的可滚动的宽度(单位:象素)
LB_GETITEMDATA //返回和给定项相关联的32位值
LB_GETITEMHEIGHT //返回列表框中某一项的高度(单位:象素)
LB_GETITEMRECT //获得列表项的客户区的RECT
LB_GETLOCALE //获得区域信息,高位国家代码,低位语言标识符
LB_GETSEL //返回列表项选中状态
LB_GETSELCOUNT //返回被选中列表项的数目
LB_GETSELITEMS //创建一个被选中项的索引数组,返回被选中项个数
LB_GETTEXT //获得和给定项相关联的字符串和串长度
LB_GETTEXTLEN //返回和给定项相关联的字符串长度(单位:字符)
LB_GETTOPINDEX //返回列表框中第一个可见项的索引
LB_INITSTORAGE //为指定项数和相关字符串分配内存
LB_INSERTSTRING //在列表框中指定位置插入字符串
LB_ITEMFROMPOINT //获得与指定点最近的项的索引
LB_RESETCONTENT //从列表框中移除所有项
LB_SELECTSTRING //选择与给定前缀相匹配的第一个字符串
LB_SELITEMRANGE //选择给定范围内的表项
LB_SETANCHORINDEX //设置鼠标最后选中的表项成指定表项
LB_SETCARETINDEX //设置矩形焦点到指定表项
LB_SETCOLUMNWIDTH //设置列的宽度(单位:象素)
LB_SETCOUNT //设置表项数目
LB_SETCURSEL //选择被给定的列表项
LB_SETHORIZONTALEXTENT //设置列表框的滚动宽度(单位:象素)
LB_SETITEMHIEGHT //设置表项高度(单位:项素)
LB_SETLOCALE //设置区域,返回当前区域
LB_SETSEL //在多选列表框中选中一个表项
LB_SETTOPINDEX //滚动列表使指定的项能显示出来
创建一个简单的列表框:
下面列子演示在对话框中创建列表框,用运动员姓名填写列表项,当运动员名被选中时,相应的信息显示在对话框中。
列表框的风格LBS_STANDARD,是LBS_SORT,LBS_NOTIFY,WS_VSCROLL,WS_BORDER风格的组合。当对话框接到WM_INITDIALOG消息时处理初始化列表框,为了把每个名字显示在列表框中,发送LB_ADDSTRING给列表框。
#define BUFFER MAX_PATH
#define NAMELENGTH 15
#define POSITIONLENGTH 20
#define TEAMSIZE 15
typedef struct
{
TCHAR tchName[NAMELENGTH];
TCHAR tchPosition[POSITIONLENGTH];
int nGamesPlayed;
int nInningsPlayed;
double xBattingAverage;
TCHAR tchFoodName[NAMELENGTH];
} Player;
Player Roster[] =
{
{"Alan", "Center field", 17, 56, .375, "Cannelloni"},
{"Colin", "Pitcher", 26, 96, .456, "Lefse"},
{"Cindy", "Second base", 13, 58, .207, "Tequila"},
{"Dave", "First base", 28, 138, .508, "Suds"},
{"David", "Center field", 18, 101, .612, "Bok Choy"}
{"Jack", "Pitcher", 27, 110, .542, "Animal Crackers"},
{"Julie", "Right field", 22, 101, .509, "Mashed Potatoes"},
{"Karen", "Second base", 26, 140, .238, "Pez"},
{"Kathie", "Left field", 26, 127, .353, "Baba Ganouj"},
{"Matt", "Shortstop", 24, 112, .579, "Oats"},
{"Miriam", "Right field", 24, 112, .393, "Zotz"},
{"Pete", "Shortstop", 26, 90, .608, "Beet"},
{"Seth", "Center field", 20, 76, .407, "Otter Pop"},
{"Suzanna", "Catcher", 16, 53, .286, "Toast"},
{"Wendy", "Third base", 25, 154, .493, "Ham"},
};
BOOL APIENTRY DlgTeamProc(
HWND hDlg, // 对话框句柄
UINT message, // 消息
UINT wParam, // message-specific information
LONG lParam) // message-specific information
{
TCHAR tchBuffer[BUFFER];
int nItem;
int i;
HWND hwndList;
switch (message)
{
case WM_INITDIALOG:
{
hwndList = GetDlgItem(hDlg, IDL_SOFTBALL);
// 初始化列表框 (用运动员名填写表项).
for (i = 0; i < TEAMSIZE; i++)
{
SendMessage(hwndList, LB_ADDSTRING, 0,
(LPARAM) Roster[i].tchName);
SendMessage(hwndList, LB_SETITEMDATA, i, (LPARAM) i);
}
SetFocus(hwndList);
return FALSE;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDL_SOFTBALL:
switch (HIWORD(wParam))
{
case LBN_SELCHANGE:
// Show the selected player's statistics.
hwndList = GetDlgItem(hDlg, IDL_SOFTBALL);
nItem = SendMessage(hwndList, LB_GETCURSEL,
0, 0);
i = SendMessage(hwndList, LB_GETITEMDATA,
nItem, 0);
SetDlgItemText(hDlg, IDS_POS,
Roster[i].tchPosition);
SetDlgItemText(hDlg, IDS_GAME,
_itoa(Roster[i].nGamesPlayed,
tchBuffer, 10));
SetDlgItemText(hDlg, IDS_INN,
_itoa(Roster[i].nInningsPlayed,
tchBuffer, 10));
SetDlgItemText(hDlg, IDS_BA,
_gcvt(Roster[i].xBattingAverage,
3, tchBuffer));
SetDlgItemText(hDlg, IDS_FOOD,
Roster[i].tchFoodName);
return TRUE;
}
break;
case IDOK:
case IDCANCEL:
// Destroy the dialog box.
EndDialog(hDlg, TRUE);
return TRUE;
default:
return FALSE;
}
default:
return FALSE;
}
}
有任何意见建议,请 email:y_h_zhang@sohu.com