aardio - 【库】虚表增强版

33 篇文章 16 订阅

注:本文例程适用于虚表godking.vlistEx V4.0及以后版本。

虚表图片专题文章:https://blog.csdn.net/sdlgq/article/details/129944516 

虚表完整例程下载:https://wwow.lanzoum.com/i074b0tvsknc

关于虚表 

1、虚表是一个特殊的listview,一些特性可以通用。

2、虚表对大数据比较适合,几百万条数据毫无压力。

3、数据量大的情况下(过几十万数据):虚表占用内存非常少,加载速度也非常快。listview 占内存非常多,加载速度非常慢。

4、数据在内存中处理速度是很快的,我们看到的慢,一般是加载到组件中并显示出来这段时间太长。

虚表库增强版 

下载地址 光庆·程序·在线 → aardio资源下载 → vlistEx.rar

解压到:/lib/godking/ 目录下

 注意事项:

  • 不要直接使用操作 listview 内容的函数,如 setItem()、addItem()、 delItem()等。
  • 可使用经过重新封装的函数:setTable()、setICellText() 设置表格或单元格内容。
  • 可使用:insertRow()、addRow()、delRow() 添加或删除行数据。
  • 标题栏文本、宽度、格式等可以修改,但列数中途不要修改。

禁止调整列宽的方法:

  • onResizeCol = true; //所有列,都允许调整列宽。
  • onResizeCol = false; //所有列,都禁止调整列宽。
  • onResizeCol = {true,1,2,3}; //第一个成员为true,表示表中的列允许调整列宽。其他列禁止调整。
  • onResizeCol = {false,1,2,3}; //第一个成员为false,表示表中的列禁止调整列宽。其他列允许调整。
  • onResizeCol = function(col) {

                    if ( col = 1 ) return false; // 返回false为禁止调整列宽。

        }

因为listview鼠标拖动调整列宽时,如果列数较多,会导致拖动时很卡,所以做了个特殊处理:

        onlyRedrawCurColOnResizeCol = true; 

鼠标拖动改变列宽时,只绘制当前拖动列的内容,以加快绘制速度。

示例一:

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=570;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
var t = { fields={"序号","姓名","年龄","地址","身份证"} };
for(i=1;100;1){
    var tt={};
	tt["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
	tt["姓名"]=math.random(1000,9999)+"姓名";
	tt["年龄"]=math.random(10,99);
	tt["地址"]=math.random(1000,9999)+"地址";
	tt["身份证"]=math.random(1000,9999)+"身份证";
	..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{80,100,100,100,200},0x2);
mainForm.vlist.checkBox.show = true;
mainForm.vlist.textColor = 0xFF0000;
mainForm.vlist.setHeaderHeight(50);
mainForm.vlist.headerAlign = 1;
mainForm.vlist.lineColorH = 0x008800;
mainForm.vlist.lineColorV = 0xBB9999;
mainForm.vlist.fillParent();
mainForm.vlist.onEditBegin = true; 
mainForm.vlist.onEditEnd = function(row/*行*/,col/*列*/,text/*内容*/){
	/*单元格编辑完毕,是否允许单元格内容改变。返回false不允许,返回true允许,返回文本则改为新文本*/
	/*不定义此事件,则默认允许改变。注意:只有onEditBegin事件返回true,此事件才会触发。*/
	// 确保第三列输入数值!
	if col==3 {
		var r = ..tostring((..tonumber(text)):0);
		if r!=text	{
			..win.msgbox(text++" 将转为:"++r);
			return r; 
		}
	}
	return true; 
}
mainForm.vlist.onSortColumn = function(col,desc){
	/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
	owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}
mainForm.vlist.onRClick = function(row/*行*/,col/*列*/){
	/*鼠标右键点击项目事件*/
	..win.msgbox("您鼠标右键点击了:"++row++"行,"++col++"列");
}
mainForm.show();
win.loopMessage();

示例二

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=599;bottom=449)
mainForm.add(
listview={cls="vlistEx";left=11;top=20;right=590;bottom=430;acceptfiles=1;aw=1;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;vscroll=1;z=1}
)
/*}}*/

