转载请说明出处,谢谢~~html
我在仿酷狗音乐播放器的开发日志系列里,曾经提到了这个bug,文章地址为:http://blog.csdn.net/zhuhongshu/article/details/38145365。可是当时的开发日志里,我对bug的描述过于简单。因此从新说明一下。git
使用Duilib时,当为一个控件指定了float属性,也就是使用了绝对布局,那个控件的位置和大小就固定了。同时Duilib提供了另外一个属性:relativepos。这个属性在官方的属性列表里面没有给出,我这里补充一下:github
<Attribute name="relativepos" default="0,0,0,0" type="RECT" comment="设置相对移动,float为真时,分别表示横纵向位移值,横纵向缩放值,移动单位建议50或100"/>
这原本是个很是棒的属性。可是我使用后发现了bug。当控件开启了这个属性,咱们最小化窗体而后再最大化后控件的莫名其妙的位移了!我调试了好几个小时,最后发现问题出在UIManager.cpp的MessageHandler函数WM_PAINT消息处理上,窗体最小化和最大化时都会获取客户区的大小并传给子控件使其位移,可是最小化时获取的窗体大小是错误的,因此致使了relativepos位置错乱。函数
解决方法是,在处理WM_PAINT消息时先用IsIconic函数判断此时窗体是否最小化,只有非最小化时才调整子控件位置。
原代码以下:布局
if( m_pRoot->IsUpdateNeeded() ) { m_pRoot->SetPos(rcClient); if( m_hDcBackground != NULL ) ::DeleteDC(m_hDcBackground); if( m_hbmpBackground != NULL ) ::DeleteObject(m_hbmpBackground); m_hDcBackground = NULL; m_hbmpBackground = NULL; m_pBmpBackgroundBits = NULL; }
if( m_pRoot->IsUpdateNeeded() ) { if( !::IsIconic(m_hWndPaint)) //redrain修复bug m_pRoot->SetPos(rcClient); if( m_hDcBackground != NULL ) ::DeleteDC(m_hDcBackground); if( m_hbmpBackground != NULL ) ::DeleteObject(m_hbmpBackground); m_hDcBackground = NULL; m_hbmpBackground = NULL; m_pBmpBackgroundBits = NULL; }
这是我本身使用的Duilib和Uilib库,修复了我在博客中说明的全部bug以及不少尚未去说明的bug,一样也包含别人修复过的bug。库里面包含我扩展过的部分控件。以及添加了Duilib扩展群群主heat的透明异形窗体功能的支持。
这个库是我用vs2010修改的。若是你没法正常打开个人库或者编译有问题,那么建议把你须要的.h或者.cpp文件替换你本身的duilib库对应的文件。
我修改过的代码,通常能够经过搜索“redrain”找到对应的位置和修改时间
此库是我我的使用,因为我水平所限,因此不保证我修改的代码的质量。请你看过代码后再决定是否使用。使用这个库出现问题,不承担任何责任。ui
Redrain 2014.10.30spa