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

贴主:admin 发贴:2024-08-09 08:44 浏量:28

列表框控件位置:

演示:

自绘开启为true;

代码:

//GDI自绘
// 导入 win.ui 库,用于创建图形界面
import win.ui;  
/*DSG{{*/
// 创建一个名为 winform 的窗口对象,并设置其属性
var winform = win.form(text="listbox自绘(GDI方式)";right=757;bottom=467)  
// 向窗口中添加一个列表框控件,并设置其属性
winform.add(
    listbox={cls="listbox";left=12;top=11;right=745;bottom=457;bgcolor=16777215;db=1;dl=1;dr=1;dt=1;items={};ownerDraw=1;vscroll=1;z=1}
)
/*}}*/

// 列表框的测量项事件处理函数
winform.listbox.onMeasureItem = function(measureItem,dpiScaleX,dpiScaleY){  
    // 设置列表项的高度
    measureItem.itemHeight = 61 * dpiScaleY;  
}

// 列表框的绘制项事件处理函数
winform.listbox.onDrawItem = function(drawItem,dpiScaleX,dpiScaleY){  
    // 使用 GDI 进行绘制操作
    gdi.selectBrush(  
        function(hdc,pen,brush){  
            // 获取绘制项的矩形区域
            var rc = drawItem.rcItem;  
            // 填充矩形区域为白色
            gdi.fillRect(hdc,0xFFFFFF,rc);  
            // 如果项的索引大于 0,绘制顶部线条
            if (drawItem.itemID > 0) {  
                /*
                  在 gdi.drawLine(hdc,rc.left, rc.top,rc.right, rc.top) 中: 
                  hdc:指定绘图设备的句柄。
                   rc.left、rc.top:表示起始点的横坐标和纵坐标。
                   rc.right、rc.top:表示结束点的横坐标和纵坐标。该函数会从起始点到结束点绘制一条直线。
                 */
                gdi.drawLine(hdc,rc.left, rc.top,rc.right, rc.top);
            }  
            // 如果项被选中
            if (drawItem.itemState & 1/*_ODS_SELECTED*/) {  
                // 填充渐变色
                gdi.fillGradient(hdc,rc,0xFFFFFF, 0xFFC4B5,1/*_GRADIENT_FILL_RECT_V*/)
            }  
            // 获取列表项的文本
            var str = winform.listbox.getItemText(drawItem.itemID + 1);  
            // 创建字体对象
            var font = ::LOGFONT(weight=400;point=10;color=0x000000);  
            // 在指定位置输出文本
            gdi.textOut(hdc,font,str,rc.left + 18/dpiScaleX, rc.top + 26/dpiScaleY);  
        },drawItem.hDC,0xF5FDFF/*背景色*/,0xEEEEEE/*画笔色*/)
}

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

// 显示窗口
winform.show();
// 启动界面线程消息循环
win.loopMessage();

  水平渐变 或者 垂直渐变: 

// 水平渐变填充
gdi.fillGradient(dc,rect,0xFF0000,0x0000FF,0/*_GRADIENT_FILL_RECT_H*/);
// 垂直渐变填充
gdi.fillGradient(dc,rect,0xFF0000,0x0000FF,1/*_GRADIENT_FILL_RECT_V*/);


相关回复


    暂无评论!

发表回复