|
楼主 |
发表于 2018-9-17 22:39:09
|
显示全部楼层
追更一下:
估计有些人喜欢右侧的【打开】和【文件夹】一直显示着,所以这次主要把右侧功能区显示限制解除,并完善了下鼠标在右侧功能区的hover效果和点击效果。可以直接移动过去想点哪就点哪了。
增加启动即提示选择要显示的文件夹功能。
代码还没整理有点乱,看官们多包涵。
- //GDI自绘
- import fsys;
- import fsys.info;
- import fsys.file;
- import fsys.dlg;
- import win.imageList;
- import process;
- import fonts.fontAwesome;
- import win.ui;
- /*DSG{{*/
- var winform = win.form(text="listbox自绘(GDI方式)";right=778;bottom=445;border="dialog frame")
- winform.add(
- button={cls="button";text="增加行";left=0;top=385;right=779;bottom=436;db=1;dl=1;dr=1;z=2};
- listbox={cls="listbox";left=0;top=0;right=779;bottom=376;bgcolor=16777215;clipch=1;db=1;dl=1;dr=1;dt=1;items={};msel=1;ownerDraw=1;vscroll=1;z=1}
- )
- /*}}*/
- var listboxsel = null;
- var beforesel = null;
- var colorsel = false;
- var opensel = false;
- var filesel = false;
- var filename;
- var boxTab = {};
- var dirPath;
- if( !io.exist(dirPath) ) dirPath = fsys.dlg.opendir()
- if(!dirPath) dirPath = "D:";
- //自定义列表项高度
- winform.listbox.onMeasureItem = function(measureItem,dpiScaleX,dpiScaleY){
- measureItem.itemHeight = 81 * dpiScaleY;
- }
- //自绘列表项
- winform.listbox.onDrawItem = function(drawItem,dpiScaleX,dpiScaleY){
- //选择画刷
- gdi.selectBrush(
-
- function(hdc,pen,brush){
-
- //获取需要显示的数据
- var strTab = winform.listbox.getItemText(drawItem.itemID + 1);
-
- //字符串转表对象( table )。
- strTab = eval(strTab);
-
- var rc = drawItem.rcItem;
- gdi.fillRect(hdc,0xFFFFFF,rc);
- if (drawItem.itemID > 0) {
- gdi.drawLine(hdc,rc.left, rc.top,rc.right, rc.top);
- }
- if (drawItem.itemState & 1/*_ODS_SELECTED*/) {
- gdi.fillRect(hdc,0xFFF5E2,rc);
- }else {
- if(listboxsel == (drawItem.itemID+1)){
- gdi.fillRect(hdc,0xEEB7FF,rc);
- }
- }
-
- //字体
- var font;
-
- //删除文件
- if(colorsel){
- var x,y = win.getMessagePos();
- var item = winform.listbox.hitTest(x,y,true);
- if((drawItem.itemID+1) == item){
- font = ::LOGFONT(weight=700;color=0x6112FF;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF057',rc.width()/2+345*dpiScaleX, rc.top+20);
- }
- else {
- font = ::LOGFONT(weight=700;color=0x9C9C9C;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF057',rc.width()/2+345*dpiScaleX, rc.top+20);
- }
- }else {
- font = ::LOGFONT(weight=700;color=0x9C9C9C;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF057',rc.width()/2+345*dpiScaleX, rc.top+20);
- }
-
- if(opensel){
- var x,y = win.getMessagePos();
- var item = winform.listbox.hitTest(x,y,true);
- if((drawItem.itemID+1) == item){
- font = ::LOGFONT(weight=500;color=0x6112FF;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF0F6 打开',rc.width()/2+190*dpiScaleX, rc.top+20);
- }else {
- font = ::LOGFONT(weight=300;color=0x9C9C9C;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF0F6 打开',rc.width()/2+190*dpiScaleX, rc.top+20);
- }
-
- }else {
- font = ::LOGFONT(weight=300;color=0x9C9C9C;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF0F6 打开',rc.width()/2+190*dpiScaleX, rc.top+20);
- }
-
- if(filesel){
- var x,y = win.getMessagePos();
- var item = winform.listbox.hitTest(x,y,true);
- if((drawItem.itemID+1) == item){
- font = ::LOGFONT(weight=500;color=0x6112FF;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF115 文件夹',rc.width()/2+260*dpiScaleX, rc.top+20);
- }else {
- font = ::LOGFONT(weight=300;color=0x9C9C9C;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF115 文件夹',rc.width()/2+260*dpiScaleX, rc.top+20);
- }
- }else {
- font = ::LOGFONT(weight=300;color=0x9C9C9C;name='FontAwesome';h=-12*dpiScaleY);
- gdi.textOut(hdc,font,'\uF115 文件夹',rc.width()/2+260*dpiScaleX, rc.top+20);
- }
- //文件图标
- win.imageList.shell(0/*_SHIL_LARGE*/).draw(strTab.iImage,hdc,rc.left+20*dpiScaleX,rc.top+10*dpiScaleX);
- //文件名
- font = ::LOGFONT(weight=400;color=0x000000;h=-12*dpiScaleY);
- //gdi.textOut(hdc,font,strTab.text,rc.left+60*dpiScaleX, rc.top+5*dpiScaleY);
- gdi.drawText(hdc,font,strTab.text,::RECT(rc.left+60*dpiScaleX,rc.top,rc.right-rc.width()/2,rc.bottom),0x8000/*_DT_END_ELLIPSIS*/);
- //文件大小
- font = ::LOGFONT(weight=300;color=0xB0B0B0;h=-12*dpiScaleY);
- gdi.textOut(hdc,font,strTab.size,rc.left+60*dpiScaleX, rc.top+20*dpiScaleY);
-
- },drawItem.hDC,0xF5FDFF/*背景色*/,0xEEEEEE/*画笔色*/)
- }
-
- winform.listbox.wndproc = function(hwnd,message,wParam,lParam){
- select(message) {
- case 0x200/*_WM_MOUSEMOVE*/ {
- var x,y = win.getMessagePos();
- var item = winform.listbox.hitTest(x,y,true);
- if(item == null){
- return ;
- }
-
- var dpiScaleX,dpiScaleY = winform.listbox.dpiScale(1,1);
-
- if(listboxsel == item){ /* 若鼠标在同一行item内游动 */
- x,y = win.toClient(winform.listbox.hwnd,x,y);
- for(i=1;3;1){
- select(i) {
- case 1 { //open
- var rc = winform.listbox.getItemRect(item);
- rc.left = rc.width()/2+190*dpiScaleX;
- rc.right = rc.left+60*dpiScaleX;
- rc.top = rc.top+10*dpiScaleX;
- rc.bottom = rc.bottom-10*dpiScaleX ;
-
- //判断鼠标游动的区间是不是在[删除]按钮范围
- if( rc.contains(x,y) ){
- if(opensel == false){ //鼠标从[删除]按钮外部移动到内部区域
- opensel = true;
- //设置更新区,并更新
- winform.listbox.invalidate(winform.listbox.getItemRect(item))
- winform.listbox.update();
- break ;
- }
- continue ; //一直在内部区域游动,则不更新
- }else {
- if(opensel == true){ //鼠标从内到外
- opensel = false;
- //设置更新区,并更新
- winform.listbox.invalidate(winform.listbox.getItemRect(item))
- winform.listbox.update();
- break ;
- }
- continue ; //一直在外部区域游动,则不更新
- }
-
-
- }
- case 2 { //file
- var filerc = winform.listbox.getItemRect(item);
- filerc.left = filerc.width()/2+260*dpiScaleX;
- filerc.right = filerc.left+70*dpiScaleX;
- filerc.top = filerc.top+10*dpiScaleX;
- filerc.bottom = filerc.bottom-10*dpiScaleX ;
- //判断鼠标游动的区间是不是在[删除]按钮范围
- if( filerc.contains(x,y) ){
- if(filesel == false){ //鼠标从[删除]按钮外部移动到内部区域
- filesel = true;
- //设置更新区,并更新
- winform.listbox.invalidate(winform.listbox.getItemRect(item))
- winform.listbox.update();
- break;
- }
- continue ; //一直在内部区域游动,则不更新
- }else {
- if(filesel == true){ //鼠标从内到外
- filesel = false;
- //设置更新区,并更新
- winform.listbox.invalidate(winform.listbox.getItemRect(item))
- winform.listbox.update();
- break ;
- }
- continue ; //一直在外部区域游动,则不更新
- }
-
- }
- case 3 { //del
- var delrc = winform.listbox.getItemRect(item);
- delrc.left = delrc.width()/2+345*dpiScaleX;
- delrc.top = delrc.top+10*dpiScaleX;
- delrc.bottom = delrc.bottom-10*dpiScaleX ;
-
- //判断鼠标游动的区间是不是在[删除]按钮范围
- if( delrc.contains(x,y) ){
- if(colorsel == false){ //鼠标从[删除]按钮外部移动到内部区域
- colorsel = true;
- //设置更新区,并更新
- winform.listbox.invalidate(winform.listbox.getItemRect(item))
- winform.listbox.update();
- break;
- }
- continue ; //一直在内部区域游动,则不更新
- }else {
- if(colorsel == true){ //鼠标从内到外
- colorsel = false;
- //设置更新区,并更新
- winform.listbox.invalidate(winform.listbox.getItemRect(item))
- winform.listbox.update();
- break ;
- }
- continue ; //一直在外部区域游动,则不更新
- }
- }
- }
- }
- return ;
- }
- else {
- //设置hover效果
- listboxsel = item;
- if(beforesel == null){ //第一次执行,初始化
- beforesel = listboxsel;
-
- }else {
- //先关闭上次绘制区域
- if(beforesel){
- winform.listbox.invalidate(winform.listbox.getItemRect(beforesel),0)
- }
- beforesel = listboxsel;
- }
- //绘制当前区域
- winform.listbox.invalidate(winform.listbox.getItemRect(item));
- winform.listbox.update();
- }
- }
- case 0x202/*_WM_LBUTTONUP*/ {
- //删除功能
- if(colorsel){ /* 若鼠标在删除按钮区域内单击了 */
- var selindex = winform.listbox.selIndex
- var strTab = winform.listbox.getItemText(selindex);
- var tabStr = eval(strTab)
- var ret = winform.msgboxTest("您确定要删除 ["++tabStr.text++"] 文件吗?");
- if(ret){
- winform.listbox.delete(selindex);
- colorsel = false;
- }
- return ;
- };
- //打开文件
- if(opensel){ /* 若鼠标在打开按钮区域内单击了 */
- var selindex = winform.listbox.selIndex
- var strTab = winform.listbox.getItemText(selindex);
- var tabStr = eval(strTab)
- process.execute(tabStr.filePath);
- return ;
- }
- //打开文件夹
- if(filesel){ /* 若鼠标在打开按钮区域内单击了 */
- var selindex = winform.listbox.selIndex
- var strTab = winform.listbox.getItemText(selindex);
- var tabStr = eval(strTab)
- var path = io.splitpath(tabStr.filePath);
- process.execute(path.dir);
- return ;
- }
- }
- }
- }
- winform.button.oncommand = function(id,event){
- var sstab = {};
- table.assign(sstab,{ iImage = 0; text = "增加示例行"; size = "7.7 MB" });
- winform.listbox.add(table.tostring(sstab))
- }
- var files,,dirs = ..fsys.list(dirPath);
- for(i=1;#files){
- filename = files[ i ];
- var sfi = fsys.info.get(files[filename],0x10/*_SHGFI_USEFILEATTRIBUTES*/ | 0x4000/*_SHGFI_SYSICONINDEX*/ );
-
- var file = fsys.file(files[filename]);
- if(!file){
- continue;
- }
-
- var fileSize = file.size64().format();
- table.assign(boxTab,{ iImage = sfi.iIcon; text = filename; size = fileSize ; filePath = files[filename] });
- winform.listbox.add(table.tostring(boxTab))
- }
- winform.show();
- win.loopMessage();
复制代码 |
|