虚表图片专题文章: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();
数据格式(字典、数组)要与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();
定义图片的格式:
="pic1",w=30,h=20,scale=true,full=false>
各部分解释:
:嵌入图片标识,必须""+空格开头,">"结尾,中间为图片参数设置。
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 = `我是文本前面嵌入了一个图片,后面再嵌入一个图片我这里又是一串文本,图片和文本顺序、数量均无要求`
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,{"索引","[@rowindex]","有背景图片还有图片","","asfdjasdaslf","等待中"})//使用行索引标识符
}
mainForm.listview.setTable(t)
mainForm.listview.setColumns({"序号","文件","文件路径","当前状态","备注"},{80,50,200,80,150},1)
mainForm.listview.checkBox.show = true
mainForm.listview.setSortMark("" /*升序符号*/,"▼" /*降序符号*/)
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();
例程效果:
每个项目使用 "[@treeLevel]" 属性设置其树形的缩进层次。从0开始。0代表根级。子级比父级数值大1。
效果:
代码:
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.drawCellRectBg = 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.drawCellRect = 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.drawCellRect = 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();