设为首页 收藏本站
查看: 3086|回复: 0

[经验分享] windows窗体控件之LisBox(列表框)

[复制链接]

尚未签到

发表于 2015-12-16 07:58:03 | 显示全部楼层 |阅读模式
参考:
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]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151723-1-1.html 上篇帖子: Windows DDE通讯 下篇帖子: windows 下安装/配置/测试 net-snmp
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表