//添加右键菜单,并且删除行
var listpopmenu = win.ui.popmenu(mainForm);
listpopmenu.add("删除",function(id){
	mainForm.listview.delRow(mainForm.listview.getSelected()); 
}); 
listpopmenu.add("新增",function(id){
	mainForm.listview.addRow("[@rowindex]","1","2","3","等待中"); //使用行索引标识符
});
listpopmenu.add("清空",function(id){
	mainForm.listview.clear()
});
mainForm.listview.onRClick = function(row/*行*/,col/*列*/){
	/*鼠标右键点击项目事件*/
    var x,y = win.getCursorPos();
    listpopmenu.popup(x,y,true);//弹出菜单	
}
var t = {
	{"[@rowindex]","张三",26,"山东","等待中"}//使用行索引标识符
	{"[@rowindex]","李四",28,"江苏","等待中"}//使用行索引标识符
	{"[@rowindex]","王五",29,"四川","等待中"}//使用行索引标识符
	{"[@rowindex]","SSS",10,"四川","等待中"}//使用行索引标识符
	{"[@rowindex]","AAA",35,"四川","等待中"}//使用行索引标识符
    }
mainForm.listview.setTable(t)
mainForm.listview.setColumns({"序号","文件名称","文件路径","保存路径","当前状态"},,1)
mainForm.show();
win.loopMessage();

示例三:禁止调整列宽

import win.ui;
import godking.vlistEx
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="全可调整";left=76;top=411;right=206;bottom=456;z=2};
button2={cls="button";text="全不可调整";left=235;top=407;right=365;bottom=452;z=3};
button3={cls="button";text="自定义回调函数";left=550;top=409;right=680;bottom=454;z=4};
button4={cls="button";text="部分(2\4)不可调整";left=385;top=407;right=515;bottom=452;z=5};
custom={cls="vlistEx";text="自定义控件";left=59;top=32;right=699;bottom=395;editable=0;z=1}
)
/*}}*/

winform.custom.setColumns({"111","222","333","444"},{100,50,100,50}/*列宽*/,/*格式*/)
winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")
winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")
winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")

winform.button.oncommand = function(id,event){
	winform.custom.onResizeCol = true;
}

winform.button2.oncommand = function(id,event){
	winform.custom.onResizeCol = false;
}

winform.button4.oncommand = function(id,event){
	winform.custom.onResizeCol = {false,2,4};
}

winform.button3.oncommand = function(id,event){
	winform.custom.onResizeCol = function(col){
		/*是否允许改变列宽。参数为列号。返回false为不允许,否则为允许。*/
		if col = 3{
			..win.msgbox("第3列不可调整")
			return false; 
		}		
	}
}

winform.custom.onEditBegin = function(row/*行*/,col/*列*/){
	/*鼠标双击单元格进行编辑,返回true允许编辑,否则禁止编辑。
	不定义此事件,则默认不允许编辑。此事件会在onDblClick后触发。*/
	return true; 
}

winform.custom.onEditEnd = function(row/*行*/,col/*列*/,text/*内容*/){
	/*单元格编辑完毕,是否允许单元格内容改变。返回false不允许,返回true允许,返回文本则改为新文本*/
	/*不定义此事件,则默认允许改变。注意:只有onEditBegin事件返回true,此事件才会触发。*/
	var t=tonumber(text)
	if t===null {
		//win.msgbox("请输入数值"); 
		return "";
	}
	else return tostring(t); 	
}

winform.show();
win.loopMessage();

示例四:其他用法

import win.ui;
import godking.vlistEx;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="写数据";left=124;top=430;right=267;bottom=468;z=2};
button2={cls="button";text="取数据";left=388;top=428;right=531;bottom=466;z=3};
listview={cls="vlistEx";left=30;top=31;right=718;bottom=428;edge=1;z=1}
)
/*}}*/

var gridTitle = "序号,报价日期,客户名称,部门,联系人,联系电话,地址,业务员,联系电话,电子邮箱,税率(%),总计(元),优惠总计(元),折扣(%),备注,id,状态,行状态"
var gridWidth = {40,80,70,140,60,60,80,80,60,80,80,0,80,80,80,80,0,70,0};
var format = 1;

var t={}
for(i=1;10;1) ..table.push(t,{序号="[@rowindex]",联系人="张三"});
winform.listview.setTable(t,gridTitle/*标题或数组*/,gridWidth/*列宽或数组*/,format/*列格式或数组*/,true/*转为数组*/)

winform.button.oncommand = function(id,event){
	for(i=2;#gridWidth){
		winform.listview.setCellText(1,i,gridWidth[i]);
	}
	winform.listview.setRowText(2,gridWidth);
}

winform.button2.oncommand = function(id,event){
	import console
	console.dump(winform.listview.getText()) //全部
	console.dump(winform.listview.getText(2)) //第二行
	console.dump(winform.listview.getText(2,3))//第二行第三列
	console.dump(winform.listview.getText(,3))//第三列
}

winform.show();
win.loopMessage();

