duilib进阶教程 -- 改进List控件_优化支持多选拉伸 (2)
来源:互联网 发布:淘宝太坑图片 编辑:程序博客网 时间:2024/06/07 19:30
上篇博客写完,以为改进List达到了项目要求,可后来发现诱发了其他的问题,如滚动条部分功能失效,还有程序在运行一段时间后进入了无响应状态。
后来在以下三个方向进行了探索:
1 主要改进还是在DrawItemText 函数中,试图解决由此引起的Bug
结果:不能解决掉,但证明duilib是可以实现的,只是思路和方法还没有找对。
DrawItemText 本来的作用是重绘Text文本,在这里调用setpos,会引起其父控件重绘,父控件重绘又会调用DoPaint,有循环调用,程序很容易崩掉。思路不对。
2 重写DoPaint函数
结果:只能对其一级子控件进行背景,文本的重绘,没有诱发其他Bug ,但很难实现一级子控件及它的子控件一起重绘。
思路: 由于CListContainerElementUI继承于CContainerUI,原来只是在最后调用了父类的DoPaint,根据CContainerUI::DoPaint(hDC, rcPaint);源码进行修改,每列的宽度可以得到,所以子控件的可以根据头部的宽度重绘。
3 重写SetPos函数
结果:这次终于完美解决,上张图,呵呵!
思路:以前两种方案,仍旧掉在CListTextElementUI实现思路的坑里。整理思路CListContainerElementUI中的每一列可以是一个简单控件,也可以是一个容器控件,所以只是在DoPaint里做文章,无法满足要求。SetPos既然可以实现容器控件的位置,宽高的改变,那为什么不重写SetPos呢,拿来CContainerUI的SetPos,进行重写。
上代码
void CListContainerElementUI::SetPos(RECT rc)
{
if( m_pOwner == NULL ) return;
TListInfoUI* pInfo = m_pOwner->GetListInfo();
int iChangeIndex=0;
LONG cx = 0;
for( int i = 0; i < pInfo->nColumns; i++ )
{
CControlUI* pControl = GetItemAt(i);
if(!pControl) break;
RECT rcOldItem = pControl->GetPos();
if(pInfo->rcColumn[i].right-rcOldItem.right!=0){
iChangeIndex =i;
cx=pInfo->rcColumn[i].right-rcOldItem.right;
break;
}
}
RECT rcNew = {rc.left,rc.top,rc.right+cx,rc.bottom};
CControlUI::SetPos(rcNew);
if( m_items.IsEmpty() ) return;
rcNew.left += m_rcInset.left;
rcNew.top += m_rcInset.top;
rcNew.right -= m_rcInset.right;
rcNew.bottom -= m_rcInset.bottom;
for( int it = 0; it < m_items.GetSize(); it++ ) {
CControlUI* pControl = static_cast<CControlUI*>(m_items[it]);
if( !pControl->IsVisible() ) continue;
if( pControl->IsFloat() ) {
if(it>=iChangeIndex){
RECT rcItem = { pInfo->rcColumn[it].left, m_rcItem.top, pInfo->rcColumn[it].right, m_rcItem.bottom };
pControl->SetPos(rcItem);
}
}
else {
pControl->SetPos(rcNew); // 所有非float子控件放大到整个客户区
}
}
}
总结:这么点功能,折腾了好几日,修改的代码并不多,究其原因:1、对Duilib的源码没理解透,原来只是那控件来用,这次是扩展控件 2、思路没有发散出去。不过通过这几天的折腾,对好多东西又有了深刻的认识。
欢迎指点,等有时间把Demo上传到csdn上。
- duilib进阶教程 -- 改进List控件_优化支持多选拉伸 (2)
- duilib进阶教程 -- 改进List控件_优化支持多选拉伸 (2)
- duilib进阶教程 -- 改进List控件(3)_支持多选+右键菜单(ctrl,shift, 鼠标滑动框选)
- duilib进阶教程 -- 改进List控件(3)_支持多选+右键菜单(ctrl,shift, 鼠标滑动框选)
- duilib进阶教程 -- 改进List控件 (1)
- duilib进阶教程 -- 改进List控件 (16)
- duilib进阶教程 -- 改进List控件 (1)
- duilib进阶教程 -- 改进窗口拖动 (12)
- duilib进阶教程 改进窗口的拖动
- duilib进阶教程 -- 实现List排序
- duilib进阶教程 -- 实现List排序
- duilib进阶教程 -- 实现List排序
- duilib进阶教程 -- TreeView控件(6)
- duilib进阶教程 -- Container控件 (3)
- duilib进阶教程 -- 在duilib中使用MFC (2)
- duilib进阶教程 -- Container控件的bug (14)
- duilib进阶教程 -- 各种控件的响应 (10)
- duilib进阶教程 -- TreeView控件的bug (9)
- TreeView控件发布到服务器时折叠按钮无效,显示为叉X
- OpWeb——mongodbsync 之 p2p移植
- 降火,胃火,肝火等
- 嗟夫!范文正公,真豁出生命之意义也
- 用Android NDK编译FFmpeg
- duilib进阶教程 -- 改进List控件_优化支持多选拉伸 (2)
- Linux中的虚拟化
- 【WPF】The example of progress bar, label status changed by background worker
- DataTable如何删除特定行
- 37wan《魔龙诀》首创套装收集 新年战力新飙升
- webservice之rmi
- mysql中having和where的区别
- java普通类在任意位置得到spring 中的bean
- [转]Linux内核的文件预读(readahead)