【第十章 10.4】列表框控件listbox -- GDI+自绘

贴主:admin 发贴:2024-08-09 08:54 浏量:11

效果演示:

代码:

// 导入 win.ui 库,用于创建图形界面
import win.ui;  
/*DSG{{*/
// 创建一个名为 winform 的窗口对象,并设置其属性
winform = win.form(text="listbox 自绘演示(GDI+)";right=973;bottom=619)  
// 向窗口中添加一个列表框控件,并设置其属性
winform.add(
    listbox={cls="listbox";left=41;top=18;right=950;bottom=597;bgcolor=16777215;db=1;dl=1;dr=1;dt=1;items={};ownerDraw=1;z=1}
)
/*}}*/

// 列表框的测量项事件处理函数
winform.listbox.onMeasureItem = function(measureItem,dpiScaleX,dpiScaleY){
    // 注意:列表框的实际高度受行高的影响,只有自绘时才能设置行高
    // 设置列表项的高度
    measureItem.itemHeight = 61 * dpiScaleY;  
}

// 导入 gdip 库,用于 GDI+ 绘图
import gdip;  
// 列表框的绘制项事件处理函数
winform.listbox.onDrawItem = function(drawItem,dpiScaleX,dpiScaleY){
    // 获取绘制项的矩形区域
    var rc = drawItem.rcItem;  
    // 创建画板
    var graphics = gdip.graphics(drawItem.hDC);  
    // 创建背景刷子
    var brush = gdip.solidBrush(0xFFFFFFFF);  
    // 填充矩形区域为白色
    graphics.fillRectangle(brush,rc.left,rc.top,rc.width(),rc.height())  
    // 释放背景刷子
    brush.delete();  
    // 画选区渐变背景
    if( drawItem.itemState & 0x1/*_ODS_SELECTED*/){  
        // 定义渐变起始和终止坐标
        var p1 = ::POINTF(rc.left,rc.top)  
        var p2 = ::POINTF(rc.left,rc.bottom)  
        // 创建线性渐变刷子
        var lineBrush = gdip.lineBrush(p1/*渐变起始坐标*/, p2 /*渐变终止坐标*/, 0x2FFFFFFF/*起始颜色*/, 0xFFFFFFE0/*结束颜色*/, 2/*_GdipWrapModeTileFlipY*/ )  
        // 填充矩形区域为渐变颜色
        graphics.fillRectangle(lineBrush,rc.left,rc.top,rc.width(),rc.height());  
        // 释放线性渐变刷子
        lineBrush.delete()  
    }  
    // 第二个项目开始顶部画线
    if( drawItem.itemID > 0 ){  
        // 创建画笔
        var pen = gdip.pen(0xFFDCDCCC,1);  
        // 绘制顶部线条
        graphics.drawLine(pen, rc.left,rc.top,rc.right,rc.top);  
        // 释放画笔
        pen.delete()  
    }  
    // 获取字体
    var font = gdip.font(drawItem.hDC);  
    var strformat = gdip.stringformat ();  
    // 获取列表项的文本
    var str = winform.listbox.getItemText(drawItem.itemID + 1);  
    // 创建刷子
    var brush = gdip.solidBrush(0xFF222222);  
    // 在指定位置绘制文本
    graphics.drawString( str, font, rc.inflate(-16,-16).float(), strformat,brush);  
    // 释放对象
    font.delete();  
    strformat.delete();  
    brush.delete();  
    // 释放画板
    graphics.delete();  
}  

// 使用 for 循环向列表框添加文本
for(i=1;10;2){  
    winform.listbox.add("控件属性面板中点击「行为 / 自绘」设为 true");
    winform.listbox.add("也就是在控件创建参数里添加 ownerDraw=true");
}  

// 启用窗口的 DPI 缩放
winform.enableDpiScaling();  
// 显示窗口
winform.show();  
// 返回并启动界面线程消息循环
return win.loopMessage();


相关回复


    暂无评论!

发表回复