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开发是无可幸免的做事,无论你是写二个供销存系统,依旧一款聊天IM,UI开发连接会占用你大量的岁月。接下来突显的将是一种windows下的要命轻松便捷的UI开发消除方案,落成大家其实工作中时常索要完成的UI特效,力争将您从叶影参差的UI工作中解放出来,将注意
力投入到更有挑战性的劳作中去。

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

作为windows工程师,UI开发是无可幸免的干活,无论你是写三个供销存系统,如故一款聊天IM,UI开发连接会占用你大批量的时日。前段时间在公司开
发项目中,带着稍加私心完毕了2个构想了较长期的UI引擎,自已在采用进程中感到极大的加快了UI开发的功能,希望与大家大快朵颐,并用我们的提出来持续完
善。

接下去将以多少个在实质上工作中普遍的UI开发难题为例,介绍已毕格局及功能,相信那些难题能引起客户端UI开发同仁的共鸣。
1.多格式图片辅助
2.文字和超链接
3.自绘按钮
4.脏处理与区域刷新
5.异形窗体(包罗像素级透明异形窗体)

1.多格式图片支持
UI开发离不开图片,windows的api提供了一部分加载图片的方法,如常用的LoadImage,使用很简单。但其作用也跟其用法一样简单,只好加载
bmp,ico等两种格式。举世闻名,bmp是不带阿尔法通道的,一旦必要贯彻阴影等阿尔法渐变的效益,系统提供的api就有些捉襟见肘了。当然
很几人会想到远近驰名的CxImage,这也是个不利的取舍。小编在中间也是包裹了CxImage援助加载和封存多格式的图样,但加载之后的图像数据处理都是自处理的了,因为CxImage在处理WranglerGB转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’控制符指定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即可,内部会自动举办源区域裁剪。其它用过QQ二〇〇九的人唯恐会意识,贰零壹零的不乏先例按钮三态变换是潜移默化的,体验很
好,ISonicString一样可以做,只须求格式化时稍稍修改一下,

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

日增2个’animation=40’的控制符(40是渐变速度),就足以得到二个QQ二零零六平等优质的三态渐变按钮了。按钮的点击响应是
用“委托”的法子,你必要向按钮委托二个形如void WINAPI Func(ISonicBase *,
LPVOID)的全局函数或类的成员函数,以供引擎在按钮被点击时回调。
2018正版葡京赌侠诗 1
2018正版葡京赌侠诗,图一:自绘按钮

4.脏处理与区域刷新
作者们都通晓gdi的绘图效能是不高的,不能像DDraw直接操作显存buffer那么爽快,所以InvalidateRect才提供了一部分刷新的参数,而
局地刷新也是gdi下展开优化的关键所在。可在实际操作中,我不常看见有人做那样精致的切割,都以壹个InvalidateRect(hwnd,
NULL,
TRUE)了事。那也难怪,小编不管TextOut二个字符串,作者若是要去关怀它占据了有点区域,区域之间的陆续裁剪等等,未免就太烦琐了。所以作者的发动机提
供了三个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特效中平日索要运用的技巧,常见的有三种完毕格局。一种格局是基于图片裁剪出2个rgn,然后调用SetWindow卡宴gn,另1个办法
是将窗体设为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做窗体的像素级阿尔法特效,文字输出就改成了3个烦劳,因为gdi的文字输出函数是不
带阿尔法通道的,直接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 

 

 

发表评论

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