一个开源之库很是。

作者Blog:http://hi.csdn.net/space-157361.html

vckBase 页面:http://www.vckbase.com/document/viewdoc/?id=1849

源代码下载: http://www.codeproject.com/KB/GDI/SonicUI.aspx

为UI开发轻松而喜欢,用SonicUI引擎实现常见UI效果

作者:Sonic

下载源代码

摘要:作为windows工程师,UI开发是无可避免的干活,无论你是描写一个供销存系统,还是一款聊天IM,UI开发连接会占据你大量之流年。接下来展示
的拿是同一种植windows下之不可开交轻松便捷的UI开发解决方案,实现大家实在工作吃常用实现的UI特效,力争将您于犬牙交错的UI工作中解放出来,将注意
力投入到还发生挑战性的办事备受去。

一言九鼎字:UI引擎 异形窗体 动画按钮 gdi引擎 自绘控件 轻便

作为windows工程师,UI开发是无可避免的干活,无论你是摹写一个供销存系统,还是一款聊天IM,UI开发连接会占有你大量底时。前段时间在公司开
发色面临,带在小私实现了一个构想了较长时间的UI引擎,自曾在行使过程被感觉极大的加速了UI开发的频率,希望与大家大快朵颐,并为此大家之建议来不断竣工
善。

连片下将为几单以实际上工作面临普遍的UI开发问题啊例,介绍实现方式及功能,相信这几个问题能够引起客户端UI开发同仁的共鸣。
1.多格式图片支持
2.文及超链接
3.自绘按钮
4.脏处理同区域刷新
5.异形窗体(包括像素级透明异形窗体)

1.多格式图片支持
UI开发离不开图片,windows的api提供了片加载图片的方法,如常用的LoadImage,使用特别简短。但那功能也和该所以法平简单,只能加载
bmp,ico等几乎种格式。众所周知,bmp是未带来alpha通道的,一旦需要实现阴影等alpha渐变的职能,系统提供的api就发出头捉襟见肘了。当然
很多口会晤想到大名鼎鼎的CxImage,这为是单科学的选取。我于里面也是包了CxImage帮忙加载与封存多格式的图片,但加载后的图像数据处理还
是自从处理的了,因为CxImage在拍卖RGB转hsl,旋转等特效时大量利用了浮点运算,效率不能够如人头十分满意。我把拥有的浮点运算都转为整形运算,并
大量运用了SSE2指令展开优化,实测证明在转,HSL转换,灰化等特效时,效率可以增进4-10倍(CPU也T2330
1.6GHz)。图片加载支持三种植方式:从文本;从资源;从dc。需要证实的凡起资源加载时伸手以资源类型命名为IMAGE。
以身作则代码如下:

//GetSonicUI是引擎导出的唯一函数,是类厂和引擎总控,负责创建对象和销毁对象等。
ISonicImage * pImg = GetSonicUI()->CreateImage();
pImg->Load("C:\\1.png");
pImg->Draw(hdc, 10, 10);
GetSonicUI()->DestroyObject(pImg);

OK,一个带动透明通道的png图片绘制就完了了,是无是轻松惬意。

2.言与超链接
UI开发进程被时时最累的凡绘制文字,需要而无鸣金收兵的初始化字体,设定字体属性,如果产品人员要求文以一定的格式排版或输出彩色文字,那直就是我们的
噩梦了。而在自己之界面加入跳链接,网上就出无数示范代码了,但自身深信ISonicString是一个重复简短的实现方案。ISonicString是同等
个可以开展信息交互的UI组件对象。只需要像html语言一样在一些类似之控制符,你不怕可自由的支配字体的大小颜色,超链接等性能,非常便于。

ISonicString * pStr = GetSonicUI()->CreateString();
pStr->Format("/c=%x, a='http://hi.csdn.net/zskof', font, font_height=16/点我打开链接", #0000ff);

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 PAINTSTRUCT ps;
    HDC hdc;
   switch (message) 
  {
  case WM_PAINT:
     {
          hdc = BeginPaint(hWnd, &ps);
           pStr->TextOut(hdc, 0, 0, hWnd);
         EndPaint(hWnd, &ps);
       }
      break;
 }
  .
  .
  .
}

