【第十章 10.4】列表框控件listbox -- GDI+自绘
效果演示:
代码:
// 导入 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();
相关回复
-
暂无评论!