soui

为GDI函数增加透明度处理

点点圈 提交于 2020-08-04 20:05:34
用户对客户端的UI的要求越来越高,采用alpha通道对前景背景做混合是提高UI质量的重要手段。 UI开发离不开GDI,然后要用传统的GDI函数来处理alpha通道通常是一个恶梦:虽然有AlphaBlend这个API可以做alpha混合,但是前提必须是操作的DC中的位图有alpha通道的数据,问题的关键在于GDI函数在操作的地方会把原来的alpha通道清空。 使用GDI做alpha混合还要增加透明度关键要解决2个问题: 1、需要把内容画到一个临时位图上,同时保护好alpha通道。 2、在于把临时位图的数据和原位图做混合,而且不能改变镂空部分原位图的alpha通道的值。 在SOUI的render-gdi中我采用下面的类来实现GDI的半透明。 class DCBuffer { public : DCBuffer(HDC hdc,LPCRECT pRect,BYTE byAlpha,BOOL bCopyBits = TRUE) :m_hdc(hdc) ,m_byAlpha(byAlpha) ,m_pRc(pRect) ,m_bCopyBits(bCopyBits) { m_nWid = pRect->right-pRect-> left; m_nHei = pRect->bottom-pRect-> top; m_hBmp = SBitmap_GDI::CreateGDIBitmap(m

在SOUI中使用网格布局

拈花ヽ惹草 提交于 2019-12-24 18:08:20
在实现网格布局前,SOUI支持两种布局形式:相对布局,和线性布局,其中线性布局是2017年2月份才支持的布局。 这两年工作都在Android这里,Android里有号称5大布局(RelativeLayout, LinearLayout, FrameLayout, GridLayout,TableLayout)。 FrameLayout很简单,在SOUI里一般用TabCtrl就实现了。RelativeLayout和SOUI自己的相对布局功能类似,线性布局也有了,但是一直没有实现GridLayout(TableLayout和GridLayout类似)。 之所以没有做GridLayout,主要是觉得组合SOUI现有的布局功能可以模拟出GridLayout的效果,哲学说:如无必要,勿增实体。 前几天群里有人问做一个行列对齐的布局在SOUI里要怎么实现。我回答说用线性布局去组合。 后来认真想了想,虽然线性布局组合可以勉强达到效果,但是布局写起来还是会很难看,这时候我才感觉到了实现一个GridLayout的必要性。 好在SOUI的布局系统经过前一段时间的重构已经能够很容易的扩展,要实现一个GridLayout也不是什么困难的事。 经过近一周的打磨,SOUI版的GridLayout已经通过了主要的测试,至少能够满足我的布局要求了。 下面我们先看看效果,再看在SOUI里要如何使用。