什么,只需要创造,然后如CString的Format一样格式化一个字符串,在WM_PAINT响应中输出即可,只需要三步,你虽拿走了扳平实践蓝色之效益
完整的超链接,是无是甚有益。通过控制字符,你还好设定下划线的体,鼠标形状,响应鼠标时变色等细节,具体参看ISonicUI.h中的诠释即可。
ISonicString也得以将亲笔与图表混合输出,或如图片带有超链接属性,需要因此’p’控制符指定一个ISonicImage的id:

ISonicImage * pImg = GetSonicUI()->CreateImage();
pImg->Load("C:\\1.png");
ISonicString * pStr = GetSonicUI()->CreateString();
pStr->Format("/c=%x/你好吗,朋友/p=%d, a='http://hi.csdn.net/zskof'/", #0000ff, pImg->GetObjectId());

诸如此类就是得像写网页一样在你的界面及拓展文字与图纸的混杂排版输出了。

3.自绘按钮
自绘按钮恐怕是UI编写中极其广泛也是重复度最高的行事,通常是继往开来自CButton然后ownerdraw出来。我之兑现是无下窗体的纯粹自绘。其实越链接也可知晓也按钮的一样种植,所以我自绘按钮的运用办法同超链接也差不多。

void WINAPI OnMove(ISonicString * pStr, LPVOID)
{
 g_pEffect->MoveGently(0, 0);
}

// 加载三态图片资源
ISonicImage * pImgNormal = GetSonicUI()->CreateImage();
pImgNormal->Load(BMP_NORMAL);
pImgNormal->SetColorKey(#ff00ff);

ISonicImage * pImgHover = GetSonicUI()->CreateImage();
pImgHover->Load(BMP_HOVER);
pImgHover->SetColorKey(#ff00ff);

ISonicImage * pImgClick = GetSonicUI()->CreateImage();
pImgClick->Load(BMP_CLICK);
pImgClick->SetColorKey(#ff00ff);

// ISonicString * g_pTest[10]
g_pTest[10]->Format("/a, p=%d, ph=%d, pc=%d, linkt='点我移动'/", pImgNormal->GetObjectId(), pImgHover->GetObjectId(), 
 pImgClick->GetObjectId());
g_pTest[10]->Delegate(DELEGATE_EVENT_CLICK, NULL, NULL, OnMove);

同一的,格式化好后底ISonicString在OnPaint的时段输出即可,这样你就算具备一个备三态变换的佳绩按钮,其中’p’关键字表示
normal态,’ph’代表hover态,’pc’代表click态。如果由画那里获得的源图是一样布置图三态平铺的也不要紧,只需要以ph,pc都指
向平等张img即可,内部会自动进行来源区域裁剪。另外用了QQ2009之人或会见意识,2009底不少按钮三态变换是潜移默化的,体验颇
好,ISonicString一样好开,只待格式化时不怎么小修改一下,

g_pTest[10]->Format("/a, p=%d, ph=%d, pc=%d, linkt='点我移动', animation=40/", pImgNormal->GetObjectId(), 
 pImgHover->GetObjectId(), pImgClick->GetObjectId());

增一个’animation=40’的控制符(40凡是慢慢变速度),就好赢得一个QQ2009均等美妙的三态渐变按钮了。按钮的点击响应是
用“委托”的法子,你要往按钮委托一个来得若void WINAPI Func(ISonicBase *,
LPVOID)的全局函数或看似的积极分子函数,以供应引擎在按钮被点击时回调。
图片 1
希冀一律:自绘按钮

4.脏处理及区域刷新
咱都懂得gdi的绘图效率是无高之,无法像DDraw直接操作显存buffer那么爽快,所以InvalidateRect才提供了片刷新的参数,而
局部刷新为是gdi下展开优化的关键所在。可在实际操作中,我弗经常看见有人做如此精细的切割,都是一个InvalidateRect(hwnd,
NULL,
TRUE)了事。这为难怪,我无TextOut一个字符串,我一旦要失去关心它占据了有点区域,区域之内的陆续裁剪等等,未免就最烦琐了。所以自己之引擎提
供了一个ISonicPaint对象,意如其名,就是一模一样片画布。创建这块画布时,你得指定其持有好的memDC,而鉴于节省gdi对象的设想,你吗不过
以指定其是一块无memDC的画布,如何挑选根据实际状况。
缔造一个画布

ISonicPaint * pPaint = GetSonicUI()->CreatePaint();
pPaint->Create(FALSE/*是否需要memDC*/, m_rtString.Width()/*宽*/, m_rtString.Height()/*高*/);

画布创建之后,只需要在WM_PAINT中调用画面的Draw方法即可,很粗略。
如果您想在这个画布上举行打,就需像自绘按钮一样,向画布委托一个你协调的绘图过程,以便在历次重绘时调用。示例代码如下:

class CTest
{
public:
   void RenderImage(ISonicPaint * pPaint, LPVOID);
};

void CTest::RenderImage(ISonicPaint * pPaint, LPVOID)
{
    if(pPaint->GetCurrentPaint() == NULL)
   {
      return;
    }
  HDC hdc = pPaint->GetCurrentPaint()->hdc;
    int x = pPaint->GetCurrentPaint()->x;
    int y = pPaint->GetCurrentPaint()->y;
    // draw here
   ...
}

CTest test;
pPaint->Delegate(DELEGATE_EVENT_PAINT, NULL, &test, CSonicString::RenderImage);

然每次只需要调用pPaint->Redraw()便会进展画布的区域重绘。这里用证实的凡,ISonicString,包括连接下要介绍的几乎单对象还是冲画布的,也就是说引擎的有所目标还是兼备脏处理检查以及区域自绘制优化的,可以极大的增长运行效率。
而外委托绘制以外,你还可以向画布上直接添加UI对象,画布支持之目标来:ISonicImage,
ISonicString, ISonicPaint

5.异形窗体(包括像素级透明异形窗体)
异形窗体也是UI特效中时常用以的技艺,常见的出点儿栽实现方式。一栽办法是根据图片裁剪出一个rgn,然后调用SetWindowRgn,另一个方式
是将窗体设为WS_EX_LAYERED属性,调用SetLayeredWindowAttributes或UpdateLayeredWindow实现
透明裁剪。前同一种方法效率比逊色,而且拖动窗体时会现出难看的残影,后一样种植艺术展现效果更好,拖动时得以免残影出现,但非可知图为WS_CHILD属性的
窗体。二者各发优劣。SonicUI同时提供了就半种植实现方式,可以依据事态择。
方法1:

...
// ISonicImage * pImg
SetWindowRgn(hWnd, pImg->CreateRgn());

方法2:

...
// ISonicImage * pImg
// ISonicWndEffect * pEffect
pEffect->Attach(hWnd, TRUE);    // 使用像素级alpha模式attach
pEffect->SetShapeByImage(pImg);

图片 2
贪图二:异形窗体效果图
值得一提的凡,如果运用UpdateLayeredWindow做窗体的比如素级alpha特效,文字输出就改成了一个难为,因为gdi的契输出函数是匪
带alpha通道的,直接TextOut上去无法正常表现。不过ISonicString可以扶持你解决当下同难题,我于中间已也文增加了alpha通
道,可以充分好之服背景。

结束语:引擎中还有滚动字幕组件,动画组件等常用之UI表现组件,限于篇幅虽不一一介绍了,请大家参考ISonicUI.h中之说明自己试用。设计是引
擎时的骨干原则就是是便捷,高效,如果大家在使用过程遭到出啊好之提议或需要,也邀请联系自己,帮助我到之引擎。因为引擎完整兑现代码有数万执行,而且现在
还属公司财产,就小未发表完全源码了,但对某些技术实现细节产生趣味的意中人,可以同我关系,共同学习发展。
QQ:20346020

E_mail:zs_kof@163.com 


其它UI软件

http://topic.csdn.net/u/20100306/00/ad4496f4-7d82-459b-b523-e18b42675580.html 

SkinSE(全称:skin so easy)

文档也颇咸。

 

SkinSB

http://topic.csdn.net/u/20100127/12/491a7a32-9231-4227-bc33-fb9a2f629457.html

http://www.skinse.com/update.html 

 

Codejock Xtreme Toolkit

VS 2008 Feature Pack

http://blog.csdn.net/barech/archive/2009/07/02/4315157.aspx 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图