plus模拟美化和替换listview的滚动条

By admin at 2020-04-09 • 1人收藏 • 1551人看过

这个是针对listview的滚动条的。 上次是针对listbox来的,不要搞混了。

listview和listbox不一样的地方在于它有header头,而且编写过程中发现,listview即使项目已经移动到了底部,此时仍然发送sendmessage下移消息它仍然会继续下移, 所以,这个代码比listbox要多一个判断:是不是已经显示了所有的项

GIF.gif

方便起见我没有改这个listview滚动条自绘库的名称, 需要的可以自己修改

plusExbar.aardio 库代码如下:

//plusExbar 模拟滚动条
class plusExbar{
    //绑定的listbox,与之绑定的plus,listbox每项的行高,前景色,背景色
    ctor( listview,plus,iheight,foreColor=0xFF0097DE,backColor=0x757A7A7A ){
        plus.skin({
            background={
                default=backColor
            };
            color={
                default=foreColor;
            }
        })
        //listview有可能有header,那么需要先减去header的高度
        var headerH = listview.getHeader();
    	x,y,cx,cy = ..win.getPos(headerH);
        var max = listview.count-..math.floor((listview.height-cy)/iheight);
        var min = 1;
        plus.setTrackbarRange(max,1);
         
        if(max>0){
                //锁定最小滑块大小20
            if(..math.round(plus.height/max)<=20){
                plus.foreTop = 20;
                var max = listview.count-..math.floor((listview.height-cy-20)/iheight);
            }else{
                plus.foreTop = ..math.round(plus.height/max);
            }   
        }else {
            plus.foreTop = plus.height;
        }
        plus.progressPos = max;
         
        listview.scrollFunc = function( num ){
            plus.progressPos +=num; 
        }
        plus.onPosChanged = function( pos,thumbTrack ){
            if(thumbTrack){
                
                var goto = max-pos+1;
                var index = listview.hitTest(1,cy+1);
                if(index==null){
                	return;
                }
                if(goto == index){
                    //null
                }else {
                    if(goto>index){
                        for(i=1;goto-index;1){
                            ::SendMessageInt(listview.hwnd, 0x115/*_WM_VSCROLL*/, 1, 0); 
                        }   
                    }else {
                        for(i=1;index-goto;1){
                            ::SendMessageInt(listview.hwnd, 0x115/*_WM_VSCROLL*/, 0, 0);
                        }
                    }   
                }
                 
            }
        }
        plus.orphanWindow(true)
    };
}

如上介绍的, 使用的时候比listbox要多判断一句话:

使用示例如下:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=457;bottom=535)
winform.add(
button={cls="button";text="Button";left=72;top=465;right=204;bottom=517;z=3};
listview={cls="listview";left=49;top=26;right=400;bottom=422;edge=1;z=1};
plus={cls="plus";left=432;top=26;right=439;bottom=420;bgcolor=-8750470;border={radius=4};color=14587648;foreTop=33;paddingLeft=1;paddingRight=1;z=2}
)
/*}}*/

//移除列标题
//winform.listview.modifyStyle(,0x4000/*_LVS_NOCOLUMNHEADER*/)
//移除滚动条
winform.listview.modifyStyle(,0x2000/*_LVS_NOSCROLL*/)
winform.listview.insertColumn("列标题3",100) 
winform.listview.insertColumn("列标题2",100) 
winform.listview.insertColumn("列标题1",100) 
for(i=1;59;1){
winform.listview.addItem( { 
    text={i++"行内容";"1";"1,2"} 
} )    
 
}
 
winform.listview.wndproc = function(hwnd,message,wParam,lParam){
    if(message == 0x20A/*_WM_MOUSEWHEEL*/){  //滚轮消息
        var wheelDelta = ..raw.convert({int wParam=wParam },{word vk;word delta}).delta;
        if( wheelDelta > 0 ){
            ::SendMessageInt(winform.listview.hwnd, 0x115/*_WM_VSCROLL*/, 0, 0);
            if(winform.listview.scrollFunc){
                    winform.listview.scrollFunc(1);
            }
        }else {
           //判断最后一行是不是最后一行 
           var index = winform.listview.hitTest(1,winform.listview.height-1);
           	if(index==null or index>winform.listview.count){
           		return;
           	} 
           	::SendMessageInt(winform.listview.hwnd, 0x115/*_WM_VSCROLL*/, 1, 0);
            if(winform.listview.scrollFunc){
                    winform.listview.scrollFunc(-1);
            } 
        }
        return 0;
    };
}

import plusExbar;
plusExbar(winform.listview,winform.plus,20,0xFFE057B6);
 
 
winform.show();
win.loopMessage();
return winform;


1 个回复 | 最后更新于 2020-04-09
2020-04-09   #1

回复#1 @jacen :

刚刚把您的那个代码放到plusExbar库里面, 然后删除掉winform里面的listview回调,

运行一切ok!

按照这样写,确实简化好多代码,棒

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...