用godking.comboboxEx库制作磁盘下拉列表

Mr_MAO 4天前 233

(原标题:《利用gdip.chart库制作磁盘使用情况的图表》  本来只想介绍一下gdip.chart,奈何内容浮浅没有营养,光庆大神关于comoboxEx控件的讨论成了本帖的亮点)

aardio最近的版本增加了gdip,chart库,现在做简单图表非常方便了,简单试用了一下(用到了光神的godking.comboboxEx),分享给初学者,图表的显示效果很不错!

import win.ui;
import godking.comboboxEx;
import sys.volume;
import fsys.info;
/*DSG{{*/
var winform = win.form(text="gdip.chart - 练习";right=903;bottom=583)
winform.add(
comboboxEx={cls="comboboxEx";left=32;top=32;right=280;bottom=66;bgcolor=0x008000;dl=1;dt=1;mode="dropdown";z=1};
plus={cls="plus";left=32;top=88;right=872;bottom=552;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;dt=1;edge=1;z=2};
static={cls="static";text="磁盘使用信息";left=304;top=40;right=872;bottom=64;center=1;dl=1;dr=1;dt=1;transparent=1;z=3}
)
/*}}*/

// 导入饼图类
import gdip.chart.pie;
var chartPie = gdip.chart.pie(winform.plus)

chartPie.dataset = {    
    //pie
    data = [0, 0];
    labels = ["未使用", "已使用"]; 
    colors = [0xFF00f930/*绿色*/, 0xFFE67E22/*紫色*/];
    showPercentage = true;
};

//下拉磁盘列表
import win.imageList; 
var imglst = win.imageList(32, 32) 

