duilib relativepos属性导致控件错误的bug修复

简介: 转载请说明出处,谢谢~~         我在仿酷狗音乐播放器的开发日志系列里,曾经提到了这个bug,文章地址为:http://blog.csdn.net/zhuhongshu/article/details/38145365。

转载请说明出处,谢谢~~

        我在仿酷狗音乐播放器的开发日志系列里,曾经提到了这个bug,文章地址为:http://blog.csdn.net/zhuhongshu/article/details/38145365。但是当时的开发日志里,我对bug的描述过于简单。所以重新说明一下。

       使用Duilib时,当为一个控件指定了float属性,也就是使用了绝对布局,那个控件的位置和大小就固定了。同时Duilib提供了另一个属性:relativepos。这个属性在官方的属性列表里面没有给出,我这里补充一下:

<Attribute name="relativepos" default="0,0,0,0" type="RECT" comment="设置相对移动,float为真时,分别表示横纵向位移值,横纵向缩放值,移动单位建议50或100"/>

      这个属性只有在控件开启float属性后才能使用,为的就是改变控件的位置和大小。虽然我不喜欢绝对布局,但是当需要让控件重叠时就只能用绝对布局。使用了他,当父容器的大小改变了,开启这个属性的控件就会自动改变位置和大小,改变的幅度由属性的具体数值决定。

     这本来是个非常棒的属性。但是我使用后发现了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库都上传到了GitHub,完整的Duilib库代码下载地址: 点击打开链接

      这是我自己使用的Duilib和Uilib库,修复了我在博客中说明的所有bug以及很多还没有去说明的bug,同样也包含别人修复过的bug。库里面包含我扩展过的部分控件。以及添加了Duilib扩展群群主heat的透明异形窗体功能的支持。
     这个库是我用vs2010修改的。如果你无法正常打开我的库或者编译有问题,那么建议把你需要的.h或者.cpp文件替换你自己的duilib库对应的文件。
     我修改过的代码,一般可以通过搜索“redrain”找到对应的位置和修改时间
     此库是我个人使用,由于我水平所限,所以不保证我修改的代码的质量。请你看过代码后再决定是否使用。使用这个库出现问题,不承担任何责任。


  Redrain  2014.10.30

目录
相关文章
|
XML 开发框架 .NET
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
144 0
【牛刀小试】——Repeater控件常见错误及几种相似控件的区别
|
测试技术 定位技术 C++
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
MFC怎么用代码改变CComboBox的下拉方式?
MFC怎么用代码改变CComboBox的下拉方式?
137 0
|
C# 前端开发
WPF Adorner+附加属性 实现控件友好提示
原文:WPF Adorner+附加属性 实现控件友好提示 标题太空泛,直接上图   无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成。
949 0
|
JavaScript 前端开发 C++
COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
声明:本文代码基于CodeProject的文章《A Complete ActiveX Web Control Tutorial》修改而来,因此同样遵循Code Project Open License (CPOL)。
841 0
|
Android开发 算法 前端开发
Android开发技巧——自定义控件之增加状态
Android开发技巧——自定义控件之增加状态 题外话 这篇本该是上周四或上周五写的,无奈太久没写博客,前几段把我的兴头都用完了,就一拖再拖,直到今天。不想把这篇拖到下个月,所以还是先硬着头皮写了。
1150 0
|
容器
duilib 修复 容器控件 rightbordersize和bottombordersize属性显示错误的bug
转载请说明出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/45560943         DuiLib的容器控件可以用bordersize统一指定边框宽度,也可以用rightbordersize、bottombordersize等属性单独指定某一个边框的宽度。
1201 0