plus模拟美化和替换listview的滚动条
By
admin
at 2020-04-09 • 1人收藏 • 1710人看过
这个是针对listview的滚动条的。 上次是针对listbox来的,不要搞混了。
listview和listbox不一样的地方在于它有header头,而且编写过程中发现,listview即使项目已经移动到了底部,此时仍然发送sendmessage下移消息它仍然会继续下移, 所以,这个代码比listbox要多一个判断:是不是已经显示了所有的项

方便起见我没有改这个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
登录后方可回帖
回复#1 @jacen :
刚刚把您的那个代码放到plusExbar库里面, 然后删除掉winform里面的listview回调,
运行一切ok!
按照这样写,确实简化好多代码,棒