示例五:关于setRowText

数据格式(字典、数组)要与setTable时一致。

winform.button.oncommand = function(id,event){
	var c = {"姓名","年龄"}
	var t = {
			{姓名="aaa",年龄=123}
			{姓名="bbb",年龄=456}
			}
	winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,/*字典转为数组*/,/*字符串转为Utf8*/)
	winform.vlist.setRowText(2,{姓名="ccc",年龄=789}/*行数据表*/)
}

winform.button2.oncommand = function(id,event){
	var c = {"姓名","年龄"}
	var t = {
			{姓名="aaa",年龄=123}
			{姓名="bbb",年龄=456}
			}
	winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,true/*字典转为数组*/,/*字符串转为Utf8*/)
	winform.vlist.setRowText(2,{"ccc",789}/*行数据表*/)
}

winform.button3.oncommand = function(id,event){
		var c = {"姓名","年龄"}
	var t = {
			{"aaa",123}
			{"bbb",456}
			}
	winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,/*字典转为数组*/,/*字符串转为Utf8*/)
	winform.vlist.setRowText(2,{"ccc",789}/*行数据表*/)
}

示例六:改变表头、内容的文本、背景、线条颜色

import win.ui;
import godking.vlistEx;

/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
button={cls="button";text="Button";left=320;top=510;right=490;bottom=570;z=2};
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=500;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/

var t = { fields={"序号","姓名","年龄","地址","身份证"} }
for(i=1;100;1){
    var tt={}
	tt["序号"]="[@rowindex]"  // 行序号标记是不允许编辑修改的
	tt["姓名"]=math.random(1000,9999)+"姓名"
	tt["年龄"]=math.random(10,99)
	tt["地址"]=math.random(1000,9999)+"地址"
	tt["身份证"]=math.random(1000,9999)+"身份证"
	..table.push(t,tt)
}
 
mainForm.vlist.checkBox.show = true;
mainForm.vlist.setHeaderHeight(50);
mainForm.vlist.fillParent(4)

mainForm.vlist.font = ::LOGFONT(name="宋体";point=12;color=0xFF0000 )/*【属性】项目文本字体*/ 
mainForm.vlist.bkColor = 0xFF9999
mainForm.vlist.lineColorV = 0x00FFFF
mainForm.vlist.lineColorH = 0xFFFF00

mainForm.vlist.headerFont = ::LOGFONT(name="黑体";h=16;color=0x0000FF )/*【属性】表头文本字体*/
mainForm.vlist.headerBkcolor = 0x99FFFF
mainForm.vlist.headerLineColor = 0x559999

mainForm.vlist.onSortColumn = function(col,desc){
	/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
	owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}

mainForm.vlist.setTable(t,/*标题或数组*/,{80,80,100,100,200}/*列宽或数组*/,2,/*字典转为数组*/,/*字符串转为Utf8*/)
mainForm.show();
win.loopMessage();

示例七:自定义数据适配器

import win.ui;
import godking.vlistEx
/*DSG{{*/
var winform = win.form(text="aardio form";right=749;bottom=699)
winform.add(
button={cls="button";text="上一页";left=190;top=620;right=300;bottom=670;z=2};
button2={cls="button";text="下一页";left=400;top=620;right=510;bottom=670;z=3};
vlistEx={cls="vlistEx";text="自定义控件";left=10;top=10;right=750;bottom=610;z=1}
)
/*}}*/

winform.show();
winform.vlistEx.setColumns({"编号","语文","数学"},{250,250,-1}/*列宽*/,/*格式*/)
var page = 1;
var c = winform.vlistEx.setCustomAdapter(21,function(row,col){
		if row==21 {
			if col == 1 return "平均分:";
			if col == 2 return "语文平均分:89";
			if col == 3 return "数学平均分:98";
		} else {
			var currow = (page-1)*20+row;
			if col = 1 return "NO.:"++currow; 
			return ..math.random(30,100); // 读取并返回单元格数据。这里用随机数代替。
		}
	})
winform.button.oncommand = function(id,event){
	if page>1 {
		page--;
		c.update();
	}
}
winform.button2.oncommand = function(id,event){
	page++;
	c.update();
}
win.loopMessage();

示例八:嵌入图片

定义图片的格式:

<img name="pic1",w=30,h=20,scale=true,full=false>

各部分解释:

<img >:嵌入图片标识,必须"<img"+空格开头,">"结尾,中间为图片参数设置。

name:图片名称,使用addImg(name,data)添加的图片name。

w:图片宽度。(0到1为比例,按照单元格有效区域计算,1为100%)