var driveNames = {}
var driveValues = {}
var localDrives = sys.volume.getLogicalDrives();
for (i=1; #localDrives; 1) {
	//加text、value
    var info = sys.volume.getInfo(localDrives[i]);
    var driveName = info.drive;
    table.push(driveNames, driveName ++ " (" ++ ((#info.label)?info.label:"本地磁盘") ++ ")") 
    table.push(driveValues, driveName) 
    
    //加icon
    var sfi = fsys.info.get(driveName, 0x100/*_SHGFI_ICON*/ |  0/*_SHGFI_LARGEICON*/);
    var handle = sfi.hIcon
    imglst.addBitmap( gdip.bitmap(handle,1).copyHandle(32,32) )
}

winform.comboboxEx.setImageList(imglst)
winform.comboboxEx.setFont(h=-16;name="宋体");
winform.comboboxEx.setItems(driveNames,,driveValues)
winform.comboboxEx.text ="👇 请下拉选择一个驱动器"

//选中下拉选项后触发该事件
winform.comboboxEx.onOk = function(){ 
    if( owner.text !==  owner.selText) {
        // 获取分区空间信息
        var deviceData = sys.volume.getSpaceSize(owner.getItem(owner.selIndex).value);
        var totalB = deviceData.totalSize;
        var freeB = deviceData.freeSize;
        var usedB = totalB-freeB;
        
        winform.static.text = "【"
        winform.static.text += owner.getItem(owner.selIndex).value ++ "\ 】 ";
        winform.static.text += "  总大小:" ++ math.size64(totalB).format();
        winform.static.text += " (已使用:" ++ math.size64(usedB).format();
        winform.static.text += "  /  剩余:" ++ math.size64(freeB).format() ++ ")";
        
        //更新pie图中的数据
        chartPie.dataset.data = [freeB, usedB]
        winform.plus.redrawTransparent()
        
        thread.invoke(function(winform){
            winform.plus.setFocus();
        },winform)
        
    }
}

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


最新回复 (11)
  • shzhbook 3天前
    0 2
    顶,支持大佬多发与实际应用相关的例程。
  • 光庆 2天前
    0 3

    comboboxEx库新版本增加了 readonly 属性,可设置编辑框文字为不可编辑,增强了功能和效果,可简化部分操作。

    只需简单一句:

    winform.comboboxEx.readonly = true;

    可以不用如下这样处理了,而且内容不可修改:

    thread.invoke(function(winform){
        winform.plus.setFocus();
    },winform)

    调整后的完整代码如下:

    import win.ui;
    import godking.comboboxEx;
    import sys.volume;
    import fsys.info;
    /*DSG{{*/
    var winform = win.form(text="gdip.chart - 练习";right=903;bottom=583)
    winform.add({
    comboboxEx={cls="comboboxEx";left=32;top=32;right=280;bottom=395;bgcolor=0x008000;dl=1;dt=1;mode="dropdown";z=1};
    plus={cls="plus";left=32;top=88;right=872;bottom=552;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;dt=1;edge=1;z=2};
    static={cls="static";text="磁盘使用信息";left=304;top=40;right=872;bottom=64;center=1;dl=1;dr=1;dt=1;transparent=1;z=3}
    })
    /*}}*/
    
    // 导入饼图类
    import gdip.chart.pie;
    var chartPie = gdip.chart.pie(winform.plus)
    
    chartPie.dataset = {    
        //pie
        data = [0, 0];
        labels = ["未使用", "已使用"]; 
        colors = [0xFF00f930/*绿色*/, 0xFFE67E22/*紫色*/];
        showPercentage = true;
    };
    
    //下拉磁盘列表
    import win.imageList; 
    var imglst = win.imageList(32, 32);
    
    var driveNames = {}
    var driveValues = {}
    var localDrives = sys.volume.getLogicalDrives();
    for (i=1; #localDrives; 1) {
        //加text、value
        var info = sys.volume.getInfo(localDrives[i]);
        var driveName = info.drive;
        table.push(driveNames, driveName ++ " (" ++ ((#info.label)?info.label:"本地磁盘") ++ ")") 
        table.push(driveValues, driveName) 
        
        //加icon
        var sfi = fsys.info.get(driveName, 0x100/*_SHGFI_ICON*/ |  0/*_SHGFI_LARGEICON*/);
        var handle = sfi.hIcon
        imglst.addBitmap( gdip.bitmap(handle,1).copyHandle(32,32) )
    }
    
    winform.comboboxEx.setImageList(imglst);
    winform.comboboxEx.setFont(h=-16;name="宋体");
    winform.comboboxEx.setItems(driveNames,,driveValues);
    winform.comboboxEx.text ="👇 请下拉选择一个驱动器";
    
    //选中下拉选项后触发该事件
    winform.comboboxEx.onOk = function(){ 
        if( owner.text !==  owner.selText) {
            // 获取分区空间信息
            var deviceData = sys.volume.getSpaceSize(owner.getItem(owner.selIndex).value);
            var totalB = deviceData.totalSize;
            var freeB = deviceData.freeSize;
            var usedB = totalB-freeB;
            
            winform.static.text = "【"
            winform.static.text += owner.getItem(owner.selIndex).value ++ "\ 】 ";
            winform.static.text += "  总大小:" ++ math.size64(totalB).format();
            winform.static.text += " (已使用:" ++ math.size64(usedB).format();
            winform.static.text += "  /  剩余:" ++ math.size64(freeB).format() ++ ")";
            
            //更新pie图中的数据
            chartPie.dataset.data = [freeB, usedB];
            winform.plus.redrawTransparent();
        }
    }
    
    winform.comboboxEx.readonly = true;
    winform.show();
    win.loopMessage();


  • 光庆 2天前
    0 4

    你的代码里的:

    thread.invoke(function(winform){
        winform.plus.setFocus();
    },winform)

    可以用如下代码替换,达到同样效果,而不用启动新线程:

    winform.setTimeout(λ()winform.plus.setFocus());


  • Mr_MAO 2天前
    0 5
    感谢光神指点!! 有个小建议:comboboxEx中的icon位置如果能往右平移3px∽5px,显示效果更好一点!
  • 光庆 2天前
    0 6
    Mr_MAO 感谢光神指点!! 有个小建议:comboboxEx中的icon位置如果能往右平移3px∽5px,显示效果更好一点!

    项目右移,试试 winform.comboboxEx.setItems(driveNames,,driveValues,1);

    如果是这里:

    这个是因为你的图标是扁的。实际效果是图标上边和左边,距离应该是一致的吧。可以通过图标调节。

  • Mr_MAO 2天前
    0 7

    这个意思↓

  • 光庆 2天前
    0 8
    Mr_MAO 这个意思↓

    import win.ui;
    import godking.comboboxEx;
    import sys.volume;
    import fsys.info;
    /*DSG{{*/
    var winform = win.form(text="gdip.chart - 练习";right=903;bottom=583)
    winform.add({
    comboboxEx={cls="comboboxEx";left=32;top=32;right=280;bottom=395;bgcolor=0x008000;dl=1;dt=1;mode="dropdown";z=1};
    plus={cls="plus";left=32;top=88;right=872;bottom=552;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;dt=1;edge=1;z=2};
    static={cls="static";text="磁盘使用信息";left=304;top=40;right=872;bottom=64;center=1;dl=1;dr=1;dt=1;transparent=1;z=3}
    })
    /*}}*/
    
    // 导入饼图类
    import gdip.chart.pie;
    var chartPie = gdip.chart.pie(winform.plus)
    
    chartPie.dataset = {    
        //pie
        data = [0, 0];
        labels = ["未使用", "已使用"]; 
        colors = [0xFF00f930/*绿色*/, 0xFFE67E22/*紫色*/];
        showPercentage = true;
    };
    
    //下拉磁盘列表
    import win.imageList; 
    var imglst = win.imageList(40, 32);
    
    var driveNames = {}
    var driveValues = {}
    var localDrives = sys.volume.getLogicalDrives();
    for (i=1; #localDrives; 1) {
        //加text、value
        var info = sys.volume.getInfo(localDrives[i]);
        var driveName = info.drive;
        table.push(driveNames, driveName ++ " (" ++ ((#info.label)?info.label:"本地磁盘") ++ ")") 
        table.push(driveValues, driveName) 
        
        //加icon
        var sfi = fsys.info.get(driveName, 0x100/*_SHGFI_ICON*/ |  0/*_SHGFI_LARGEICON*/);
        import godking.paint
        var p1 = godking.paint.fromBitmap(sfi.hIcon /*图标句柄*/,1/*_IMAGE_ICON*/)
        var p2 = godking.paint(40 /*宽度*/,32/*高度*/,/*背景颜色*/,/*背景图像*/)
        p2.drawImageF( 8/*x*/,0/*y*/,32/*宽*/,32/*高*/,p1.bitmap/*图片*/,/*透明度或图片属性*/,/*保持比例*/)
        imglst.addBitmap( p2.bitmap.copyHandle())
        p1.close()
        p2.close()
    }
    winform.comboboxEx.setImageList(imglst);
    winform.comboboxEx.setFont(h=-16;name="宋体");
    winform.comboboxEx.setItems(driveNames,,driveValues);
    winform.comboboxEx.text ="👇 请下拉选择一个驱动器";
    //选中下拉选项后触发该事件
    winform.comboboxEx.onOk = function(){ 
        if( owner.text !==  owner.selText) {
            // 获取分区空间信息
            var deviceData = sys.volume.getSpaceSize(owner.getItem(owner.selIndex).value);
            var totalB = deviceData.totalSize;
            var freeB = deviceData.freeSize;
            var usedB = totalB-freeB;
            
            winform.static.text = "【"
            winform.static.text += owner.getItem(owner.selIndex).value ++ "\ 】 ";
            winform.static.text += "  总大小:" ++ math.size64(totalB).format();
            winform.static.text += " (已使用:" ++ math.size64(usedB).format();
            winform.static.text += "  /  剩余:" ++ math.size64(freeB).format() ++ ")";
            
            //更新pie图中的数据
            chartPie.dataset.data = [freeB, usedB];
            winform.plus.redrawTransparent();
        }
    }
    
    winform.comboboxEx.readonly = true;
    winform.show();
    win.loopMessage();


  • 近我者赤 2天前
    0 9
    光庆 import win.ui; import godking.comboboxEx; import sys.volume; import&am ...

     

    我的aardio目录:D:\Program Files (x86)\aardio\lib\godking\paint

  • 光庆 2天前
    0 10
    近我者赤  我的aardio目录:D:\Program Files (x86)\aardio\lib\godking\paint
    是不是最新版库?
  • Mr_MAO 2天前
    0 11

    ,偏移贴图,巧妙解决!

  • 近我者赤 2天前
    0 12
    光庆 是不是最新版库?

    是的。我多选的好几个库一起下的,就有问题,

    现在单独新下了paint库,可以了

返回