Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4736231
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

2010-10-19 22:57:32

参考:
1.
2.

Windows 窗体  控件显示一个项列表,用户可从中选择一项或多项。如果项总数超出可以显示的项数,则自动向  控件添加滚动条。当  属性设置为 true 时,列表框以多列形式显示项,并且会出现一个水平滚动条。当  属性设置为 false 时,列表框以单列形式显示项,并且会出现一个垂直滚动条。当  设置为 true 时,无论项数多少都将显示滚动条。 属性确定一次可以选择多少列表项。

 属性返回对应于列表框中第一个选定项的整数值。通过在代码中更改  值,可以编程方式更改选定项;列表中的相应项将在 Windows 窗体上突出显示。如果未选定项,则  值为 -1。如果选定列表中的第一个项,则  值为 0。当选定多个项时, 值反映在列表中第一个出现的选定项。 属性类似于 ,但它返回项本身,通常是字符串值。 属性反映列表的项数,由于  是从零开始的,所以  属性的值通常比  的最大可能值大一。

若要在  控件中添加或删除项,请使用  或  方法。或者,可以在设计时使用  属性向列表添加项。


列表框的消息

列表框的消息包含在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

LB_FINDSTRINGEXACT   //返回具有某一指定前缀的索引 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

LB_SETTOPINDEX   //滚动列表使指定的项能显示出来




列表框可以使用的风格

风格

说明

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_VSCROLLWS_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添加项 
        ::SendMessage(this.hwnd , 0x181/*_LB_INSERTSTRING*/, topointer(this.count ),str)
    }

    add = function( str,ind=-1){//listbox添加项 默认尾部添加,头部添加为1

     if(ind<0)

     ind = this.count + ind +1;

     else 

     ind--;

    

        ::SendMessage(this.hwnd  , 0x181/*_LB_INSERTSTRING*/, topointer(ind),str)

    }

    

旧版记录

addfile = function( str){//listbox添加文件到列表项
        ::SendMessage(this.hwnd , 0x196/*_LB_ADDFILE*/, topointer( this.count),str)
    }

addfile = function( str){//listbox添加文件到列表项 DlgDirList

::SendMessage(this.hwnd  , 0x196/*_LB_ADDFILE*/, ,str)

}

find = function( str ){//在列表框里查找指定的项

return ::SendMessage(this.hwnd , 0x18F/*_LB_FINDSTRING*/, topointer( this.selIndex-1 ), str ) + 1; 

}

findEx = function( str ){//精确查找指定的项

return ::SendMessage(this.hwnd , 0x1A2/*_LB_FINDSTRINGEXACT*/, , str ) + 1;

}

获取指定项区块位置\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[i]);

}

}

}

)





?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)





阅读(7193) | 评论(13) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-11-10 01:22:55

http://www.chinesejy.com/jishu/516/2006062196908.html

chinaunix网友2010-11-02 04:11:20

亚运游广州最悭钱出游方案推荐http://blog.sina.com.cn/s/blog_561cb1760100mnhf.html

chinaunix网友2010-10-29 23:46:02

insert = function( str ){//listbox头添加项 ::SendMessage(this.hwnd , 0x181/*_LB_INSERTSTRING*/, topointer( 0 ),str) }