h:图片高度。(0到1为比例,按照单元格有效区域计算,1为100%)

scale:是否按比例缩放。如果为ture则在w和h范围内,按比例缩放到合适大小。如果为false则按w和h指定的范围拉伸填满。

full:填满单元格。如果为true,则忽略w、h设置,并自动根据单元格宽度、高度、scale设置进行绘制。full时,w不记入单元格内容总宽度,不占用单元格内容。放置于单元格内容的最前端,可以当做背景使用。放置于单元格内容最末尾,可以当做前景使用。

图片和文本混合使用:

mainForm.listview.addImg("pic1","/pic1.png");
mainForm.listview.addImg("pic2","/pic2.png");
var text = `我是文本<img name="pic1",w=30,h=20,scale=true>前面嵌入了一个图片,后面再嵌入一个图片<img name="pic2",w=20,h=10,scale=false>我这里又是一串文本,图片和文本顺序、数量均无要求`
mainForm.listview.setCellText(row,col,text);

例程代码:

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=599;bottom=449)
mainForm.add(
listview={cls="vlistEx";left=11;top=20;right=590;bottom=430;acceptfiles=1;aw=1;border=1;db=1;dl=1;dr=1;dt=1;hscroll=1;vscroll=1;z=1}
)
/*}}*/
 
mainForm.listview.addImg("bkpic","E:\图片素材\png\png_花边纸底纹\纸底纹\p4.png",,50,30)
mainForm.listview.addImg("ddd","E:\图片素材\png\png32_常用图标\alert.png",,20,20)
mainForm.listview.addImg("on","C:\Users\Administrator\Desktop\on.png",,50,20)
mainForm.listview.addImg("off","C:\Users\Administrator\Desktop\off.png",,50,20)
mainForm.listview.padding = 0;
mainForm.listview.headerBkcolor = 0xFFEFEF;
var t = {}
for(i=1;100;1){
	..table.push(t,{"<img name='ddd',w=20,h=20>索引","[@rowindex]","<img name='bkpic',full=true>有背景图片<img name='ddd',w=20,h=20>还有图片","<img name='on',w=50,h=20,scale=1>","asfdjasdaslf","等待中"})//使用行索引标识符
}
mainForm.listview.setTable(t)
mainForm.listview.setColumns({"<img name='ddd',w=20,h=20>序号","文件","文件路径","当前状态","备注"},{80,50,200,80,150},1)
mainForm.listview.checkBox.show = true
mainForm.listview.setSortMark("<img name='ddd',w=30,h=30,scale=true>" /*升序符号*/,"▼" /*降序符号*/)
mainForm.show();
mainForm.listview.onClick = function(row/*行*/,col/*列*/){
	if col==4{
		if mainForm.listview.getCellImg(row,col)=="on" 
			mainForm.listview.setCellImg(row,col,"off")
		else  mainForm.listview.setCellImg(row,col,"on")
	}
}
win.loopMessage();

 例程效果:

示例九:树形图

1、每个项目使用 "[@treeLevel]" 属性设置其树形的缩进层次,从0开始,0代表根级,子级比父级数值大1。

2、每个项目使用 "[@treeImg]" 属性设置其节点图片。当某项目包含子项目时,也可以使用tree.nodeImg属性进行统一设置这些项目图片。[@treeImg]优先级大于tree.nodeImg

效果:

代码:

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=759;bottom=449)
mainForm.add(
listview={cls="vlistEx";left=10;top=10;right=749;bottom=440;acceptfiles=1;aw=1;db=1;dl=1;dr=1;dt=1;hscroll=1;vscroll=1;z=1}
)
/*}}*/
mainForm.listview.setColumns("索引,内容",200/*列宽*/,/*格式*/)
var tree = {0,1,2,3,3,3,3,2,3,3,1,1,2,3,0,1,2,2,1,1,2,2,3,3,0,1,2,3,3,3,1}
var t = {}
for(i=1;#tree;1){
	..table.push(t,{"[@rowindex]","单元格内容", "[@treeLevel]"=tree[i] })
}
mainForm.listview.setTable(t);
mainForm.listview.refreshTree();
mainForm.listview.tree.show = true
mainForm.show()
win.loopMessage();

示例十:自定义自绘函数

本虚表库提供三个自绘函数,根据情况选择使用:

