1. 清理列表框
1 winform.btnClear.oncommand = function(id,event){
2 winform.listbox.clear(); 清空
3 winform.static.text = "";
4 winform.redraw(); 刷新
5 }
2. 字符串简单格式化
1 winform.static.text = string.format( '您选中了第%d项\n总计%d项\n项名:%s',winform.listbox.selIndex,winform.listbox.count,winform.listbox.text);
2 后面依次为参数
3.列表框添加项
1 winform.btnAdd.oncommand = function(id,event){
2 str = winform.edit.text;
3 winform.listbox.add(str)
4 winform.combobox.add(str)
5 winform.combobox.selText = str
6 winform.listbox.selIndex = winform.listbox.count;
7 }
4. 右键菜单
1 //右键菜单
2 import win.ui;
3 import win.ui.menu; //菜单库
4
5 winform.listbox.wndproc = function(hwnd,message,wParam,lParam){
6 select( message ) {
7 case 0x205/*_WM_RBUTTONUP*/{
8 var x,y = win.getMessagePos(); //获得鼠标位置
9 var item = winform.listbox.hitTest(x,y,true); //返回屏幕坐标句柄,第三个参数表示是否是屏幕坐标
10 if( item ){
11 winform.listbox.selIndex = item; //设置选中的索引
12 popmenu.popup(x,y,true) //popup弹出坐标,第三个参数如上
13 }
14 }
15 }
16 }
17
18 //创建弹出菜单
19 popmenu = win.ui.popmenu(winform);
20 popmenu.add('删除',function(id){ //add(标题,回调函数)
21 winform.listbox.delete()
22 } )
23
24
25
26 winform.show()
27 win.loopMessage();
5. checklist 响应
1 //checklist响应点选
2 import win.ui;
3
4
5 winform.checklist.items = { "测试项目";"测试项目2";"测试项目3" }
6 winform.checklist.addItem("测试项目4")
7 winform.checklist.addItem("测试项目5")
8
9 import win.ui.menu;
10 winform.checklist.onnotify = function(id,code,ptr){
11 if( code == 0xFFFFFF9B/*_LVN_ITEMCHANGED*/ ){
12 var nmListView = winform.checklist.getNotifyMessage(code,ptr);
13 if( !nmListView )
14 return;
15
16 if( nmListView.uNewState & 0xF000/*_LVIS_STATEIMAGEMASK*/){
17 var selIndex = nmListView.iItem;
18 if( winform.checklist.getChecked( selIndex ) )
19 winform.static.text = "选中:" + selIndex
20 else {
21 winform.static.text = "取消选中:" + selIndex
22 }
23 }
24 }
25 elseif( code = 0xFFFFFFFB/*_NM_RCLICK*/ ){
26
27 var x,y = win.getMessagePos();
28 var nmListView = winform.checklist.getNotifyMessage(code,ptr);
29 //创建弹出菜单
30 var popmenu = win.ui.popmenu(winform);
31 popmenu.add('删除',function(id){
32 winform.checklist.delItem( nmListView.iItem )
33 } )
34 popmenu.popup(x,y,true);
35 popmenu.close();
36 }
37 }
38
39 winform.show()
40 win.loopMessage();
6. 编辑listview
1 //编辑listview
2
3 import win.ui;
4 /*DSG{{*/
5 var winform = ..win.form(text="aardio form";right=343;bottom=244;parent=...)
6 winform.add(
7 btnEdit={cls="button";text="编辑当前选中项";left=175;top=191;right=283;bottom=223;z=2};
8 listview={cls="listview";left=25;top=23;right=310;bottom=182;bgcolor=16777215;edge=1;editable=true;z=1}
9 )
10 /*}}*/
11
12 //注意在上面的listview属性中,一定要指定 editable=true
13
14 winform.listview.insertColumn("测试项",300) // 插入列,宽度300
15 winform.listview.items = {"鼠标点这里,稍候再点击一次";"鼠标单击选中项则进入编辑模式"}
16
17 winform.btnEdit.oncommand = function(id,event){
18 winform.listview.editLable() //点击进入编辑
19 }
20
21 winform.listview.onnotify = function(id,code,ptr){
22 if(code = 0xFFFFFF97/*_LVN_BEGINLABELEDIT*/ ){
23 return false; //允许编辑项
24 }
25 if( code == 0xFFFFFF96/*_LVN_ENDLABELEDIT*/ ){
26 var dispInfo = winform.listview.getNotifyDispInfo(code,ptr);
27 if( dispInfo ? dispInfo.item.text ) {
28 winform.listview.setItemText( dispInfo.item.text, dispInfo.item.iItem,dispInfo.item.iSubItem );
29 }
30 }
31 }
32
33 winform.show()
34 win.loopMessage();
oncommand 是普通窗口控件的命令消息(例如按钮)
onnotify 是通用控件的通知消息(例如tab控件),实际上是命令消息的一个增强版本,本质一样,只不过能够在消息中传送更多的附加数据。
wndproc是消息回调,可以处理所有发给控件的消息,例如鼠标在控件上移动的_WM_MOUSEMOVE消息。至于每一个消息的wParam,lParam都有不同的含义,具体应用可以到MSDN或百度百科查一下,都非常详细。
wndproc是处理“我正在做什么…………”的消息,是内部实现。
oncommand,onnotify是处理“我被怎么怎么样了………..”的消息,即与用户交互,是与外部交互。
用得最多的是命令与通知, 一般用不到消息回调, 除非是要修改控件的一些默认行为
7.listview响应
1 //listview响应事件 2 import win.ui; 3 import win.ui.menu; 4 /*DSG{{*/ 5 var winform = ..win.form(text="aardio form";right=349;bottom=249;parent=...) 6 winform.add( 7 listview={cls="listview";left=37;top=36;right=303;bottom=207;acceptfiles=1;asel=false;bgcolor=16777215;dl=1;dr=1;edge=1;font=LOGFONT( name='SimSun' );fullRow=1;gridLines=1;msel=false;z=1}; 8 static={cls="static";text="请使用鼠标左键、鼠标右键点击列表项";left=37;top=10;right=310;bottom=28;transparent=1;z=2} 9 ) 10 /*}}*/ 11 12 winform.popmenu = win.ui.popmenu(winform);//创建弹出菜单 13 winform.popmenu.add('删除',function(id){ 14 //在下面输入菜单响应代码 15 winform.listview.delItem( winform.listview.selIndex ) 16 }); 17 18 //双击listview控件添加下面的代码 19 import mouse; 20 import win.util.tray; 21 winform.listview.onnotify = function(id,code,ptr){ 22 23 select(code) { 24 case 0xFFFFFF9B/*_LVN_ITEMCHANGED*/ { 25 var nm = winform.listview.getgetNotifyMessage(code,ptr) //返回受点击的项的对象 26 if(winform.listview.selIndex){ 27 winform.static.text = "选中了" + winform.listview.getItemText(nm.iItem,nm.iSubItem) 28 win.util.tray.pop( winform.static.text ) 29 } 30 } 31 case 0xFFFFFF94/*_LVN_COLUMNCLICK*/ { 32 winform.static.text = "请实现排序" 33 win.util.tray.pop("请实现排序") 34 } 35 case 0xFFFFFFFB/*_NM_RCLICK*/ { 36 var x,y = mouse.getPos() 37 winform.popmenu.popup(x,y,true);//弹出菜单 38 } 39 } 40 41 } 42 43 //接受拖放文件并修改指定列 44 winform.listview.wndproc = function(hwnd,message,wParam,lParam){ 45 select(message) { 46 case 0x233/*_WM_DROPFILES*/{ 47 var path = win.getDropFile(wParam )[1]; 48 var row,col = winform.listview.hitTest(); 49 winform.listview.setItemText(path,row,col); 50 } 51 } 52 } 53 54 //自适应列宽度 55 winform.listview.adjust = function(cx,cy){ 56 winform.listview.fillParent(/*列序号*/); 57 } 58 59 winform.listview.insertColumn("列标题2",100,,0x0/*_LVCFMT_LEFT*/) //没有这句话,listview就不能用 60 winform.listview.insertColumn("列标题1",100,,0x0/*_LVCFMT_LEFT*/) //第二列开始可以使用_LVCFMT_CENTER居中 61 62 winform.listview.addItem( { 63 text={"第一行内容";"yes"} 64 } ) 65 winform.listview.addItem("第二行内容") 66 winform.listview.addItem("第三行内容") 67 68 winform.listview.setItemText("改变第三行",3) 69 winform.listview.setItemText( { 70 "改变第二行";"第二列" 71 },2); 72 73 74 winform.show() 75 win.loopMessage(); 76 77 /* 78 _LVN_BEGINDRAG 鼠标左键正在被触发以便进行拖放操作(当鼠标左键开始拖拽列表视图控件中的项目时产生) 79 _LVN_BEGINRDRAG 鼠标右键正在被触发以便进行拖放操作(当鼠标右键开始拖拽列表视图控件中的项目时产生) 80 _LVN_BEGINLABELEDIT 开始编辑项的文本 81 _LVN_COLUMNCLICK 单击列(当鼠标单击列表视图控件列标题时产生) 82 _NM_CLICK 当鼠标单击列表视图控件时产生 83 _LVN_COLUMNCLICK 单击列 84 _LVN_DELETEALLITEMS 删除所有项 85 _LVN_DELETEITEM 删除某个项 86 _NM_DBLCLK 当鼠标双击列表视图控件时产生 87 _LVN_ENDLABELEDIT 结束对项文本的编辑 88 _LVN_GETDISPINFO 请求需要显示的信息 89 _LVN_GETINFOTIP 请求显示在工具提示窗口内的附加的文本信息 90 _LVN_HOTTRACK 鼠标滑过某个项 91 _LVN_INSERTITEM 当向列表视图控件插入项目时产生 92 _LVN_ITEMACTIVATE 激活某个项 93 _LVN_ITEMCHANGED 某个项已经发生变化 94 _LVN_ITEMCHANGING 某个项目正在发生变化 95 _NM_KILLFOCUS 当视表列图控件失去焦点时产生 96 _LVN_KEYDOWN 某个键被按下 97 _LVN_MARQUEEBEGIN 开始某个边框选择 98 _NM_OUTOFMEMORY 当内存溢出时产生 99 _LVN_ODCACHEHINT 虚拟列表控件的显示区域的内容发生了变化 100 _LVN_ODSTATECHANGED 虚拟列表的控件的某个项或某个范围内的项已经发生变化 101 _LVN_ODFINDITEM 需要拥有者查找一个特定的回调项 102 _NM_RCLICK 当鼠标右键单击列表视图控件时产生 103 _NM_RDBLCLK 当鼠标右键双击列表视图控件时产生 104 _NM_SETFOCUS 当列表视图控件获得焦点时产生 105 _LVN_SETDISPINFO 父窗口必须更新控件为项所维护的信 106 */
listview 总结:
函数有
.getChecked() 是否选中
.addItem()
.setItemText()
综合练习:listview综合运用
import win.ui; import sqlite; import console; /*DSG{{*/ var winform = ..win.form(text="AAuto Form";right=596;bottom=433;parent=...) winform.add( btn_adddb={cls="button";text="添加中数据到数据库";left=416;top=12;right=555;bottom=67;z=11}; btnDelete={cls="button";text="删除表中数据";left=473;top=388;right=560;bottom=415;z=2}; ed_age={cls="edit";left=277;top=10;right=369;bottom=32;edge=1;z=6}; ed_kg={cls="edit";left=279;top=48;right=371;bottom=70;edge=1;z=5}; ed_love={cls="edit";left=108;top=53;right=200;bottom=73;edge=1;z=4}; ed_name={cls="edit";left=109;top=13;right=201;bottom=37;edge=1;z=3}; listview={cls="listview";left=31;top=100;right=561;bottom=369;bgcolor=16777215;edge=1;fullRow=1;gridLines=1;items={};z=1}; static={cls="static";text="name:";left=49;top=18;right=91;bottom=38;transparent=1;z=7}; static2={cls="static";text="age:";left=218;top=14;right=260;bottom=34;transparent=1;z=8}; static3={cls="static";text="kg:";left=219;top=52;right=261;bottom=72;transparent=1;z=9}; static4={cls="static";text="love:";left=48;top=55;right=90;bottom=70;transparent=1;z=10} ) /*}}*/ winform.listview.setExtended(0x4/*_LVS_EX_CHECKBOXES*/); //指定listview的样式,有单击选中,全行选中等等 winform.listview.insertColumn("id",50,1) winform.listview.insertColumn("name",100,2) //插入列,(名称,宽度,位置,样式) winform.listview.insertColumn("age",150,3) winform.listview.insertColumn("kg",100,4) winform.listview.insertColumn("love",100,5) //打开数据库链接 sqlConnection=sqlite("\db.db") if(not sqlConnection.existsTable("file")){ sqlConnection.exec("CREATE TABLE file( id INTEGER PRIMARY KEY AUTOINCREMENT, name, age, kg, love );" ) win.msgbox("创建表成功","AAuto") //创建索引利于查询 //sqlConnection.exec("create index 索引名字 on 表名字(索引字段名字)") }else { var db=sqlConnection.getTable("SELECT * FROM file");
//lisetview输出结果最常用的方式 for(i=1;#db;1){ winform.listview.addItem(); //只用来创建,设置用下面的set winform.listview.setItemText(tostring(db[i].id),i,1) winform.listview.setItemText(db[i].name,i,2) winform.listview.setItemText(tostring(db[i].age),i,3) winform.listview.setItemText(tostring(db[i].kg),i,4) winform.listview.setItemText(db[i].love,i,5) } } //刷新listview Refresh_main=function(){ winform.listview.clear(); var db=sqlConnection.getTable("SELECT * FROM file"); for(i=1;#db;1){ winform.listview.addItem(); winform.listview.setItemText(tostring(db[i].id),i,1) winform.listview.setItemText(db[i].name,i,2) winform.listview.setItemText(tostring(db[i].age),i,3) winform.listview.setItemText(tostring(db[i].kg),i,4) winform.listview.setItemText(db[i].love,i,5) } } //删除所选数据 delete_db = function(){ for(i=1;winform.listview.count;1){ if(winform.listview.getChecked(i)){ var id=winform.listview.getItemText(i,1) sqlConnection.exec("DELETE FROM file WHERE id="+id+"") } } win.msgbox("删除成功","系统提示") Refresh_main() } //查询表中相同的并删除 delete_thesame = function(name){ sqlConnection.exec("DELETE FROM file where name not in(select max(id) from file group by name)") } //查询表中相同姓名 select_db = function(name){ return sqlConnection.getTable("select name from file where name='"+name+"'"); } //查询表中有相同数据的便覆盖掉 the_same = function(name,age,kg,love){ var num = sqlConnection.exec("insert into file(name,age,kg,love) select '"+name+"','"+age+"','"+kg+"','"+love+"' where not exists(select * from file where name='"+name+"');") win.msgbox("添加成功","系统提示") Refresh_main() } //修改表中数据 update_db = function(id,name,age,kg,love){ var doubt=win.msgboxTest("确定修改并且更新到数据库?","系统提示"); if(doubt){ sqlConnection.exec("UPDATE file SET name='"+name+"',age='"+age+"',kg='"+kg+"',love='"+love+"' WHERE id ='"+id+"'"); } } //添加 add_db =function(name,age,kg,love){ var add=sqlConnection.exec("insert into file (name,age,kg,love) values('"+name+"','"+age+"','"+kg+"','"+love+"')") win.msgbox("添加成功","系统提示") Refresh_main(); } //listview原地编辑并更新到数据库 winform.listview.onnotify = function(id,code,ptr){ if(code=0xFFFFFFFE/*_NM_CLICK*/ ){ var notifyMessage = winform.listview.getNotifyMessage(code,ptr); if( ! notifyMessage.iItem && notifyMessage.iSubItem ) return ; var edit = winform.listview.editlable if( ! edit ){ winform.listview.addCtrl( editlable = { cls="edit";font = LOGFONT( h = 11 );left = 0;top = 0; right = 50;bottom = 50;autoResize = false ;hide = 1;edge = 1; wndproc = function( hwnd, message, wParam, lParam ){ if( ( message = 0x8/*_WM_KILLFOCUS*/) || message == 0x101/*_WM_KEYUP*/ && wParam == 0xD/*_VK_RETURN*/){ // 按下了回车键或失去焦点,更新listview数据 owner.parent.setItemText( owner.text, owner.listViewNotifyMessage.iItem , owner.listViewNotifyMessage.iSubItem ); //获取选中的焦点 var focus=winform.listview.getFocused() if(focus!=0){ var id=winform.listview.getItemText(focus,1);//第i行第一列 var name=winform.listview.getItemText(focus,2); var age=winform.listview.getItemText(focus,3); var kg=winform.listview.getItemText(focus,4); var love=winform.listview.getItemText(focus,5); console.log(id,name,age,kg,love) //更新语句update update_db(id,name,age,kg,love); //调用刷新 Refresh_main(); } owner.show(false); } } } ) edit = winform.listview.editlable; } edit.listViewNotifyMessage = notifyMessage; edit.text=winform.listview.getItemText(notifyMessage.iItem,notifyMessage.iSubItem); var rc=winform.listview.getItemRect( notifyMessage.iItem,notifyMessage.iSubItem,,2/*_LVIR_LABEL*/ ) rc.right += 5; rc.bottom += 5; edit.setRect(rc); edit.show(); edit.setFocus();// 获取焦点 } } //删除所选数据 winform.btnDelete.oncommand = function(){ win.util.tooltip.pop("这是一个提示",,,2000) var bool=win.msgboxTest("确定删除?","系统提示") if(bool){ delete_db(); } } //添加数据到db winform.btn_adddb.oncommand = function(){ var name=winform.ed_name.text; var age =winform.ed_age.text; var kg =winform.ed_kg.text; var love=winform.ed_love.text; var name_01; var num=select_db(name); for(i=1;#num;1){ name_01=num[i].name; } if(name_01!=null){ win.msgbox("该名称数据库已经存在","系统提示") }else { if(name!="" ? age!=null ? kg!=null ? love!=""){ add_db(name,age,kg,love) } } } winform.show() win.loopMessage(); return winform;