|
参考:
1.http://msdn.microsoft.com/zh-cn/library/system.windows.forms.listbox.aspx
2.http://msdn.microsoft.com/zh-cn/library/61sk9hfb.aspx
Windows 窗体 ListBox 控件显示一个项列表,用户可从中选择一项或多项。如果项总数超出可以显示的项数,则自动向 ListBox 控件添加滚动条。当 MultiColumn 属性设置为 true 时,列表框以多列形式显示项,并且会出现一个水平滚动条。当 MultiColumn 属性设置为 false 时,列表框以单列形式显示项,并且会出现一个垂直滚动条。当 ScrollAlwaysVisible 设置为 true 时,无论项数多少都将显示滚动条。SelectionMode 属性确定一次可以选择多少列表项。
SelectedIndex 属性返回对应于列表框中第一个选定项的整数值。通过在代码中更改 SelectedIndex 值,可以编程方式更改选定项;列表中的相应项将在 Windows 窗体上突出显示。如果未选定项,则 SelectedIndex 值为 -1。如果选定列表中的第一个项,则 SelectedIndex 值为 0。当选定多个项时,SelectedIndex 值反映在列表中第一个出现的选定项。SelectedItem 属性类似于 SelectedIndex,但它返回项本身,通常是字符串值。Count 属性反映列表的项数,由于 SelectedIndex 是从零开始的,所以 Count 属性的值通常比 SelectedIndex 的最大可能值大一。
若要在 ListBox 控件中添加或删除项,请使用 Add、Insert、Clear 或 Remove 方法。或者,可以在设计时使用 Items 属性向列表添加项。
列表框的消息
列表框的消息包含在WM_COMMAND中,LOWORD(wParam)中是列表框标识符,HIWORD(wParam)中是具体消息。有些消息由Windows处理,有些消息要由程序处理,这类消息包括:
LBN_DBLCLK //双击列表框中的某一项 (0x203/*_WM_LBUTTONDBLCLK*/)
LBN_ERRSPACE //列表框不能分配足够的内存实现一个要求
LBN_KILLFOCUS //列表框失去键盘焦点
LBN_SELCANCEL //取消对某一项的选择
LBN_SELCHANGE //列表框中被选中的某项要被改变
LBN_SETFOCUS //列表框得到键盘焦点
用SendMessage 或 SendDlgItemMessage向列表框发送的消息包括
LB_ADDFILE //用DlgDirList函数将一个文件加入目录列表框中并返回该项索引addfile
LB_ADDSTRING //添加字符串到列表框返回索引 items
LB_DELETESTRING //从列表框移除一个字符串返回列表框剩余表项 delete
LB_DIR //添加文件名列表,返回最后一个添加的文件名的索引
LB_FINDSTRING //返回第一个与指定字符串匹配的索引 find
findEx
LB_GETANCHORINDEX //返回鼠标最后选中的项的索引
LB_GETCARETINDEX //返回具有矩形焦点的项的索引
LB_GETCOUNT //返回列表框中项的个数 count items
LB_GETCURSEL //返回当前被选中项的索引 selIndex selText
LB_GETHORIZONTALEXTENT //返回列表框的可滚动的宽度(单位:象素)
LB_GETITEMDATA //返回和给定项相关联的32位值
LB_GETITEMHEIGHT //返回列表框中某一项的高度(单位:象素)
LB_GETITEMRECT //获得列表项的客户区的RECT getItemRect
LB_GETLOCALE //获得区域信息,高位国家代码,低位语言标识符
LB_GETSEL //返回列表项选中状态 selected
LB_GETSELCOUNT //返回被选中列表项的数目
LB_GETSELITEMS //创建一个被选中项的索引数组,返回被选中项个数
LB_GETTEXT //获得和给定项相关联的字符串和串长度 getItemText selText
LB_GETTEXTLEN //返回和给定项相关联的字符串长度(单位:字符)getItemText
LB_GETTOPINDEX //返回列表框中第一个可见项的索引
LB_INITSTORAGE //为指定项数和相关字符串分配内存
LB_INSERTSTRING //在列表框中指定位置插入字符串 add
LB_ITEMFROMPOINT //获得与指定点最近的项的索引
LB_RESETCONTENT //从列表框中移除所有项 clear
LB_SELECTSTRING //选择与给定前缀相匹配的第一个字符串 selText
LB_SELITEMRANGE //选择给定范围内的表项
LB_SETANCHORINDEX //设置鼠标最后选中的表项成指定表项
LB_SETCARETINDEX //设置矩形焦点到指定表项
LB_SETCOLUMNWIDTH //设置列的宽度(单位:象素)
LB_SETCOUNT //设置表项数目 count
LB_SETCURSEL //选择被给定的列表项 selIndex selText
LB_SETHORIZONTALEXTENT //设置列表框的滚动宽度(单位:象素)
LB_SETITEMHIEGHT //设置表项高度(单位:项素)
LB_SETLOCALE //设置区域,返回当前区域
LB_SETSEL //在多选列表框中选中一个表项 select
列表框可以使用的风格
风格
| 说明
| LBS_DISABLENOSCROLL
| 在不需滚动的时候也显示垂直滚动条 style=4096
| LBS_EXTENDEDSEL
| 在多选列表框中允许按住Shitf键同时选中一个范围
| LBS_MULTIPLESEL
| 允许多选,如果不定义的话则是单选列表框(msel=1)
| LBS_NOSEL
| 列表框项目只能查看不能选择
| LBS_NOTIFY
| 用户点击或双击项目时向父窗口发送WM_COMMAND消息
| LBS_SORT
| 自动按字母顺序排序插入的项目 style=2
| LBS_USETABSTOPS
| 列表框项目的文本中允许将Tab字符的位置展开
| LBS_STANDARD
| 组合LBS_NOTIFY, LBS_SORT, WS_VSCROLL和WS_BORDER
|
一般单选列表框只需定义LBS_STANDARD就可以了。
列表框使用说明:
当列表框有 LBS——NOTIFY风格的时候,用户有所动作时列表框会向父窗口发送WM_COMMAND,同时在wParam的高16位中指定通知码,列表框的通知码种类很少,基本上就是以下几种:
l LBN_DBLCLK 用户双击了一个项目。
l LBN_ERRSPACE 插入项目时无法申请到足够的内存。
l LBN_KILLFOCUS 输入焦点被切换到其他控件中,列表框丢失了焦点。
l LBN_SELCANCEL 用户撤销了一个选择。
l LBN_SELCHANGE 选定状态改变。
l LBN_SETFOCUS 列表框得到输入焦点。
namespace win.ui.ctrl;
import win.ui.ctrl.metaProperty;//导入控件属性元表支持
class listbox{
ctor(parent,tvalue){
if( tvalue ){
tvalue.style |= 0x1/*_LBS_NOTIFY*/;用户点击或双击项目时向父窗口发送WM_COMMAND消息
//tvalue.style |= 0x2/*_LBS_SORT*/;自动按字母顺序排序插入的项目
//tvalue.style |= 0x800/*_LBS_EXTENDEDSEL*/; //应该加到右侧属性中,支持通过Shift键或者鼠标进行多选
if(tvalue.msel)
tvalue.style |= 0x8/*_LBS_MULTIPLESEL*/ 允许多选 msel=1
if(tvalue.edge) tvalue.exstyle |= 0x200/*_WS_EX_CLIENTEDGE*/;三维边框edge=1带阴影
}
}
clear = function(){//清除所有项
::SendMessage(this.hwnd , 0x184/*_LB_RESETCONTENT*/, null,null)
}
delete = function(i){//删除选定项
::SendMessage(this.hwnd , 0x182/*_LB_DELETESTRING*/, topointer( this.selIndex-1 ),null)
}
旧版记录add = function( str){//listbox添加项
旧版记录
addfile = function( str){//listbox添加文件到列表项
获取指定项区块位置\n返回::RECT() 结构体
getItemRect = function(ind,rc){ //获得列表项的客户区的RECT
rc := ::RECT();
var ret = ::SendMessageByStruct(this.hwnd,0x198/*_LB_GETITEMRECT*/,ind-1,rc);
..io.print(ret,..lasterr())
return rc;
}
getItemText = function(ind){ //获取指定项文本
var len = ::SendMessageInt(this.hwnd, 0x18A/*_LB_GETTEXTLEN*/, ind-1,0) ; //返回和给定项相关联的字符串长度(单位:字符)
var ret,text = ::SendMessageByString(owner.hwnd , 0x189/*_LB_GETTEXT*/,ind-1,len); //获得和给定项相关联的字符串和串长度
return text;
}
返回指定客户区坐标所在的项索引.
getAt = function(x,y){
var rc = ::RECT()
for(i=1;this.count){
this.getItemRect(i,rc);
if( ::PtInRect(rc,x,y) )
return i;
}
}
selectRange = function( first ,last){//指定选择的范围 在多选状态下的列表框中选择一个或多个连续的条目
return ::SendMessage(this.hwnd , 0x183/*_LB_SELITEMRANGEEX*/, topointer( 1 ), topointer( ::MAKELONG(first, last) ));
}
用SendMessage发送一个LB_SETSEL信息,可以一次选中所有项。?似乎只可选择1个项
["select"] = function (ind, selected=true) { //在多选列表框中选中一个表项
::SendMessageInt(this.hwnd,0x185/*_LB_SETSEL*/,selected?1:0,ind-1);
}
select(1) 1是指定项目,可以为2,或为3 !listbox.select(1,false) = 取消选中指定项
!listbox.selected(1) = 是否选中
selected = function(ind){//返回列表项选中状态
return ::SendMessageInt(this.hwnd,0x187/*_LB_GETSEL*/,ind-1,0);
}
@metaProperty;
}
listbox.metaProperty = ..win.ui.ctrl.metaProperty(
列表项数目
count = {
_get = function(){ //返回列表框中项的个数
return ::SendMessage(owner.hwnd, 0x18B/*_LB_GETCOUNT*/ )
}
_set = function( v ){//设置表项数目
::SendMessage(owner.hwnd, 0x1A7/*_LB_SETCOUNT*/, topointer(v) )
}
};
selIndex = {//获取或设置列表框当前选中项
_get = function(){ //返回当前被选中项的索引
return ::SendMessage(owner.hwnd, 0x188/*_LB_GETCURSEL*/, null,null) +1
}
_set = function( v ){ //选择被给定的列表项
::SendMessage(owner.hwnd,0x186/*_LB_SETCURSEL*/,topointer(v-1));
}
};
selText = {//获取或设置当前选中的文本
_get = function(){ /返回当前被选中项的索引
var sel = ::SendMessage(owner.hwnd, 0x188/*_LB_GETCURSEL*/) ;
if(sel>-1){//选择被给定的列表项
var len = ::SendMessage(owner.hwnd, 0x18A/*_LB_GETTEXTLEN*/, topointer(sel)) ;
var ret,text = ::SendMessageByString(owner.hwnd, 0x189/*_LB_GETTEXT*/,sel,len+1); //获得和给定项相关联的字符串和串长度
return ret ? ..string.str( text );
}
}
_set = function( v ){ //选择与给定前缀相匹配的第一个字符串
::SendMessage(owner.hwnd, 0x18C/*_LB_SELECTSTRING*/, ,v);
}
};
items = {//列表项集合\table对象
_get = function(){ //返回列表框中项的个数
var count = ::SendMessage(owner.hwnd, 0x18B/*_LB_GETCOUNT*/, null);
tab = {};
for(i=1;count){
..table.push(tab,owner.getItemText(i) )
}
return tab;
}
_set = function( v ){
for(i=1;#(v) ){ //添加字符串到列表框返回索引
::SendMessage(owner.hwnd , 0x180/*_LB_ADDSTRING*/, null,v);
}
}
}
)
?win.ui.ctrl.listbox =!listbox.
!listbox.clear() = 清除列表框所有内容
!listbox.delete() = 删除当前选中项
!listbox.getItemText(__/*项索引*/) = 获取指定项文本
!listbox.getItemRect(__/*项索引*/) = 获取指定项区块位置\n返回::RECT() 结构体
!listbox.getAt(x,y) = 返回指定客户区坐标所在的项索引.
!listbox.add(__/*请输入文本*/) = 添加列表项到尾部
!listbox.add(__/*请输入文本*/,-1) = 添加列表项到尾部
!listbox.add(__/*请输入文本*/,1) = 添加列表项到头部
!listbox.selIndex = 获取或设置列表框当前选中项
!listbox.selText = 获取或设置当前选中的文本
!listbox.hwnd = 控件句柄
!listbox.id = 控件ID
!listbox.parent = 父窗口
!listbox.parent.hwnd = 父窗口句柄
!listbox.disabled = 控件ID
!listbox.left = 左侧坐标
!listbox.right = 右侧坐标
!listbox.top = 顶部坐标
!listbox.bottom = 底部坐标
!listbox.count = 列表项数目
!listbox.selectRange(1,__) = 选中指定范围
!listbox.select(1) = 选中指定项
!listbox.select(1,false) = 取消选中指定项
!listbox.selected(1) = 是否选中
!listbox.findEx(__/*请输入文本*/) = 精确查找指定的项\n找不到返回0
!listbox.find(__/*请输入文本*/) = 在列表框里查找指定的项\n找不到返回0
!listbox.addfile(__/*请输入路径*/) = 向列表框里增加一个文件(包括目录)
!listbox.redraw() = 刷新
!listbox.items = 列表项集合\ntable对象
!listbox.show(true__) = 显示控件
!listbox.rect = 控件区块位置(::RECT结构体)
!listbox.clientRect = 控件客户区块位置(::RECT结构体)
!listbox.font = 控件字体(::LOGFONT结构体)
!listbox.clientRect = 获取控件客户区块位置(::RECT结构体)
!listbox.theme = 外观主题,例如\nwinform.button.theme = "Explorer"\nwinform.button.theme = false
!listbox.modifyStyle(.(remove,add) = 如果指定第三个参数,则使用此参数调用::SetWidnowPos
!listbox.modifyStyleEx(.(remove,add) = 如果指定第三个参数,则使用此参数调用::SetWidnowPos
!listbox.close() = 关闭控件窗
!listbox.capture = 是否捕获全局鼠标消自息
!listbox.invalidate(__/*可选使用::RECT()对象指定客户区*/) = 使窗口绘图区无效
!listbox.invalidate(__/*可选使用::RECT()对象指定客户区*/,0) = 使窗口绘图区无效\n不刷新背景
!listbox.update() = 重绘invalidate函数指定的区块
!listbox.setFocus() = 设置焦点
!listbox.setPos(.(x坐标,y坐标,宽,高,插入位置,参数) = 调整窗口位置或排序,所有参数可选\n同时指定x,y坐标则移动位置\n同时指定宽高则改变大小\n指定插入位置(句柄或_HWND前缀常量)则调整Z序
!listbox.getPos() = 返回相对坐标,宽,高\nx,y,cx,cy=win.getPos(hwnd)
[table=95%,#F1F1F1]
|
|