drawCellBg = function(row,col,hdc,rc,bkcolor,text){
	/*绘制单元格背景,返回ture则忽略原背景,否则继续绘制原背景。注意:该背景包含padding部分,而padding以外的部分会被有效区域背景遮盖*/
	__
}
drawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
	/*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
	__
}
drawCellRectBg = function(row,col,hMemDc,rc,bkcolor,text){
	/*绘制单元格有效区域背景(不含内容),返回ture则忽略原有效区域背景,否则继续绘制有效区域原背景*/
	/*如果定义的drawCellRect()函数返回true,则本函数无效。*/
	__
}

效果:

 代码:

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=570;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/

var t = { fields={"序号","进度"} };
for(i=1;100;1){
    var tt={};
	tt["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
	tt["进度"]=math.random(0,100);
	..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
mainForm.vlist.onSortColumn = function(col,desc){
	/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
	owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}

mainForm.vlist.onDrawCellRectBg = function(row,col,hdc,rc,bkcolor,text){
	/*绘制单元格有效区域背景(不含内容),返回ture则忽略原有效区域背景,否则继续绘制有效区域原背景*/
	/*如果定义的drawCellRect()函数返回true,则本函数无效。*/
	if col==2 {
		gdi.fillRect(hdc,bkcolor,rc)
		rc.right=rc.left+math.round(rc.width()*tonumber(text)/100,2)
		gdi.fillRect(hdc,0xFF00FF,rc)
		return true;
	} 
} 

mainForm.show();
win.loopMessage();
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=570;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
 
var t = { fields={"序号","进度"} };
for(i=1;100;1){
    var tt={};
	tt["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
	tt["进度"]=math.random(0,100);
	..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
mainForm.vlist.onSortColumn = function(col,desc){
	/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
	owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}
mainForm.vlist.onDrawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
	/*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
	if col==2 {
		gdi.fillRect(hdc,0xEEBBFF,rc)
		var rc1=table.clone(rc)
		rc1.right=rc1.left+math.round(rc1.width()*tonumber(text)/100,2)
		gdi.fillRect(hdc,0xFF00FF,rc1)
		gdi.drawText(hdc,font,text++"%",rc,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
		return true;
	} 	
}
mainForm.show();
win.loopMessage();
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=570;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
 
var t = { fields={"序号","进度"} };
for(i=1;100;1){
    var tt={};
	tt["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
	tt["进度"]=math.random(0,100);
	..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
mainForm.vlist.onSortColumn = function(col,desc){
	/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
	owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}
mainForm.vlist.onDrawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
	/*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
	if col==2 {
		gdi.fillRect(hdc,0xEECCFF,rc);
		var w = math.round(rc.width()*tonumber(text)/100);
		for(i=0;w-1;5){
			var left = rc.left+i;
			var right = rc.left+i+4;
			if right>left+w right=left+w;
			var rect = ::RECT(left,rc.top,right,rc.bottom);
			gdi.fillRect(hdc,0x55cc55,rect);
		}
		var f = ..table.clone(font)
		f.color=0xFFFFFF
		var rc1=table.clone(rc)
		rc1.offset(-1,-1)
		gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
		rc1.offset(2,2)
		gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
		rc1.offset(-2,0)
		gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
		rc1.offset(2,-2)
		gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
		font.color = 0x0000FF
		gdi.drawText(hdc,font,text++"%",rc,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
		return true;
	} 	
}
mainForm.show();
win.loopMessage();

  • 14
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
Windows Usb热插拔是指在Windows操作系统中,当USB设备插入或拔出时,系统能够自动检测并做出相应的响应。在程序中实现USB热插拔的功能,可以通过注册USB设备信息和监测USB设备插拔事件来实现。 在程序初始化时,可以通过注册USB设备信息来响应USB热插拔事件。这可以通过调用RegisterDeviceNotification函数来实现。在注册USB设备信息时,需要指定设备类型为DBT_DEVTYP_DEVICEINTERFACE,并传入相应的设备接口信息。具体的注册过程可以参考引用\[1\]中的代码示例。 另外,还可以使用第三方来实现USB转串口设备的热插拔检测。例如,可以使用CH343PT中的接口CH343PT_SetDevNotify来实现USB转串口设备的热插拔检测。具体的使用方法可以参考引用\[3\]中的介绍。 总结起来,Windows Usb热插拔可以通过注册USB设备信息和监测USB设备插拔事件来实现。具体的实现方法可以根据需求选择使用系统提供的函数或第三方来完成。 #### 引用[.reference_title] - *1* [windows下USB检测插拔状态](https://blog.csdn.net/qq_22642239/article/details/110451792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [CH343PT使用一>USB转串口设备的热插拔检测](https://blog.csdn.net/WCH_TechGroup/article/details/127514913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值