MFC SonicUI免费皮肤引擎

贰个开源的库很正确。

作者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开发是无可幸免的劳作,无论你是写3个供销存系统,依然一款聊天IM,UI开发连接会占有你多量的岁月。接下来浮现的将是一种windows下的百般轻松便捷的UI开发化解方案,落成我们其实工作中平时须要贯彻的UI特效,力争将您从犬牙相制的UI工作中解放出来,将注意
力投入到更有挑战性的做事中去。

主要字:UI引擎 异形窗体 动画按钮 gdi引擎 自绘控件 轻便

用作windows工程师,UI开发是无可防止的工作,无论你是写1个供销存系统,依然一款聊天IM,UI开发连接会占有你大量的小运。前段时间在商店开
发项目中,带着些许私心已毕了3个构想了较短时间的UI引擎,自已在利用进度中觉得极大的加快了UI开发的成效,希望与我们分享,并用大家的指出来持续完
善。

接下去将以多少个在实际上工作中常见的UI开发难点为例,介绍达成格局及效果,相信那多少个难点能唤起客户端UI开发同仁的共鸣。
1.多格式图片帮衬
2.文字和超链接
3.自绘按钮
4.脏处理与区域刷新
5.异形窗体(包含像素级透明异形窗体)

1.多格式图片协助
UI开发离不开图片,windows的api提供了有些加载图片的方法,如常用的LoadImage,使用很粗略。但其听从也跟其用法一样不难,只可以加载
bmp,ico等三种格式。遐迩闻名,bmp是不带阿尔法通道的,一旦必要贯彻阴影等阿尔法渐变的效果,系统提供的api就有个别捉襟见肘了。当然
很多少人会想到门到户说的CxImage,那也是个正确的抉择。小编在其中也是包装了CxImage帮助加载和封存多格式的图样,但加载之后的图像数据处理都以自处理的了,因为CxImage在拍卖PAJEROGB转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_2018正版葡京赌侠诗,PAINT响应中输出即可,只必要三步,你就取得了一行土红的效率完整的超链接,是否很便宜。通过控制字符,你还足以设定下划线的体制,鼠标形状,响应鼠标时变色等细节,具体参看ISonicUI.h中的注释即可。
ISonicString也得以将文字和图表混合输出,或使图片带有超链接属性,须要用’p’控制符钦赐2个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即可,内部会自动举行源区域裁剪。此外用过QQ2010的人可能会意识,二零零六的不在少数按钮三态变换是潜移默化的,体验很
好,ISonicString一样可以做,只必要格式化时稍稍修改一下,

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

充实三个’animation=40’的控制符(40是渐变速度),就足以博得贰个QQ二〇一〇相同可以的三态渐变按钮了。按钮的点击响应是
用“委托”的方法,你须要向按钮委托二个形如void WINAPI Func(ISonicBase *,
LPVOID)的全局函数或类的分子函数,以供引擎在按钮被点击时回调。
2018正版葡京赌侠诗 1
图一:自绘按钮

4.脏处理与区域刷新
我们都了然gdi的绘图成效是不高的,不可以像DDraw直接操作显存buffer那么爽快,所以InvalidateRect才提供了有的刷新的参数,而
局地刷新也是gdi下开展优化的关键所在。可在实际操作中,作者不常看见有人做这么精细的切割,都以1个InvalidateRect(hwnd,
NULL,
TRUE)了事。那也难怪,小编不管TextOut贰个字符串,小编只要要去关怀它占据了略微区域,区域之内的交叉裁剪等等,未免就太繁琐了。所以小编的发动机提
供了2个ISonicPaint对象,意如其名,就是一块画布。创立那块画布时,你可以钦命其抱有和谐的memDC,而鉴于节省gdi对象的考虑,你也可以钦点其是一块无memDC的画布,怎么着挑选依据实际景况。
制造3个画布

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,然后调用SetWindow本田CR-Vgn,另贰个方法
是将窗体设为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);

2018正版葡京赌侠诗 2
图二:异形窗体效果图
值得一提的是,借使接纳UpdateLayeredWindow做窗体的像素级阿尔法特效,文字输出就成为了贰个劳神,因为gdi的文字输出函数是不
带阿尔法通道的,直接TextOut上去不可以平常表现。可是ISonicString可以帮您消除这一难点,小编在里头已经为文字增添了阿尔法通
道,可以很好的适应背景。

结语:引擎中还有滚动字幕组件,动画组件等常用的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 

 

 

相关文章