一个开源的库很不利。

作者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开发是无可幸免的劳作,无论你是写1个供销存系统,依旧一款聊天IM,UI开发连接会占据你大批量的时日。接下来显示的将是一种windows下的分外轻松便捷的UI开发解决方案,完结我们实在工作中时常索要完毕的UI特效,力争将你从犬牙交错的UI工作中解放出来,将注意
力投入到更有挑衅性的办事中去。

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

用作windows工程师,UI开发是无可幸免的行事,无论你是写1个供销存系统,依然一款聊天IM,UI开发连接会占用你大批量的时日。前段时间在商店开
发项目中,带着有点私心完成了七个构想了较长期的UI引擎,自已在使用进度中感觉极大的加快了UI开发的频率,希望与大家享受,并用大家的指出来不断完
善。

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

1.多格式图片帮衬
UI开发离不开图片,windows的api提供了部分加载图片的格局,如常用的LoadImage,使用很简单。但其效能也跟其用法一样简单,只可以加载
bmp,ico等两种格式。人所共知,bmp是不带阿尔法通道的,一旦需求贯彻阴影等阿尔法渐变的效益,系统提供的api就有个别捉襟见肘了。当然
很三人会想到赫赫有名的CxImage,那也是个不利的精选。小编在中间也是包裹了CxImage支持加载和保留多格式的图样,但加载之后的图像数据处理都以自处理的了,因为CxImage在处理景逸SUVGB转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是3个可以展开消息交互的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一样格式化3个字符串,在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即可,内部会活动举行源区域裁剪。此外用过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)的全局函数或类的积极分子函数,以供引擎在按钮被点击时回调。
图片 1
图一:自绘按钮

4.脏处理与区域刷新
作者们都精晓gdi的绘图效用是不高的,不能像DDraw直接操作显存buffer那么爽快,所以InvalidateRect才提供了部分刷新的参数,而
局地刷新也是gdi下开展优化的关键所在。可在实际操作中,小编不常看见有人做这样精致的切割,都以3个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,然后调用SetWindow瑞虎gn,另3个主意
是将窗体设为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做窗体的像素级阿尔法特效,文字输出就变成了三个难为,因为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 

 

 

发表评论

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

网站地图xml地图